Unity教程(一)开始学习状态机

Unity开发2D类银河恶魔城游戏学习笔记

Unity教程(零)Unity和VS的使用相关内容
Unity教程(一)开始学习状态机
Unity教程(二)角色移动的实现
Unity教程(三)角色跳跃的实现
Unity教程(四)碰撞检测
Unity教程(五)角色冲刺的实现
Unity教程(六)角色滑墙的实现
Unity教程(七)角色蹬墙跳的实现
Unity教程(八)角色攻击的基本实现
Unity教程(九)角色攻击的改进

Unity教程(十)Tile Palette搭建平台关卡
Unity教程(十一)相机
Unity教程(十二)视差背景

Unity教程(十三)敌人状态机
Unity教程(十四)敌人空闲和移动的实现
Unity教程(十五)敌人战斗状态的实现
Unity教程(十六)敌人攻击状态的实现
Unity教程(十七)敌人战斗状态的完善

Unity教程(十八)战斗系统 攻击逻辑
Unity教程(十九)战斗系统 受击反馈
Unity教程(二十)战斗系统 角色反击

Unity教程(二十一)技能系统 基础部分
Unity教程(二十二)技能系统 分身技能
Unity教程(二十三)技能系统 掷剑技能(上)基础实现
Unity教程(二十四)技能系统 掷剑技能(中)技能变种实现


如果你更习惯用知乎
Unity开发2D类银河恶魔城游戏学习笔记目录



前言

本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记,如有错误,欢迎指正。

本节开始状态机的学习。

Udemy课程地址

对应视频:Creating Finite State Machine


一、概述

创建状态基类PlayerState,各种状态都由此基类派生。

创建两个基本状态

创建状态机PlayerStateMachine用以控制各状态。

建立玩家脚本Player,它继承自MonoBehaviour。当我们需要将一个自定义脚本以组件的形式添加到对应GameObject时,该脚本必须继承自MonoBehaviour,否则无法添加为组件。MonoBehaviour相关内容可参考官方手册或其他相关博客。

根据个人理解大概图示如下(图大概画得不咋对,就是大致表示一下)
在这里插入图片描述

二、PlayerState

各种状态的基类,变量及函数如图,包括所属的状态机、玩家和动画的变量名等变量。
函数操作包含了状态的基本操作构造函数和三个抽象函数进入状态、更新状态、退出状态。
在这里插入图片描述

//PlayerStateMachine:状态机
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerStateMachine
{
	//当前状态
    public PlayerState currentState { get; private set; }

    //初始化
    public void Initialize(PlayerState _startState)
    {
        currentState = _startState;
        currentState.Enter();
    }

    //改变状态
    public void ChangeState(PlayerState _newState)
    { 
        currentState.Exit();
        currentState = _newState; 
        currentState.Enter();
    }
}


三、PlayerIdleState和PlayerMoveState

由PlayerState派生的两个状态类,方便进行初始化操作。
创建两个脚本,改为派生自PlayerState。
然后选中类名,按下快捷键Alt+Enter生成构造函数和重写。

生成构造函数
在这里插入图片描述
在这里插入图片描述
生成重写
在这里插入图片描述
在这里插入图片描述
代码如下:

//PlayerIdleState:空闲状态
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerIdleState : PlayerState
{
    //构造函数
    public PlayerIdleState(PlayerStateMachine _stateMachine, Player _player, string _animBoolName) : base(_stateMachine, _player, _animBoolName)
    {
    }

    //进入
    public override void Enter()
    {
        base.Enter();
    }

    //退出
    public override void Exit()
    {
        base.Exit();
    }

    //更新
    public override void Update()
    {
        base.Update();
    }
}

//PlayerMoveState:移动状态
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMoveState : PlayerState
{
    //构造函数
    public PlayerMoveState(PlayerStateMachine _stateMachine, Player _player, string _animBoolName) : base(_stateMachine, _player, _animBoolName)
    {
    }

    //进入
    public override void Enter()
    {
        base.Enter();
    }

    //退出
    public override void Exit()
    {
        base.Exit();
    }

    //更新
    public override void Update()
    {
        base.Update();
    }
}

四、PlayerStateMachine

状态机类,包含变量当前状态currentState,初始化,改变状态函数。
初始化时给将当前状态currentState赋值一个初始状态,然后调用Enter()进入此状态。
改变函数状态需要先调用Exit()退出当前状态,然后为当前状态currentState赋予新值,然后调用Enter()进入此状态。
为了保障数据安全,我们用限制访问器限制currentState可访问性,在其后添加{ get; private set; }。其中get是读方法,set是写方法。
在这里插入图片描述

//PlayerStateMachine:状态机
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerStateMachine
{
    public PlayerState currentState { get; private set; }

    public void Initialize(PlayerState _startState)
    {
        currentState = _startState;
        currentState.Enter();
    }

    public void ChangeState(PlayerState _newState)
    { 
        currentState.Exit();
        currentState = _newState; 
        currentState.Enter();
    }
}

五、Player

玩家类,继承自MonoBehaviour,状态机和各类状态等的定义都在此类中进行,可以进行Unity组件的相关处理。
现在我们先定义状态机stateMachine,并且定义两个最基本的状态idleState和moveState以便初始化。
我们先创建Awake()函数创建变量。
Start()设置初始状态为idleState。
Update()更新。

在这里插入图片描述
初始化过程如下图:
在这里插入图片描述

//Player:玩家
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public PlayerStateMachine StateMachine { get; private set; }
    public PlayerIdleState idleState { get; private set; }
    public PlayerMoveState moveState { get; private set; }

    //创建对象
    private void Awake()
    {
        StateMachine = new PlayerStateMachine();
        idleState = new PlayerIdleState(StateMachine, this, "Idle");
        moveState = new PlayerMoveState(StateMachine, this, "Move");

    }

    // 设置初始状态
    private void Start()
    {
        StateMachine.Initialize(idleState);
    }

    // 更新
    private void Update()
    {
        StateMachine.currentState.Update();
    }
}

在层次面板中创建Player,并挂载Player脚本
右键->Create Empty->重命名为Player
在这里插入图片描述
在这里插入图片描述
将脚本Player拖到物体Player面板中挂载上
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值