在上篇敌人AI:行走的基础上,本篇博文实现敌人攻击主角。下图的敌人的Inspector面板展示了敌人身上挂的东西。
using UnityEngine;
using System.Collections;
public class Enemy : MonoBehaviour {
public int hp = 200;// 敌人默认的血量
public float speed = 2f;// 敌人行走的速度
private CharacterController cc; // 定义控制敌人行走的CharacterController组件
// **********控制敌人攻击的变量********************************
public float attackRate = 2; // 攻击速率,2s攻击一次
private float attackDistance = 2; // 敌人发生攻击需要的距离
private float distance = 0; // 敌人和主角的距离
private float attackTimer = 0;
void Start(){
cc = this.GetComponent<CharacterController> ();// 得到CharacterController组件
// 通过协同来计算距离,以优化在Update中逐帧调用CalcDistance而消耗的性能
InvokeRepeating("CalcDistance", 0, 0.1f);
}
void Update(){
if (hp <= 0)
return;
if (distance < attackDistance) {// true==>敌人攻击
attackTimer += Time.deltaTime;
if (attackTimer > attackRate) {
// 攻击之前面向主角
// 本代码中获取主角调用多次,可以在Start反方中进行初始化以进行优化,这里仅供学习用,方便清楚代码整个框架(逻辑)
Transform player = TranscriptManager._instance.player.transform;
Vector3 targerPos = player.position;
targerPos.y = transform.position.y;
transform.LookAt(targerPos);
// **************************************
GetComponent<Animation>().Play("attack01");// 其中attack01为敌人攻击的动画
attackTimer = 0;
}
if (!GetComponent<Animation> ().IsPlaying ("attack01")) {
GetComponent<Animation> ().CrossFade ("idle");
}
} else {
GetComponent<Animation> ().Play ("walk");// 播放行走的动画
Move ();// 在Update方法中,每一帧调用Move方法
}
}
// *******************计算距离***********************************************
void CalcDistance(){
Transform player = TranscriptManager._instance.player.transform;
distance = Vector3.Distance (player.position, this.transform.position);
}
// *********************** 控制敌人AI行走的方法 *********************************
void Move(){
// 需求分析:要实现敌人总是朝着游戏主角行走
// 1. 首先获取主角相关组件
// 主角的Transform组件
Transform player = TranscriptManager._instance.player.transform;// 获取主角由TranscriptManager类管理
Vector3 targerPos = player.position;
targerPos.y = transform.position.y;// 敌人的y和主角的y一致
// 2. 面向主角
transform.LookAt(targerPos); // this/*敌人*/.transform.LookAt(targetPos)
// 3. 敌人移动
cc.SimpleMove (transform.forward * speed);
}
}