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