繁体   English   中英

如何让游戏对象旋转并远离 Unity 中的 MouseClick 位置?

[英]How do I get a GameObject to rotate and face away from a MouseClick location in Unity?

所以在我的 Unity 练习中,我必须旋转一个游戏对象以远离我单击鼠标的位置。 此外,我只能绕 Y 轴旋转,即游戏对象只能完全向右或完全向左旋转,并且不能在任何时候向地面倾斜。 另外,我必须在没有 RayCasting 的情况下做到这一点(我已经用 RayCasting 做到了,所以作为练习,我必须在没有做到这一点)。 这是我多次尝试后编写的代码,但似乎不够有效:

Vector3 clickLocation = Input.mousePosition;
Vector3 clickWorldLocation = Camera.main.ScreenToWorldPoint(new Vector3(clickLocation.x, clickLocation.y, transform.position.x)); //the transform.position.x is just to add some depth 
transform.LookAt(new Vector3(clickWorldLocation.x, transform.position.y, clickWorldLocation.z), Vector3.up);

如果我的 GameObject 保持在其起始位置,此代码工作正常,但如果我将其移动到另一个位置并尝试相同的操作,则该代码会失败。 有人可以帮我吗?

首先,尽可能不频繁地调用Camera.main ,因为它使用昂贵的操作( FindGameObjectsWithTag ) 并且不缓存结果。

private Camera mainCamera;
void Awake() 
{
    mainCamera = Camera.main;
}

要回答您的问题,请不要在这种情况下使用ScreenToWorldPoint ,因为深度不是最容易计算的。 您没有任何可用于 z 组件的有意义的东西,并且transform.position.x在这里没有任何意义。

相反,创建一个Plane ,你要点击进入(如视图平行的平面的平面和相交的对象),使用ScreenPointToRay把鼠标位置成Ray ,然后找到其中射线和平面相交。 Plane.Raycast比物理光线投射快得多。 然后,找到从鼠标世界位置到对象的方向,并使用 Quaternion.LookRotation 将该方向转换为可以分配给对象旋转的旋转:

Ray mouseRay = mainCamera.ScreenPointToRay(Input.mousePosition);
Plane mousePlane = new Plane(mainCamera.transform.forward, transform.position);
float rayDistance;
if (mousePlane.Raycast(mouseRay, out rayDistance))
{
    Vector3 mouseWorldPos = mouseRay.GetPoint(rayDistance);

    // make the z component of mouseWorldPos the same as transform.position
    mouseWorldPos.z = transform.position.z;

    Vector3 awayFromMouseDir = transform.position - mouseWorldPos;

    transform.rotation = Quaternion.LookRotation(awayFromMouseDir, Vector3.up);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM