[Unity] P9-Hurt&Dead的逻辑和动画

113 阅读2分钟

一.添加动画

  • 1.分别创建GreenHurt(38-41), GreenDead(42-53), 拖入对应的素材
  • 2.删掉刚刚创建的动画产生的state(并不会删掉动画本身)

image.png

二.录制受伤闪烁效果

  • 1.添加受伤图层

image.png

  • 2.添加新的受伤动画(Hurt1是被击退的特效,Hurt2是闪烁的特效)

image.png

  • 3.添加Property

image.png

  • 4.将动画时间范围选择0-1s, 然后在0.2s,0.4s,1s 分别设置透明度

image.png

  • 5.先删掉Base Layer层的Hurt2动画, 然后设置HurtLayer层

image.png

  • 6.将Hurt2拖到Hurt层的这个位置

image.png

  • 7.在Param中添加触发器,添加动画过渡的condition

image.png

image.png

目前到 9:24

第二天继续

  • 1.点击通往hurt2的过渡线 image.png

动画结束之后的线是有退出时间的

image.png

  • 2.打开Player身上的PlayerAnimation脚本编辑

image.png 添加如下代码

// 执行受伤
public void PlayerHurt()
{
    anim.SetTrigger("Hurt"); // 这个名字是动画面板上的Param,不要写错
}
  • 3.修改人物身上挂载的Char: 修改 Assets/Scripts/General/Character.cs, 增加受伤触发事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class Character : MonoBehaviour
{
    [Header("基础属性")]
    public float maxHealth;
    public float currentHealth;

    [Header("受伤无敌")]
    public float invulnerableDuration;
    private float invulnerableCounter;
    public bool invulnerable;

    public UnityEvent<Transform> OnTakeDamage; //受伤触发事件

    private void Start()
    {
        currentHealth = maxHealth; //初始血量满血
    }

    private void Update()
    {
        if (invulnerable)
        {
            invulnerableCounter -= Time.deltaTime;
            if (invulnerableCounter <= 0)
            {
                invulnerable = false;
            }
        }
    }

    public void TakeDamage(Attack attacker)
    {
        if (invulnerable)
            return;
        // Debug.Log(attacker.damage);
        if (currentHealth >= attacker.damage)
        {
            currentHealth -= attacker.damage;
            TriggerInvulnerable();

            // 执行受伤


        } else
        {
            currentHealth = 0;
            // 触发死亡
            Debug.Log("触发死亡");
        }
        
    }

    // 无敌判断
    private void TriggerInvulnerable()
    {
        if (! invulnerable)
        {
            invulnerable = true;
            invulnerableCounter = invulnerableDuration;
        }
    }
}

回到unity中可以发现Player的Charters组件中多了这个Unity的事件功能, 我们就可以在受伤时间触发时,执行播放动画,声音,改变UI等方法

image.png

  • 4.将PlayAnimation拖动到这里, 调用刚刚其PlayHurt方法

image.png

  • 5.修改Character.cs的代码,触发事件

image.png

测试成功: 当人解除到boar时, 人物闪烁
  • 1.这里作者又又又改了, 他说还是希望播放最初那个受伤动画(仍然是另外一个Layer)

image.png

  • 2.给Player添加受伤改变颜色的效果

image.png

  • 3.在1和3帧处, 修改颜色

image.png

目前到 12:32