• SurvivalShooter学习笔记(五.敌人生命)


    敌人生命系统(受伤 死亡)

    敌人生成后有初始生命,被攻击受伤有打击特效,降低生命值,直至死亡;

    死亡后怪物:播放死亡音效,动画,然后下沉地表,销毁;玩家:得到相应分数。


    敌人生命脚本如下:

    1.变量:

     public int startingHealth = 100;            // 敌人初始生命
     public int currentHealth;                   // 敌人当前生命
     public float sinkSpeed = 2.5f;              // 死亡后敌人下沉到地下的速度
     public int scoreValue = 10;                 // 当前敌人死亡给予玩家的分数值
     public AudioClip deathClip;                 //敌人死亡的音效

    2.组件:
    Animator anim;                              // 敌人身上动画状态机
    AudioSource enemyAudio;                     // 敌人身上音效播放器
    ParticleSystem hitParticles;                // 敌人受击特效
    CapsuleCollider capsuleCollider;            //敌人身上碰撞

    3.记录状态变量:
    bool isDead;                                // 敌人是否死亡
    bool isSinking;                             // 敌人是否在死亡下沉

    4.初始化获取组件:
    void Awake ()
            {
                anim = GetComponent <Animator> ();
                enemyAudio = GetComponent <AudioSource> ();
                hitParticles = GetComponentInChildren <ParticleSystem> ();//特效物作为敌人的子物体,根据受击点调整位置
                capsuleCollider = GetComponent <CapsuleCollider> ();
    
                //初始化当前生命
                currentHealth = startingHealth;
            }

    5.如果在死亡下沉状态,则敌人:以下沉速度下沉
    void Update ()
            {
                // If the enemy should be sinking...
                if(isSinking)
                {
                    transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime);
                }
            }

    6.敌人受到伤害:如果敌人死亡,则不操作;否则,给予伤害,播放受伤音效特效 并判断是否死亡

    注:敌人身上的AudioSource初始已经拖入受伤音效,所以直接播放就行;下面死亡音效则需要切换音效再播放

    public void TakeDamage (int amount, Vector3 hitPoint)
            {
                //如果敌人死亡,则不操作
                if(isDead)
                    return;
    
                //播放敌人受伤音效
                enemyAudio.Play ();
    
                //受伤,减少当前生命
                currentHealth -= amount;
                
                //设置特效在受击点播放
                hitParticles.transform.position = hitPoint;
                hitParticles.Play();
    
                //判断是否死亡
                if(currentHealth <= 0)
                {
                    Death ();
                }
            }

    7.敌人死亡:切换动画到死亡,并播放敌人死亡音效。

    注意:因敌人死亡为立即,但动画播放到毁灭需要时间,所以死亡后把身上的碰撞的IsTrigger设True,把碰撞器转为触发器,使主角的射击可以穿过已死亡的敌人

     void Death ()
            {
                // 设置状态变量
                isDead = true;
    
                //把身上的碰撞的IsTrigger设True,把碰撞器转为触发器,使主角的射击可以穿过已死亡的敌人
                capsuleCollider.isTrigger = true;
    
                // 切换动画到死亡
                anim.SetTrigger ("Dead");
    
                //播放死亡音效(这会终止受伤音效的播放).
                enemyAudio.clip = deathClip;
                enemyAudio.Play ();
            }


    8.敌人死亡下沉:停止自动寻路,为了用translate来下沉敌人所以取消敌人身上刚体的物理属性;下沉后几秒毁灭物体

    public void StartSinking ()
            {
                // 禁用自动寻路组件
                GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false;
    
                //取消刚体物理属性(since we use Translate to sink the enemy).
                GetComponent <Rigidbody> ().isKinematic = true;
    
                // 设置状态变量值,然后交由Update让敌人向下移动
                isSinking = true;
    
                // 加分
                ScoreManager.score += scoreValue;
    
                // 2秒后毁灭敌人
                Destroy (gameObject, 2f);
            }


    可以注意到,在当前脚本中没有地方调用了StartSinking这个函数,那么项目中哪里调用它使敌人的尸体可以向下移动呢?

    这是个很好玩的地方,该项目在敌人的死亡动画里加了事件,调用了这个方法; 就是在动画播放到敌人死亡身体水平跳起准备落下的帧上,执行这个下沉函数,nice!





    这里补充关于Rigidbody上的IsKinematic取消物体属性参数:

    If enabled, the object will not be driven by the physics engine, and can only be manipulated by its Transform. This is useful for moving platforms or if you want to animate a Rigidbody that has a HingeJoint attached.
    也就是说,勾选上,取消物理属性后,该物体不再受物理引擎驱动,而只能通过transform变换来操作。适用于模拟运动的平台或者模拟受铰链关节连接的刚体。

    所以上面想要通过transform使物体向下移动,则先取消其物理属性。


  • 相关阅读:
    CSS3-文本渐变色
    doT.js-doT模板方便快捷的组织页面DOM
    js库-AngularJS
    js-点击按钮页面滚动到顶部,底部,指定位置
    js-页面进入时同时实现-图片预加载
    js-jquery 中$.ajax -浅显接触
    js-数字渐增到指定的数字,在指定的时间内完成(有动画效果哦)插件jquery.animateNumber.js
    小程序-生成一个小程序码画在canvas画布上生成一张图片分享出去
    小程序-点击按钮回到顶部1
    vivo手机的坑-禁止微信浏览器网页点击图片,图片会自动放大
  • 原文地址:https://www.cnblogs.com/caymanlu/p/6361687.html
Copyright © 2020-2023  润新知