如何用Unity新输入系统实现玩家动画?遇CS0103报错求解决
问题解决:新输入系统下CS0103错误及动画参数适配
核心问题分析
- 变量未声明导致CS0103:你直接使用了
horizontalMove但从未在类中定义这个变量,编译器找不到它的定义所以报错。 - 混用新旧输入系统:既然已经通过新输入系统的
Move回调获取了moveVector,再调用旧输入系统的Input.GetAxis完全多余,还会导致逻辑冲突。
修复后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerMovement : MonoBehaviour { public Animator animator; [Header("Movement Variables")] private Rigidbody2D rb; private Vector2 moveVector; public float jumpDistance; public float moveSpeed; [SerializeField] bool isFacingRight; [Header("Ground Check")] [SerializeField] bool isGrounded; public Transform groundSpot; public LayerMask groundLayer; private void Awake() { rb = GetComponent<Rigidbody2D>(); isFacingRight = true; } public void Move(InputAction.CallbackContext context) { moveVector = context.ReadValue<Vector2>(); } public void Jump(InputAction.CallbackContext context) { if(context.performed && isGrounded) { rb.velocity = new Vector2(rb.velocity.x, jumpDistance); } } private void Update() { // 直接用新输入系统的moveVector计算水平速度,替代旧的Input.GetAxis float horizontalMove = moveVector.x * moveSpeed; animator.SetFloat("Speed", Mathf.Abs(horizontalMove)); isGrounded = Physics2D.OverlapCircle(groundSpot.position, 0.1f, groundLayer); CheckDirection(); } private void FixedUpdate() { rb.velocity = new Vector2(moveVector.x * moveSpeed, rb.velocity.y); } void CheckDirection() { if(moveVector.x > 0 && !isFacingRight) { Flip(); } else if(moveVector.x < 0 && isFacingRight) { Flip(); } } void Flip() { isFacingRight = !isFacingRight; transform.Rotate(new Vector3(0, 180, 0)); } }
关键改动说明
- 在
Update方法内声明并初始化horizontalMove,用新输入系统的moveVector.x替代旧的Input.GetAxis("Horizontal"),保证输入逻辑统一。 - 保留
horizontalMove作为临时变量让代码更清晰,也可以直接写成animator.SetFloat("Speed", Mathf.Abs(moveVector.x * moveSpeed));省略变量声明。 - 确保动画的
Speed参数和实际移动逻辑完全绑定,不会出现输入和动画不同步的问题。
内容的提问来源于stack exchange,提问作者Sub Zero
相关产品推荐
相关产品推荐

