Unity 角色状态 FSM 有限状态机 C# 代码示例
以下是一个简单的 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/oDFz 著作权归作者所有。请勿转载和采集!