为了账号安全,请及时绑定邮箱和手机立即绑定

C# 在 Unity 中将 Vector3 与 Vector2 混淆

C# 在 Unity 中将 Vector3 与 Vector2 混淆

C#
跃然一笑 2023-07-09 09:51:14
当尝试使精灵的枢轴与光标的位置相同时 - Vector3 objPos - 并从光标位置实例化对象减去一些差异 - Vector3 diff - Unity 抛出一个错误,指出“运算符 '-' 在类型的操作数上不明确” 'Vector2' 和 'Vector3'” 即使这两个变量都是 Vector3public 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 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

即使这两个变量都是 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;


查看完整回答
反对 回复 2023-07-09
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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

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

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


查看完整回答
反对 回复 2023-07-09
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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

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


查看完整回答
反对 回复 2023-07-09
  • 3 回答
  • 0 关注
  • 272 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信