需求:
玩家有初始生命;
被敌人攻击后:掉血,播放受击音效,红屏(用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); }