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学习笔记,如有错误,欢迎指正。
本节开始状态机的学习。
对应视频: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面板中挂载上