第一节中我们用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();
}
}