以下是一个简单的 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 轴设为跳跃高度,并播放跳跃动画。

Unity 角色状态 FSM 有限状态机 C# 代码示例

原文地址: https://www.cveoy.top/t/topic/oDFz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录