通常我们玩GTA系列,暗黑血统系列,虐杀原形等电脑打斗游戏时,都是主角跟着鼠标转向来攻击的。
这意味着要我们自己去寻找目标。
但是移动设备不像laptop或者座机那样操作方便,
所以最近目标攻击在移动设备是很常用的。
下面给出攻击最近目标的主要代码和部分解释:
public float attackRange = 30;
public float attackDistance = 1;
float distance=0;
public void AttackA()
{
GameObject enemy = null;
distance = attackDistance;
foreach (GameObject go in SpawnManager._instance.enemyList)//在所有敌人列表里面选出距离最短的敌人
{
float temp = Vector3.Distance(go.transform.position, transform.position);
if (temp < distance)
{
enemy = go;
distance = temp;
}
}
if (enemy != null)//选出来了
{
Vector3 targetPos = enemy.transform.position;
targetPos.y = transform.position.y;
transform.LookAt(targetPos);
enemy.GetComponent<ATKAndDamage>().TakeDamage(normalAttack);//该敌人受到攻击
}
}
至于连击,则在A攻击的动画上添加两处事件AttackBEvent1()和AttackBEvent2()这样做的意思这些添加的事件一定会随着动画播放被调用,你在AttackBEvent1()函数调用之后AttackBEvent2()函数调用之前再次点击就可以出发连击了。
然后再在脚本里面写上
public void AttackBEvent1()
{
isCanAttackB = true;
}
public void AttackBEvent2()
{
isCanAttackB = false;
}
下面这个函数是一个按钮注册监听的函数,在里面实现连击的出发。"AttackB"是在动画控制器里面的trigger参数,控制B攻击的触发。
public void OnNormalAttackClick()
{
if (animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackA") && isCanAttackB)
{
animator.SetTrigger("AttackB");
}
else
{
animator.SetTrigger("AttackA");
}
}
public void AttackRange()
{
List<GameObject> enemyList = new List<GameObject>();
foreach (GameObject go in SpawnManager._instance.enemyList)
{
float temp = Vector3.Distance(go.transform.position, transform.position);
if (temp < attackDistance)
{
enemyList.Add(go);
}
}
foreach (GameObject go in enemyList)
{
go.GetComponent<ATKAndDamage>().TakeDamage(attackRange);
}
}
这里要注意的一个地方就是范围攻击是先加到集合然后再在遍历集合的时候挨个收到伤害。这样做的原因是如果直接不加到集合而是符合条件的挨个受伤害,则在遍历过程中,有些敌人受到伤害会死亡,然后触发Destroy方法销毁敌人物体同时将其在enemyList中删去,但是enemyList仍然在遍历,但是元素个数却变了,这会导致遍历出错,然后Unity报错。