Unity引擎2D游戏开发,野猪基本的移动逻辑和动画

发布时间 2023-12-25 14:28:44作者: 心霖の雨

一、类的继承

在Scripts下创建Enemy文件夹,里面再创建两个C#文件
image

将Boar文件内的代码修改为以下代码,:后的是Enemy,即继承了Enemy类

public class Boar : Enemy
{

}

在Enemy内,编写基本属性

public class Enemy : MonoBehaviour
{
    [Header("基本参数")]
    // 基本移动速度
    public float normalSpeed;
    // 追击速度
    public float chaseSpeed;
}

这样在Boar内,就能看到Enemy内的基本属性
image

二、野猪移动

野猪自动行走,撞墙则朝反方向移动

获取朝向

在Enemy中,新建一个全局变量faceDirect

// 朝向
public Vector3 faceDirect;

观察野猪的Transform中的Scale,能够看到X轴当前是1,野猪面向左侧。但是目前需要定为X轴为1时面向右侧
image

因此,需要faceDirect中的值,将Scale中的X修改为负数,并实时获取野猪的朝向。则在Enemy中新建一个update()方法,并在内部实时获取朝向

private void Update()
{
    // 实时方向
    faceDirect = new Vector3(-transform.localScale.x, 0, 0);
}

移动的实现

然后新建Move()方法,内部实现移动功能

public void Move()
{
   rb.velocity = new Vector2(currentSpeed * faceDirect.x * Time.deltaTime, rb.velocity.y);
}

创建野猪的待机、步行、跑动的动画

Animation创建过程略

Animator中,创建两个布尔变量,通过布尔变量对敌人的走路、跑步进行控制
image

在窗口中,将三个状态进行互相连线
image

只有boarRun→boarWalk的连线为run=false,walk=true
image

实现野猪移动动画

通过重写(Override)父类Move()方法实现
Enemy的Move()方法加上virtual关键字

public virtual void Move()
{
    rb.velocity = new Vector2(currentSpeed * faceDirect.x * Time.deltaTime, rb.velocity.y);
}

Boar子类进行重写

public override void Move()
{
    base.Move();
}

base.Move()意为,保留父类方法内的代码

Enemy中,rb和animator变量将访问修饰符改为protected

protected Rigidbody2D rb;
protected Animator animator;

然后在Boar子类Move()内部写入以下代码

animator.SetBool("walk", true);