加个目标类型的枚举好理解一些
加个目标类型的枚举好理解一些
敌人攻击掉血方法:
1、看向目标
2、如果敌人血量下降少于0,则调用角色死亡方法
1、默认持续生成新的敌人:在Start中调用InvokeRepeating方法
2、在Update中检查敌人数量是否达到上限:
如果isSpawning为true,且敌人数量达到上限,达到则CancelInvoke(); 并将isSpawning= false;
随机生成敌人,并赋值位置
生成特效并生成位置
1、攻击方法优化:目标移动追赶判定,意思是攻击过程中目标位置可能再次移动超出角色攻击范围,需要停止攻击并重启导航方法
如果攻击目标不为建筑,判断currentTarget是否为空。如果不为空,则将目标位置设置为当前目标位置。
- 如果目标位置和角色位置距离大于攻击距离,重启导航系统,meshAgent. isStopped = false,停止攻击动画。
如果目标超出跟踪范围(约为攻击范围2倍),则目标丢失,重置状态ResetState
- 如果在攻击范围内,持续攻击
1、补充寻找目标的方法
如果目标不是角色,也不是塔,则默认设置目标为塔。
如果目标不是角色,但是是塔,则同时搜索附近的角色,如果有则将目标更新为角色
如果目标是角色:
判断目标是否为空(安全校验),如果不为空,将目标赋值为Target位置。
如果目标不存在,否则判定目标已死,重置状态。
1、搜索敌人方法
在GameManager中创建所有敌人的列表List<Character> playerCharacters和List<Enemy> enemyCharacters的列表
GameManager中创建Character时,同时将角色添加到列表:
playerCharacters.Add(go.GetComponent<Character>());
遍历角色,看是否在攻击范围之内
Vector3.Distance()
1、测试移动和攻击塔功能是否正常
2、攻击方法实现:
GameManager.Instance.DecreasePlayerHP(damage);
1、移动状态和攻击状态切换
距离判断:Vector3.Distance(transform.position, target.transition.position)
停止移动导航:meshNav.enabled = false
状态切换:Animator.SetBool("Attacking",true)
2、Target 切换
如果角色是敌人,则默认目标是玩家的塔
如果角色是玩家,则默认目标是敌人的塔
1、把角色的自动寻路组件设置为默认不开启。当角色生成并设置到正确的位置后再启用
在OnEnable方法中调用Invoke(NavMesh.Enabled,0.001f)
1、给Ground添加AI-navimesh组件,选择Agent height, 点击bake
2、调整角色高度,确保能应用到导航
1、给角色添加组件Ragdoll,把角色对应的子部位物体复制给Ragdoll对应部位
1、增加方框选中的显示:在角色脚下增加一个圆圈,命名为selected object
1、给Animator中的动画状态添加动画切换的bool值参数
2、给角色添加Player Tag
3、给角色增加一个MinimapIcon的sphere,放到角色物体的子物体
1、给角色添加Capsule Collider、Nav Mesh Agent组件
2、添加动画控制器Animator, 然后将Animator赋值给角色的Animation组件。
把running动画和Attacking动画模型拖入到animator界面,增加running和Attacking的动画状态切换。
Grid Layout Group和Content Size Fitter搭配使用可以自适应宽高