裁切素材制作受伤动画
略
制作死亡动画
由于没有死亡动画素材,所以直接调整Alpha通道数值,使其逐渐消失
在Animations
中复制野猪受伤动画,命名为boarDead
Animator
中拖入boarDead
动画
点击Add Property
,选择Color
将最后一帧的Alpha
值改为0
Animator连接动画逻辑
从Any State连接至这两个创建好的boarDead
和boarHurt
动画,再将Hurt
连接至Exit
受伤和死亡可以从任意一个状态切入
boarHurt
的连接线,设置为动画完整播放一次后退出
野猪受击转换方向
在Enemy中创建一个新的全局变量
public Transform attacker;
创建一个OnTakeDamage()
方法,通过攻击者和受击者的X轴差值来判定攻击者在左在右,使野猪掉换方向
public void OnTakeDamage(Transform attackTrans)
{
attacker = attackTrans;
if(attackTrans.position.x - transform.position.x > 0)
{
transform.localScale = new Vector3(-1, 1, 1);
}
if (attackTrans.position.x - transform.position.x < 0)
{
transform.localScale = new Vector3(1, 1, 1);
}
}
野猪受伤被击退
在OnTakeDamage()
方法中添加一下代码
// 受伤被击退
isHurt = true;
animator.SetTrigger("hurt");
// 记录被攻击的方向
Vector2 dir = new Vector2(transform.position.x - attackTrans.position.x, 0).normalized;
StartCoroutine(OnHurt(dir));
StartCoroutine
为启动协程,需要搭配IEnumerator
使用
StartCoroutine官方文档:https://docs.unity3d.com/cn/2022.3/ScriptReference/MonoBehaviour.StartCoroutine.html
编写IEnumerator OnHurt()
协同程序方法
private IEnumerator OnHurt(Vector2 dir)
{
// 施加瞬时力
rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);
yield return new WaitForSeconds(0.45f);
isHurt = false;
}
IEnumerator:标记为协同程序,此方法代码会一行一行阻塞顺序执行
yield return:顺序迭代器,可选择等待固定模式后再执行下一步
野猪死亡代码逻辑并销毁
Enemy中创建新的全局变量
public bool isDead;
并创建一个OnDie()
方法,将动画的Dead
条件以及isDead
设置为true
public void OnDie()
{
animator.SetBool("dead", true);
isDead = true;
}
编写DestroyAfterDeadAnimation()
销毁对象的方法
public void DestroyAfterDeadAnimation()
{
Destroy(this.gameObject);
}
接着,在Boar对象的Animation
窗口,移动到最后一帧,添加一个Animation Event
将该Event绑定DestroyAfterDeadAnimation()
方法
解决销毁后仍有碰撞体积的问题
取消勾选此处的勾,代表Player不与Ignore Raycast层碰撞
在Layer中,我们能发现Ignore Raycast层序号为2
在Enemy的OnDie()方法中,将Enemy层赋值为2
public void OnDie()
{
gameObject.layer = 2;
animator.SetBool("dead", true);
isDead = true;
}
标签:动画,attackTrans,transform,2D,Unity,position,true,public
From: https://www.cnblogs.com/xinlindeyu/p/17928258.html