【问题标题】:C# confuses Vector3 for Vector2 in UnityC# 在 Unity 中将 Vector3 与 Vector2 混淆
【发布时间】:2019-07-20 17:42:40
【问题描述】:

在尝试使精灵的枢轴与光标位置相同时 - Vector3 objPos - 并从光标位置实例化对象减去一些差异 - Vector3 diff - Unity 抛出一个错误,提示“运算符'-'在'Vector2' 和 'Vector3' 类型的操作数”,即使这两个变量都是 Vector3 的

public Transform baseDot;
public KeyCode mouseLeft;
public Vector2 mousePosition;
Vector2 mousePos;
Vector2 objPos;

void OnMouseOver()
{
    Vector3 diff = new Vector3(2f, 2.8f, 0f);
    float xPos = Camera.main.ScreenToWorldPoint(mousePos).x;
    float yPos = Camera.main.ScreenToWorldPoint(mousePos).y;
    mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    objPos = new Vector3(xPos, yPos, -10);

    if (Input.GetKey(mouseLeft) )
        Instantiate(baseDot, objPos-diff, baseDot.rotation);
}

【问题讨论】:

  • 你说这两个变量都是Vector3,但它们不是。您已将 objPos 声明为 Vector2。由于 Unity 有一个隐式运算符,可将 Vector2 转换为 Vector3,因此不会出现任何编译时错误。将脚本顶部的变量更改为 Vector3 就可以了。

标签: c# unity3d vector


【解决方案1】:

即使这两个变量都是 Vector3 的

自从你定义后,这并不完全正确

Vector2 objPos;

您分配给它的Vector3 值会隐式转换为Vector2 值。

如果您阅读了Vector2.Vector3 的相应 API,就会清楚

Vector2 转换为Vector3

Vector2 可以隐式转换为Vector3。 (z 在结果中设置为零)。

Vector2.Vector2

Vector3 转换为Vector2

Vector3 可以隐式转换为Vector2。 (z 被丢弃)。

其中 implicit 意味着您不必显式使用类型转换,但可以交换使用这两种类型。

阅读更多关于implicit and explicit conversions

所以在错误中你得到ambiguous 意味着c# 不知道你想使用哪个操作。

Vector2 - Vector2Vector3 - Vector3 存在,由于隐式转换,两者都是可能的。所以 c# 不知道要更改这两个值中的哪一个。


最明显的解决办法是将类型改为

Vector3 objPos;

【讨论】:

    【解决方案2】:

    C# 在这里表现正确。 Vector2 和 Vector3 是结构(值类型),只能将 Vector3 分配给 Vector2,因为 Vector2 定义了隐式运算符。这意味着当您将 Vector3 分配给 Vector2 类型的变量时,它变为 Vector2 并且 z 坐标丢失。

    要解决您的问题,只需将 objPos 的类型更改为 Vector3 或创建一个新的临时变量来存储新的 Vector3(xPos, yPos, -10);

    为了理解这种行为,我建议研究引用与值类型和隐式运算符。

    【讨论】:

      【解决方案3】:

      也许尝试将变量 objPos 定义为 Vector3,我不确定它是否在类型之间定义了隐式/显式转换运算符:

      Vector2 objPos;
      ...
      objPos = new Vector3(xPos, yPos, -10);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2014-11-18
        相关资源
        最近更新 更多