使用C#代码创建一个简单的Unity角色状态FSM有限状态机
以下是一个简单的Unity角色状态FSM有限状态机的C#代码示例:
using UnityEngine;
public class CharacterStateMachine : MonoBehaviour
{
// 定义状态枚举
public enum State
{
Idle,
Walking,
Running,
Jumping
}
// 当前状态
public State currentState = State.Idle;
// 跳跃高度
public float jumpHeight = 5f;
// 速度
public float walkSpeed = 2f;
public float runSpeed = 6f;
// 重力
public float gravity = 10f;
// 移动方向
private Vector3 moveDirection = Vector3.zero;
// 引用组件
private CharacterController characterController;
private Animator animator;
void Start()
{
// 获取组件
characterController = GetComponent<CharacterController>();
animator = GetComponent<Animator>();
}
void Update()
{
// 更新状态
UpdateState();
// 根据当前状态执行对应的操作
switch (currentState)
{
case State.Idle:
Idle();
break;
case State.Walking:
Walk();
break;
case State.Running:
Run();
break;
case State.Jumping:
Jump();
break;
}
// 应用移动
characterController.Move(moveDirection * Time.deltaTime);
}
// 更新状态
void UpdateState()
{
// 检测是否在地面上
if (characterController.isGrounded)
{
// 根据移动速度切换状态
if (moveDirection.magnitude > 0)
{
currentState = Input.GetKey(KeyCode.LeftShift) ? State.Running : State.Walking;
}
else
{
currentState = State.Idle;
}
// 检测是否跳跃
if (Input.GetKeyDown(KeyCode.Space))
{
currentState = State.Jumping;
}
}
else
{
// 处理跳跃过程
if (currentState != State.Jumping)
{
currentState = State.Idle;
}
}
}
// 空闲状态
void Idle()
{
moveDirection = Vector3.zero;
animator.SetFloat("Speed", 0f);
}
// 行走状态
void Walk()
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection *= walkSpeed;
moveDirection = transform.TransformDirection(moveDirection);
moveDirection.y -= gravity * Time.deltaTime;
animator.SetFloat("Speed", moveDirection.magnitude);
}
// 跑步状态
void Run()
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection *= runSpeed;
moveDirection = transform.TransformDirection(moveDirection);
moveDirection.y -= gravity * Time.deltaTime;
animator.SetFloat("Speed", moveDirection.magnitude);
}
// 跳跃状态
void Jump()
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection *= walkSpeed;
moveDirection = transform.TransformDirection(moveDirection);
moveDirection.y = jumpHeight;
animator.SetTrigger("Jump");
}
}
此代码使用了CharacterController组件来处理角色的移动和跳跃,使用Animator组件来处理角色的动画。角色状态根据移动速度和是否在地面上来切换状态。在Walk、Run和Jump方法中,根据输入的方向和速度计算出移动方向,并将其应用到角色身上。在Jump方法中,将移动方向的Y轴设为跳跃高度,并播放跳跃动画
原文地址: https://www.cveoy.top/t/topic/haGK 著作权归作者所有。请勿转载和采集!