gpt4 book ai didi

c# - 获取错误 "Operator ' + =' is ambiguous on operands of type ' 矢量 3' and ' 矢量 2'"

转载 作者:行者123 更新时间:2023-12-04 14:18:18 31 4
gpt4 key购买 nike

在尝试构建时,我收到此错误:

Operator '+=' is ambiguous on operands of type 'Vector3' and 'Vector2'



这是问题出处的脚本代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move2D : MonoBehaviour
{
public float moveSpeed = 5f;
public bool isGrounded = false;

[SerializeField] private Rigidbody2D rigidbody;

private void Awake()
{
if (!rigidbody) rigidbody = GetComponent<Rigidbody2D>();
}

public void Jump()
{
if (isGrounded)
{
rigidbody.AddForce(new Vector3(0f, 5f), ForceMode2D.Impulse);
}
}

public void Move(float value)
{
Vector2 movement = new Vector3(value, 0f, 0f);
transform.position += movement * Time.deltaTime * moveSpeed;
}
}


任何帮助或信息都非常感谢!

最佳答案

Vector2 具有与 Vector3 之间的隐式转换,但它们并不真正等效,Vector2 只有 X 和 Y 分量,而 Vector3 具有 X、Y 和 Z。

当您尝试使用 someVector3 += someVector2 时(或反之亦然),两者都是 += Vector3 和 Vector2 中的运算符有效。

编译器无法确定您要使用哪个,因此该异常是告诉您无法安全做出决定的方式,您需要为其提供一组明确的类型以供使用。这种情况下,双方都需要是Vector2或Vector3;不是混合。

您可以通过两种方式做到这一点:

  • 从一开始就使用兼容类型,which is what@Ruzihm already pointed out in the comments .
  • 或者您可以就地转换第二个操作数:transform.position +=
    (Vector3)movement * Time.deltaTime * moveSpeed;


  • 除此之外,我还可以在代码的其他部分看到这两种类型的不健康组合。我强烈建议你保持一致。如果您使用 2D,请使用 Vector2s。

    Vector2 有它自己的构造函数。而带有 2 个参数的 Vector3 构造函数只会让 Z 默认为零;它不会创建 Vector2。

    它首先起作用的唯一原因是编译器正在使用我上面谈到的隐式转换。但是,这会带来性能成本。
  • rigidbody.AddForce(new Vector 2 (0f, 5f), ForceMode2D.Impulse);
  • Vector2 movement = new Vector 2 (value, 0f); (或 Vector 3 movement)


  • 我最近才了解到的一个细节是 Unity 只在 Update 中同步 Transforms,而 Rigidbody(2D 或 3D)的移动只在 FixedUpdate 中同步。当您设置 Transform.position 时,这可能会导致问题。在刚体的物体上。

    这就是为什么这么多消息来源告诉你“在 FixedUpdate 中做物理事情”的原因之一。然而,虽然其他与遗忘有关的东西 Time.deltaTime可能发生,只要变换和刚体不同步,您就可以设置 position直接地。您可以使用 Rigidbody.position 来做到这一点。而不是 Transform.position .

    另一个好处是 Rigidbody2D.position是 Vector2,无需使用 Vector3 或为此进行转换 +=操作完全。
    public void Move(float value) {
    var movement = new Vector2(value, 0f);
    rigidbody.position += movement * Time.deltaTime * moveSpeed;
    }

    最后一件事,虽然是 绝对 premature-optimization 🤣(虽然不是坏的,因为在这种情况下它对可读性的影响为零),是你可以通过在那里执行“vector-last”来保存乘法运算: rigidbody.position += Time.deltaTime * moveSpeed * movement
    原因解释 in this other answer .

    关于c# - 获取错误 "Operator ' + =' is ambiguous on operands of type ' 矢量 3' and ' 矢量 2'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937184/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com