"Operator '+=' is ambiguous on operands of type 'Vector3' and 'Vector2'" error even though I am only using Vector2

huangapple go评论129阅读模式
英文:

"Operator '+=' is ambiguous on operands of type 'Vector3' and 'Vector2'" error even though I am only using Vector2

问题

我搜索了关于这个错误的问题,显然是关于将Vector3/Vector2添加到Vector2/Vector3上的问题(很合理),但我这里根本没有使用Vector3。问题出在哪里?

英文:

I searched up the problem with this error and it it apparently a problem with adding a Vector3/Vector2 to a Vector2/Vector3 (makes sense), but I did not use Vector3 here at all. What is the problem?

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

public class SquareScript : MonoBehaviour
{

    void Start()
    {
        transform.position = new Vector2(0, 0);
    }

    void Update()
    {
        transform.position += new Vector2(0, 1 / 100);
    }
}

答案1

得分: 1

是的,你这样做。

transform.position += new Vector2(0, 1 / 100);

等同于

transform.position = transform.position + new Vector2(0, 1 / 100);

因此,你正在将 transform.position(它是一个 Vector3)加到新的 Vector2 上。

英文:

Yes you do.

transform.position += new Vector2(0, 1 / 100);

is the same as

transform.position = transform.position + new Vector2(0, 1 / 100);

so you're adding transform.position (which is a Vector3) to the new Vector2.

答案2

得分: 0

transform.position 始终是 Vector3

您正在添加一个 Vector2

对于这两种类型都存在 + 运算符... 但不适用于混合类型。

此外,由于存在 [Vector3Vector2 之间的隐式转换 - 这也是为什么

transform.position = new Vector2(0, 0);

可以正常工作的原因 - 编译器无法确定是将 transform.position 转换为 Vector2,然后执行 Vector2 + Vector2 操作,还是将您的新 Vector2 转换为 Vector3,然后执行 Vector3 + Vector3 操作。

这就是为什么它说这是模棱两可的原因。

当然,您可以显式强制一种转换并执行

transform.position += (Vector3) new Vector2(0, 1 / 100);

由于您只想要 Y 部分,您可以简单地使用

transform.position += new Vector3(0, 1 / 100); // 等同于 new Vector3 (0, 1/100, 0)

或者也可以使用

transform.position += Vector3.up * 1 / 100;

但是

1/100

也是整数除法!结果为 0!您可能想要 1f / 100f 以进行浮点数除法


最后,这仍然会受到帧速率的影响,您可能希望使用 * Time.deltaTime 来转换为每秒的帧速率无关值。

英文:

transform.position is always a Vector3.

You are adding a Vector2.

For both there exists a + operator .. but not for the mixed types.

Additionally since there is implicit conversions forth and back between Vector3 and Vector2 - which btw is the reason why

transform.position = new Vector2(0, 0);

works - the compiler doesn't know whether it rather shall convert the transform.position to Vector2 and then perform a Vector2 + Vector2 operation, or whether rather convert your new Vector2 to a Vector3 and then perform a Vector3 + Vector3 operation.

That's why it says it is ambiguous.

You could of course explicitly force one conversion and do

transform.position += (Vector3) new Vector2(0, 1 / 100);

Since you only want the Y part anyway you could simply use

transform.position += new Vector3(0, 1 / 100); // equals new Vector3 (0, 1/100, 0)

or also

transform.position += Vector3.up * 1 / 100;

BUT

1/100

is also an integer division! And results in 0! You probably wanted 1f / 100f to have a float division


And finally this still would be frame rate dependent and you rather want to use * Time.deltaTime to convert into a frame rate independent value per second.

huangapple
  • 本文由 发表于 2023年2月8日 23:15:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/75387848.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定