【发布时间】:2019-05-15 22:59:42
【问题描述】:
在标题中以最佳方式总结这种行为并不容易。 我有一个编辑器和一个在 [ExecuteInEditMode] 中执行的 Monobehaviour。 我需要通过用鼠标选择对象来移动它们。我认为我在使用角色和精灵执行此操作时没有遇到任何困难。但是我错了。当我选择一个 3D 对象(不是角色)时,我可以选择并拖动它,但如果我按住鼠标按钮而不移动它,它往往会滑开,就好像它正在下降一样,但在 Y 轴和 Z 轴上。如果我取消选择它的对撞机,问题就不会发生,但显然对撞机对我的操作是必要的。 我已经从代码中删除了所有不必要的行,希望能解决问题,但它仍然存在。
void OnGUI() {
if (moveChar) {
StartCoroutine("WaitChar");
} else if (moveSpot) {
StartCoroutine("WaitSpot");
}
Event e = Event.current;
Vector3 mousePosition = e.mousePosition;
mousePosition.y = Screen.height - mousePosition.y;
Ray ray = cam.ScreenPointToRay(mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo)) {
mousePositionWorld = hitInfo.point;
if (e.rawType == EventType.MouseDown) {
switch (e.button) {
case 0:
if (isSelectedSphere) {
moveSpot = true;
}
break;
case 1:
if (isSelectedChar) {
moveChar = true;
}
break;
}
} else if (e.rawType == EventType.MouseUp) {
switch (e.button) {
case 0:
if (moveSpot) {
moveSpot = false;
}
break;
case 1:
if (moveChar) {
moveChar = false;
}
break;
}
}
}
}
public IEnumerator WaitChar() {
character.transform.position = mousePositionWorld;
yield return new WaitForSeconds(0.1f);
}
public IEnumerator WaitSpot() {
MoveSpot.transform.position = mousePositionWorld;
MoveSpot.transform.localScale = Vector3.one * ((new Plane(cam.transform.forward,
cam.transform.position).GetDistanceToPoint(
MoveSpot.transform.position)) / radiusPoint);
yield return new WaitForSeconds(0.1f);
}
我用两个公共变量简化了一切,以选择要移动的对象。 我所做的很简单,我不明白为什么会出现这种行为。对于角色我没有问题(即使是精灵,我暂时从代码中删除)。当我用鼠标右键单击时,我运行将字符移动到光标坐标的协程并继续这样直到我释放按钮。没问题,字符随着光标移动没有问题。 但是,如果我对 Sphere、Cylinder、Cube 等 3D 对象执行相同的操作(左键),它会跟随鼠标移动,但如果我不移动光标并且不释放按钮,则对象会随着 Y 滑开和负增加的 Z 轴。正如我所说,如果我停用对撞机,对象将保持在光标位置。 问题是球体不能通过公共变量选择,而是直接从脚本中选择,所以我需要对撞机。 我可能不太了解 Unity,无法知道这种行为的原因。 你能帮我澄清一下吗?
【问题讨论】:
-
这个问题可以用 MoveSpot.GetComponent
().enabled = false;在 MouseDown 中启动协程并在 MouseUp 中重新激活对撞机之前。但这是一种解决方法吗?可以做得更好吗?