zoukankan      html  css  js  c++  java
  • 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);
                }
            }





  • 相关阅读:
    队列简单题
    排序篇(c++/c实现)
    天河计算机0.5
    BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
    BZOJ1391/LG4177 「CEOI2008」order 最大权闭合子图
    BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
    BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
    BZOJ2339/LG3214 「HNOI2011」 卡农 组合数学
    LG1840 Color the Axis 线段树
    LG5239 回望京都 组合数+暴力
  • 原文地址:https://www.cnblogs.com/caymanlu/p/6361688.html
Copyright © 2011-2022 走看看