学习资源:B站 M_Studio《Unity教程2D入门》17
Unity Assets:Sunnyland
Day12
调用frog死亡动画效果
这里我没有完全按照教程的方法,是自己写的。
思路如下:
- 为frog添加death动画
- 在原来脚本中,player下落触发frog消失的地方,改成触发frog的death动画
- 触发动画后,再销毁frog实例
PlayerController.cs
//如果是下落状态
if (anim.GetBool("isFalling"))
{
frogAnim.SetBool("isDead", true);
//敌人才会消失
//Destroy(collision.gameObject);
//踩完后垫着敌人小跳一下
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
anim.SetBool("isJumping", true);
}
注意:此处就不能直接Destroy,因为setbool只是改变参数的值,真正触发动画效果应该是在这整个函数结束以后。如果这里就销毁对象,还是相当于直接让青蛙消失。
考虑到逻辑是触发死亡动画->销毁对象,可以在死亡动画的末尾添加动画事件。
EnemyFrog.cs中添加该函数:
void DestroySelf()
{
Destroy(gameObject);
}
为death添加事件:
改进1:
任何状态都可能触发死亡——不需要每条都连线。
直接连Any State就好了。
改进2:
写完以后,看了一下教程。觉得SetTrigger比SetBool好用。
因为SetBool只能改变参数不能立刻改变动画效果,而SetTrigger可以立刻改变动画。
首先,要将Death设置为一个trigger开关。
切换条件:
调用其他Class的变量
我们知道,触发敌人死亡的效果是在player的脚本中实现的,但又需要用到敌人的animator,在上面的方法中我用的是public,但教程中用的则是另一种方法,因为算是新知识点,所以这里也记录一下。
这样就可以直接获取frog类,
调用这个类中的所有public函数。
EnemyFrog Frog = collision.gameObject.GetComponent<EnemyFrog>();
我们可以设置DestroySelf函数为public,就可以直接在该脚本当中调用。
问题:这样的方法只能获取frog,那如果有多种敌人的时候呢?比如除了青蛙还有老鹰?
解决方法:将青蛙和老鹰放在一个类下,直接调用父级函数。
Monobehavior:主类
EnemyFrog.cs 继承自 Enemy类
public class EnemyFrog : Enemy
Enemy中protected类型的变量/函数,就只可以在子类和父类中使用。
步骤
- 新建一个脚本Enemy
- 让所有的敌人类继承Enemy类
希望父级的函数可以被子级调用:Protected
希望父级的函数可以被子级重新改写:Virtual
希望子级中的函数是改写自父级的:override
希望子级使用父级的Start函数:base.Start();
具体代码如下:
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
protected Animator anim;
protected virtual void Start()
{
anim = GetComponent<Animator>();
}
public void setDeath()
{
anim.SetTrigger("Death");
}
public void DestroySelf()
{
Destroy(gameObject);
}
}
EnemyFrog.cs(只copy有修改部分)
(原来设置的私有变量anim就可以删去了)
(其实还有eagle敌人的,这里就先不做了)
protected override void Start()
{
base.Start();
rb = GetComponent<Rigidbody2D>();
//anim = GetComponent<Animator>();
coll = GetComponent<Collider2D>();
leftx = leftPoint.position.x;
rightx = rightPoint.position.x;
Destroy(leftPoint.gameObject);
Destroy(rightPoint.gameObject);
Movement();
}
PlayerController中修改这两处,就可以对敌人的死亡状态进行统一管理。
(当然,前提是每种敌人的死亡效果都一样。教程里就是所有敌人共用一个死亡效果——爆炸效果)