SurvivalShooter学习笔记(六.玩家生命)

需求:

玩家有初始生命;

被敌人攻击后:掉血,播放受击音效,红屏(用UI图片做)闪烁提示,UI面板刷新生命

直至死亡:死亡播放死亡音效,游戏结束;


1.变量: 

玩家生命

 public int startingHealth = 100;                            // 初始生命值
 public int currentHealth;                                   // 当前生命
组件:

public Slider healthSlider;                                 // 玩家生命条UI
Animator anim;                                              // 玩家身上动画状态机
AudioSource playerAudio;                                    // 玩家身上音效组件
PlayerMovement playerMovement;                              // 玩家移动组件
PlayerShooting playerShooting;                              // 玩家攻击组件
状态bool:

bool isDead;                                                // 玩家是否死亡
bool damaged;                                               // 玩家受击后设置为True
受击红屏闪烁:

public Image damageImage;                                   // 受击后全屏显示的图片(半透的红图,真实感;初始设为全透明)
public float flashSpeed = 5f;                               // 受击图淡入淡出速度
public Color flashColour = new Color(1f, 0f, 0f, 0.1f);     // 受击图显示的颜色,半透

2.初始化组件:

 void Awake ()
        {
            anim = GetComponent <Animator> ();
            playerAudio = GetComponent <AudioSource> ();
            playerMovement = GetComponent <PlayerMovement> ();
            playerShooting = GetComponentInChildren <PlayerShooting> ();

            currentHealth = startingHealth;
        }

3.在Update中,根据damaged状态显示受击红屏闪烁:

void Update ()
        {
            // 如果受击了,这一帧显示受击提示颜色;下一帧从当前颜色插值清除
            if(damaged)
            {
                //设置受击图片的颜色为受击提示的颜色:半透红
                damageImage.color = flashColour;
            }
            else
            {
                // 以flashSpeed速度 插值清除受击图片颜色到0,0,0,0
                damageImage.color = Color.Lerp (damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
            }

            //重置受击状态
            damaged = false;
        }

4.玩家受伤:

public void TakeDamage (int amount)
        {
            //设置受伤变量为True,红屏闪烁后再恢复
            damaged = true;

            // 减去受击生命
            currentHealth -= amount;

            //UI面板显示
            healthSlider.value = currentHealth;

            //播放受击音效
            playerAudio.Play ();

            // 没血了,死亡,调用死亡函数
            if(currentHealth <= 0 && !isDead)
            {
                Death ();
            }
        }

5.玩家死亡:

    void Death ()
        {
            // 设置死亡状态为True,避免重复调用Dead函数(状态变量好处!!)
            isDead = true;

            // 关闭未播放完的玩家攻击的特效
            playerShooting.DisableEffects ();

            //切换动画状态机到死亡
            anim.SetTrigger ("Die");

            // 切换音效为死亡音效并播放
            playerAudio.clip = deathClip;
            playerAudio.Play ();

            // 禁用玩家移动和射击组件,不可再移动和攻击
            playerMovement.enabled = false;
            playerShooting.enabled = false;
        }

这里的playerShooting.DisableEffects ()做的是这样的事情:禁用了LineRenderer组件、Light点光源组件


6.重新开始:(游戏结束重新加载场景)

这里做法和敌人死亡一样,都是在死亡动画中加了事件,调用方法;主角死亡动画播放完时候进入这个事件重新加载场景。

 public void RestartLevel ()
        {
            SceneManager.LoadScene (0);
        }





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