如何修复 Unity 中的“无法从复合材料中读取 Vector2 类型的值”错误?

Posted

技术标签:

【中文标题】如何修复 Unity 中的“无法从复合材料中读取 Vector2 类型的值”错误?【英文标题】:How can I fix "Cannot read value of type Vector2 from composite" error in Unity? 【发布时间】:2021-03-12 22:21:17 【问题描述】:

我正在使用新的输入系统使用 Unity 制作 2D 游戏。我使用spriteRenderer.flipX 翻转播放器,但由于它由三个部分(身体和两只眼睛)组成,spriteRenderer 不起作用。此外,我无法将它们转换为单个精灵,因为我需要眼睛来为它们设置动画。因此,我决定使用transform.localscale 进行翻转并将movementInput 的值从浮点数更改为Vector2。问题是当我按箭头或 AD 键移动字符时,会弹出一条错误消息“无法从复合材料中读取 Vector2 类型的值”。此错误来自InputActionState,这是一个与新输入系统相关的冗长而复杂的代码。此外,从游戏手柄获取输入会导致相同的错误。我不知道这个错误是什么意思,我该如何解决。现在,玩家可以跳跃但不能移动或翻转。您可以在下面看到代码、错误和我的操作图。

这是我的播放器控制器:

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

public class PlayerController : MonoBehaviour

    [SerializeField] private float speed, jumpSpeed;
    [SerializeField] private LayerMask ground;
    private PlayerActionControls playerActionControls;
    private Rigidbody2D rb;
    private PolygonCollider2D pol;
    private Animator animator;
    private bool facingRight = true;
    private Vector2 movementInput;

private void Awake() 
       
    playerActionControls = new PlayerActionControls();  
    rb = GetComponent<Rigidbody2D>(); 
    pol = GetComponent<PolygonCollider2D>();
    animator = GetComponent<Animator>();   
      
   

private void OnEnable() 

    playerActionControls.Enable();

   

 private void OnDisable() 

    playerActionControls.Disable();
   

 void Start()
   
     playerActionControls.Land.Jump.performed += ctx => Jump(ctx.ReadValue<float>());

       

private void Jump(float val) 
       if (val == 1 && IsGrounded()) 
           rb.AddForce(new Vector2(0, jumpSpeed), ForceMode2D.Impulse);       
       
   
     

private bool IsGrounded() 
  
       Vector2 topLeftPoint = transform.position;
       topLeftPoint.x -= pol.bounds.extents.x;
       topLeftPoint.y += pol.bounds.extents.y;

       Vector2 bottomRightPoint = transform.position;
       bottomRightPoint.x += pol.bounds.extents.x;
       bottomRightPoint.y -= pol.bounds.extents.y;

       return Physics2D.OverlapArea(topLeftPoint, bottomRightPoint, ground);
   
     void FixedUpdate()
       
       if(facingRight == false && movementInput.x > 0)       
           Flip();
        else if (facingRight == true && movementInput.x < 0)        
           Flip();    
       
   
   void Flip()
        facingRight = !facingRight;
        Vector3 Scaler = transform.localScale;
        Scaler.x *= -1;
        transform.localScale = Scaler;
   
  
   void Update()
   
       Vector2 movementInput = playerActionControls.Land.Move.ReadValue<Vector2>();
       
       Vector2 currentPosition = transform.position;  // This was a Vector3 but since I got the error  "Operator '+=' is ambiguous on operands of type 'Vector3' and 'Vector2", I changed it to a Vector2.
       currentPosition += movementInput * speed * Time.deltaTime;
       transform.position = currentPosition;
     
   

这是我想移动播放器时遇到的错误。

这是我的行动图。

【问题讨论】:

此错误意味着它无法将AxisComposite 转换为Vector2,因为您使用的是通过操作类型,它一次读取和存储(在AxisComposite 内)所有输入,无论哪个方向是“最强”。将类型更改为值时会发生什么? @BFyre 当我将类型更改为值时,没有什么特别的事情发生。只是错误消失了,似乎问题已经解决了,但是当我玩游戏时,玩家仍然无法移动,我在控制台中遇到了同样的错误。 如果你使用方向而不是负/正呢?我现在无法检查它,但看看它是如何在此处的答案中完成的:***.com/questions/58469484/… @BFyre 我将游戏手柄的移动从1D Axis 更改为Binding(就像那个答案一样),我能够用游戏手柄移动玩家!但是当我按下键盘上的任何按钮时,我仍然得到同样的错误。我是否也需要将键盘输入更改为绑定? (我还更新了行动地图图像。) @BFyre 我尝试将键盘输入更改为绑定,但没有成功。另外,我发现了一些奇怪的东西。在我将手柄输入改为绑定后,玩家可以用左摇杆上下移动,这是因为Left Stick[Gamepad]绑定。如果我使用LeftRight 代替那个,玩家将不会移动。 【参考方案1】:

我将我的动作图更改为这个,现在翻转工作正常,我不再收到该错误。

【讨论】:

以上是关于如何修复 Unity 中的“无法从复合材料中读取 Vector2 类型的值”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Unity 中的 Google Admob 崩溃修复?

如何在 Unity 上修复“Gradle Build Failed”?

Unity 2019 - 如何修复 TextMeshPro 2.0 错误 cs0433

如何修复 3d 模型中的“裂缝”?

在 Unity Canvas 中编译后如何修复闪亮的按钮问题

如何在我的Mac OS的Unity Shader Graph 2018.2中修复我的问题