此案例中,敌人始终朝着玩家移动
到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成))
隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血,直至死亡。
变量:
public float timeBetweenAttacks = 0.5f; // 攻击的间隔 public int attackDamage = 10; // 攻击的伤害值
bool playerInRange; // 玩家是否在敌人攻击范围内 float timer; // 计时器,到下次攻击的计时组件:
Animator anim; // 敌人身上动画状态机 GameObject player; // 玩家 PlayerHealth playerHealth; // 玩家生命脚本 EnemyHealth enemyHealth; // 敌人生命脚本
获取组件:
void Awake () { player = GameObject.FindGameObjectWithTag ("Player"); playerHealth = player.GetComponent <PlayerHealth> (); enemyHealth = GetComponent<EnemyHealth>(); anim = GetComponent <Animator> (); }
进入触发器:(触发器自带函数)
void OnTriggerEnter (Collider other) { // 如果是玩家,则表示玩家在敌人攻击范围的变量变为True if(other.gameObject == player) { playerInRange = true; } }离开触发器:(触发器自带函数)
void OnTriggerExit (Collider other) { // 如果是玩家,则表示玩家离开敌人攻击范围的变量变为False if(other.gameObject == player) { playerInRange = false; } }在Update中,判断打击玩家的各项条件是否满足,满足则打击玩家
void Update () { //从上一次打击完玩家后开始计时;时间到达打击间隔后,开始下一次打击 timer += Time.deltaTime; // 各项条件:“打击冷却了”,“玩家在攻击范围”,“敌人活着” if(timer >= timeBetweenAttacks && playerInRange && enemyHealth.currentHealth > 0) { Attack (); } //玩家已死,敌人切换状态机到待机 if(playerHealth.currentHealth <= 0) { anim.SetTrigger ("PlayerDead"); } }此动画参数类型为:Trigger类型
攻击函数:
void Attack () { //攻击完重新开始计时冷却 timer = 0f; // 玩家还活着,给予伤害 if(playerHealth.currentHealth > 0) { playerHealth.TakeDamage (attackDamage); } }