C# 在 Unity 中将 Vector3 与 Vector2 混淆

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

}


跃然一笑
浏览 425回答 3
3回答

绝地无双

即使这两个变量都是 Vector3 的自从你定义以来这并不完全正确Vector2 objPos;您分配给它的值Vector3会隐式转换为Vector2值。如果您阅读相应的 API,就会清楚了Vector2.Vector3将 a 转换Vector2为 a Vector3。AVector2可以隐式转换为 a Vector3。(z结果中 被设置为零)。和Vector2.Vector2将 a 转换Vector3为 a Vector2。AVector3可以隐式转换为 a Vector2。(z 被丢弃)。其中隐式意味着您不必显式使用类型转换,但可以互换使用两种类型。因此,在您收到的错误中,ambiguous意味着 c# 不知道您要使用哪个操作。要么存在,Vector2 - Vector2要么Vector3 - Vector3存在,由于隐式转换,两者都是可能的。因此,c# 不知道要更改两个值中的哪一个类型。最明显的解决方案是将类型更改为Vector3 objPos;

守着一只汪

C# 在这里表现正确。Vector2 和 Vector3 是结构体(值类型),并且只能将 Vector3 分配给 Vector2,因为 Vector2 定义了隐式运算符。这意味着当您将 Vector3 分配给 Vector2 类型的变量时,它会变成 Vector2 并且 z 坐标会丢失。要解决您的问题,只需将 objPos 的类型更改为 Vector3 或创建一个新的临时变量来存储新的 Vector3(xPos, yPos, -10);为了理解这种行为,我建议研究引用类型与值类型以及隐式运算符。

慕姐8265434

也许尝试将变量 objPos 定义为Vector3,我不确定它是否在类型之间定义了隐式/显式转换运算符:Vector2 objPos; ... objPos = new Vector3(xPos, yPos, -10);
打开App,查看更多内容
随时随地看视频慕课网APP