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





  • 相关阅读:
    RxJS 系列 – Error Handling Operators
    RxJS 系列 – Join Creation Operators
    Google – Reviews
    Google Analytics – GA4 & Tag Manager 概念篇
    DOM & BOM – Input File, Drag & Drop File, File Reader, Blob, ArrayBuffer, File, UTF8 Encode/Decode, Download File
    RxJS 系列 – 大杂烩
    RxJS 系列 – Join Operators
    RxJS 系列 – 实战练习
    前端接收文件流并下载解决乱码问题
    package.json 与 packagelock.json 的关系
  • 原文地址:https://www.cnblogs.com/caymanlu/p/6361686.html
Copyright © 2020-2023  润新知