在尝试将精灵的枢轴与光标的位置相同-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);
}
答案 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
设置为零。
将
Vector3
转换为Vector2
。
Vector3
可以隐式转换为Vector2
。 (z被丢弃)。
其中隐式意味着您不必显式使用类型转换,但可以互换使用两种类型。
详细了解implicit and explicit conversions
因此在错误中您得到ambiguous
表示c#不知道您要使用哪个操作。
Vector2 - Vector2
或Vector3 - Vector3
都存在,由于隐式转换..都是可能的。因此c#不知道要更改其值的两个值中的哪个。
最明显的解决方案是将类型更改为
Vector3 objPos;
答案 2 :(得分:0)
也许尝试将变量objPos定义为 Vector3 ,但不确定在类型之间是否定义了隐式/显式强制转换运算符:
Vector2 objPos;
...
objPos = new Vector3(xPos, yPos, -10);