通常我們玩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報錯。