Unity2D学习笔记Day12:敌人统一死亡动画+Class的继承(含虚函数virtual,重写override)

学习资源:B站 M_Studio《Unity教程2D入门》17

Unity Assets:Sunnyland

Day12

调用frog死亡动画效果

这里我没有完全按照教程的方法,是自己写的。

思路如下:

  1. 为frog添加death动画
  2. 在原来脚本中,player下落触发frog消失的地方,改成触发frog的death动画
  3. 触发动画后,再销毁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类型的变量/函数,就只可以在子类和父类中使用。

步骤

  1. 新建一个脚本Enemy
  2. 让所有的敌人类继承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中修改这两处,就可以对敌人的死亡状态进行统一管理。
(当然,前提是每种敌人的死亡效果都一样。教程里就是所有敌人共用一个死亡效果——爆炸效果)
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值