C#在Unity中混淆了Vector3和Vector2

时间:2019-07-20 08:43:17

标签: c# unity3d vector

在尝试将精灵的枢轴与光标的位置相同-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);
}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

  

即使这两个变量都是Vector3的

自您定义以来,情况并非如此

Vector2 objPos;

您为其分配的Vector3值将隐式转换为Vector2值。

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

  

Vector2转换为Vector3

     

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

Vector2.Vector2

  

Vector3转换为Vector2

     

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

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

详细了解implicit and explicit conversions

因此在错误中您得到ambiguous表示c#不知道您要使用哪个操作。

Vector2 - Vector2Vector3 - Vector3都存在,由于隐式转换..都是可能的。因此c#不知道要更改其值的两个值中的哪个。


最明显的解决方案是将类型更改为

Vector3 objPos;

答案 2 :(得分:0)

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

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