23.属性奖励

23.玩家-属性奖励对象


23.1 知识点

在资源里找到属性奖励对象预设体,拖出来调整旋转,像武器奖励对象一样添加旋转脚本,碰撞器变成触发器,拖成预制体,其他属性奖励对象也是一样的套路

明确属性要做的事

属性奖励需要在触发到玩家时:

  • 给玩家增加相应属性值(如攻击力、防御力、最大生命值、当前生命值)
  • 播放一个奖励特效
  • 移除自己

创建属性奖励脚本,并且创建属性枚举和对应变量。这个脚本附加到不同的属性奖励预制体上并改成对应属性枚举。接着写不同属性碰撞触发到玩家的逻辑,并触发特效

using UnityEngine;

// 定义属性奖励类型枚举
public enum E_PropType
{
    Atk,    // 攻击力
    Def,    // 防御力
    MaxHp,  // 最大生命值
    Hp      // 当前生命值
}

// 属性奖励脚本
public class PropReward : MonoBehaviour
{
    // 属性奖励类型
    public E_PropType type = E_PropType.Atk;

    // 默认添加的属性值
    public int changeValue = 2;

    // 获取特效
    public GameObject getEff;

    private void OnTriggerEnter(Collider other)
    {
        // 碰撞到玩家才能触发属性奖励
        if (other.CompareTag("Player"))
        {
            // 获取玩家对象
            PlayerObj player = other.GetComponent<PlayerObj>();

            // 根据属性类型增加相应属性值
            switch (type)
            {
                case E_PropType.Atk:
                    player.atk += changeValue;
                    break;
                case E_PropType.Def:
                    player.def += changeValue;
                    break;
                case E_PropType.MaxHp:
                    player.maxHp += changeValue;
                    // 更新血条显示
                    GamePanel.Instance.UpdateHP(player.maxHp, player.hp);
                    break;
                case E_PropType.Hp:
                    player.hp += changeValue;
                    // 当前生命值不超过最大生命值
                    if (player.hp > player.maxHp)
                        player.hp = player.maxHp;
                    // 更新血条显示
                    GamePanel.Instance.UpdateHP(player.maxHp, player.hp);
                    break;
            }

            // 播放奖励特效
            GameObject eff = Instantiate(getEff, transform.position, transform.rotation);
            // 控制特效音效
            AudioSource audioS = eff.GetComponent<AudioSource>();
            audioS.volume = GameDataMgr.Instance.musicData.soundValue;
            audioS.mute = !GameDataMgr.Instance.musicData.isOpenSound;

            // 移除属性奖励
            Destroy(gameObject);
        }
    }
}

23.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum E_PropType
{
    //加属性的4种类型
    Atk,
    Def,
    MaxHp,
    Hp,
}

//属性奖励
public class PropReward : MonoBehaviour
{
    public E_PropType type = E_PropType.Atk;

    //默认添加的值 获取道具后
    public int changeValue = 2;

    //获取特效
    public GameObject getEff;

    private void OnTriggerEnter(Collider other)
    {
        //玩家才能获取 属性奖励
        if( other.CompareTag("Player") )
        {
            //得到对应的玩家脚本
            PlayerObj player = other.GetComponent<PlayerObj>();
            //根据类型来加属性就可以了
            switch (type)
            {
                case E_PropType.Atk:
                    player.atk += changeValue;
                    break;
                case E_PropType.Def:
                    player.def += changeValue;
                    break;
                case E_PropType.MaxHp:
                    player.maxHp += changeValue;
                    //更新血条
                    GamePanel.Instance.UpdateHP(player.maxHp, player.hp);
                    break;
                case E_PropType.Hp:
                    player.hp += changeValue;
                    //不能超过上限
                    if (player.hp > player.maxHp)
                        player.hp = player.maxHp;
                    //更新血条
                    GamePanel.Instance.UpdateHP(player.maxHp, player.hp);
                    break;
            }

            //播放一个 奖励特效
            GameObject eff = Instantiate(getEff, this.transform.position, this.transform.rotation);
            //控制 获取音效
            AudioSource audioS = eff.GetComponent<AudioSource>();
            //大小和开启状态
            audioS.volume = GameDataMgr.Instance.musicData.soundValue;
            audioS.mute = !GameDataMgr.Instance.musicData.isOpenSound;


            Destroy(this.gameObject);
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏