Unity开发2D游戏(2):角色简单移动

第一节中我们用Input System来进行了输入映射,这一节我们结合上一节的配置,做一下角色的简单移动。文章不做太多说明,只记录关键过程和解答疑惑。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    [Header("Movement Settings")]
    [SerializeField]
    private float speed = 5f;
    private PlayerActions playerActions;
    private Rigidbody2D rb;
    private Vector2 movementInput;

    /// <summary>
    /// Unity基类定义的方法:Awake
    /// 在脚本实例被加载时调用,仅执行一次。常用于初始化变量或状态。
    /// </summary>
    private void Awake()
    {
        playerActions = new PlayerActions();
        rb = GetComponent<Rigidbody2D>();
        if (rb == null)
        {
            Debug.LogError("Rigidbody component is missing on the player object.");
        }
    }

    /// <summary>
    /// Unity基类定义的方法:Update
    /// 每一帧都会被调用一次。常用于处理输入、非物理相关的逻辑。
    /// </summary>
    void Update()
    {
        ReadMovement();
    }

    /// <summary>
    /// 自定义方法:Move
    /// 用于根据输入和速度移动角色。被FixedUpdate调用。
    /// </summary>
    private void Move()
    {
        if (rb != null)
        {
            Vector2 movement = movementInput * speed * Time.fixedDeltaTime;
            rb.MovePosition(rb.position + movement);
        }
        else
        {
            Debug.LogWarning("Rigidbody is not assigned, cannot move the player.");
        }
    }

    /// <summary>
    /// Unity基类定义的方法:FixedUpdate
    /// 每个固定物理帧调用一次。适合处理物理相关的逻辑。
    /// </summary>
    private void FixedUpdate()
    {
        Move();
    }

    /// <summary>
    /// 自定义方法:ReadMovement
    /// 读取玩家输入,并赋值给movementInput。被Update调用。
    /// </summary>
    private void ReadMovement()
    {
        movementInput = playerActions.Movement.Move.ReadValue<Vector2>().normalized;
    }

    /// <summary>
    /// Unity基类定义的方法:OnEnable
    /// 当脚本被启用时调用。常用于注册事件或启用输入。
    /// </summary>
    private void OnEnable()
    {
        playerActions.Enable();
    }

    /// <summary>
    /// Unity基类定义的方法:OnDisable
    /// 当脚本被禁用时调用。常用于注销事件或禁用输入。
    /// </summary>
    private void OnDisable()
    {
        playerActions.Disable();
    }
}

发表回复