You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2D俯视角游戏PlayerController适配Unity新输入系统求助

Unity新输入系统适配2D俯视角移动脚本指导

前置确认

你已经完成的输入配置(键鼠/控制器控制方案、Moving动作图、上下左右移动动作)无需修改,直接按以下步骤调整代码即可:

步骤1:替换PlayerController脚本代码

以下代码完全保留了你原有网格移动、障碍物检测的逻辑,仅替换了输入读取部分适配新输入系统:

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private float moveSpeed = 5;
    [SerializeField]
    private Transform movePoint;
    [SerializeField]
    private LayerMask obstacleMask;
    // 新增字段:用来挂载你已经配置好的Input Action资产
    [SerializeField] private InputActionAsset inputActions;
    // 存储实时移动输入值
    private Vector2 moveInput;

    private void Awake()
    {
        movePoint.parent = null;
        // 绑定移动动作的输入回调,输入变化时自动更新存储的输入值
        var movingActionMap = inputActions.FindActionMap("Moving");
        // 注意这里的"Move"要改成你自己配置的移动Action的实际名称
        var moveAction = movingActionMap.FindAction("Move");
        moveAction.performed += ctx => moveInput = ctx.ReadValue<Vector2>();
        moveAction.canceled += ctx => moveInput = Vector2.zero;
    }

    // 脚本启用时同步启用Moving动作组
    private void OnEnable()
    {
        inputActions.FindActionMap("Moving").Enable();
    }

    // 脚本禁用时同步禁用Moving动作组避免报错
    private void OnDisable()
    {
        inputActions.FindActionMap("Moving").Disable();
    }

    void Update()
    {
        transform.position = Vector2.MoveTowards(transform.position, movePoint.position, moveSpeed * Time.deltaTime);

        if (Vector2.Distance(transform.position, movePoint.position) <= .5f)
        {
            float horizontalInput = moveInput.x;
            float verticalInput = moveInput.y;

            if (Mathf.Abs(horizontalInput) == 1)
            {
                if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(horizontalInput, 0f, 0f), .2f, obstacleMask))
                {
                    movePoint.position += new Vector3(horizontalInput, 0f, 0f);
                }
            }
            else if (Mathf.Abs(verticalInput) == 1)
            {
                if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(0f, verticalInput, 0f), .2f, obstacleMask))
                {
                    movePoint.position += new Vector3(0f, verticalInput, 0f);
                }
            }
        }
    }
}

步骤2:Inspector面板配置

  • 选中挂载了PlayerController组件的玩家游戏对象
  • 把你之前做输入配置生成的后缀为.asset的Input Action文件,拖到组件的Input Actions参数栏里
  • 确认代码里FindAction("Move")的字符串和你实际配置的移动Action名称完全一致,如果你配置的移动Action不是叫Move,改成你自己的命名即可

适配效果说明

  • 你原有游戏逻辑完全没有改动,只是把旧输入系统的Input.GetAxisRaw读取逻辑替换成了新输入系统的回调读取逻辑
  • 适配完成后你配置的键鼠、控制器两种输入方案会自动生效,不需要额外写多设备适配代码

内容的提问来源于stack exchange,提问作者Laurie Morin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:57:03