从零开始的类银河恶魔城游戏03
[自学]从零开始的类银河恶魔城游戏03
part 3:Jump with State Machine 2025/1/28
状态机





状态机转换图
//PlayerGroundedState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerGroundedState : PlayerState
{
public PlayerGroundedState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
if (Input.GetKeyDown(KeyCode.Space))
{
stateMachine.ChangeState(player.jumpState);
}
}
}
//PlayerJumpState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerJumpState : PlayerState
{
public PlayerJumpState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
rb.velocity = new Vector2(rb.velocity.x, player.jumpForce); //
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
if (rb.velocity.y < 0)
{
stateMachine.ChangeState(player.airState);
}
}
}
//PlayerAirState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAirState : PlayerState
{
public PlayerAirState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
if (rb.velocity.y == 0)
{
stateMachine.ChangeState(player.idleState);
}
}
}
//PlayerMoveState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMoveState : PlayerGroundedState
{
public PlayerMoveState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
player.SetVelocity(xInput * player.moveSpeed, rb.velocity.y);
if (xInput == 0)
{
player.stateMachine.ChangeState(player.idleState);
}
}
}
//PlayerIdleState.cs
//PlayerStateMachine.cs
//PlayerState.cs
//Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Callbacks;
using UnityEngine;
public class Player: MonoBehaviour
{
[Header("Move info")]
public float moveSpeed = 8f;
public float jumpForce = 15f; //
#region Components
public Animator anim { get; private set; }
public Rigidbody2D rb { get; private set; }
#endregion
#region States
public PlayerStateMachine stateMachine { get; private set; }
public PlayerIdleState idleState { get; private set; }
public PlayerMoveState moveState { get; private set; }
public PlayerJumpState jumpState { get; private set; } //
public PlayerAirState airState { get;private set; } //
#endregion
private void Awake()
{
stateMachine = new PlayerStateMachine();
idleState = new PlayerIdleState(this,stateMachine,"Idle");
moveState = new PlayerMoveState(this,stateMachine,"Move");
jumpState = new PlayerJumpState(this,stateMachine,"Jump"); //
airState = new PlayerAirState(this,stateMachine,"Jump"); //
}
public void Start()
{
anim = GetComponentInChildren<Animator>();
rb = GetComponent<Rigidbody2D>();
stateMachine.Initialize(idleState);// PlayerStateMachine.Initialize()
}
public void Update()
{
stateMachine.currentState.Update();// PlayerState.Update()
}
//设置速度
public void SetVelocity(float _xVelocity, float _yVelocity)
{
rb.velocity = new Vector2(_xVelocity,_yVelocity);
}
}

浙公网安备 33010602011771号