SurvivalShooter学习笔记(四.敌人攻击)

此案例中,敌人始终朝着玩家移动

到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成))

隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血,直至死亡。

变量:

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);
            }
        }





原文地址:https://www.cnblogs.com/caymanlu/p/6361688.html