C# 基于鼠标的瞄准Unity3d

C# 基于鼠标的瞄准Unity3d,c#,vector,unity3d,physics,game-physics,C#,Vector,Unity3d,Physics,Game Physics,我正在做炮弹射击游戏。这是一个简短的代码,我正在计算瞄准方向 Vector3 mousePos = Input.mousePosition; mousePos.z = thisTransform.position.z - camTransform.position.z; mousePos = mainCamera.ScreenToWorldPoint (mousePos); Vector3 forc

我正在做炮弹射击游戏。这是一个简短的代码,我正在计算瞄准方向

            Vector3 mousePos = Input.mousePosition;
            mousePos.z = thisTransform.position.z - camTransform.position.z;
            mousePos = mainCamera.ScreenToWorldPoint (mousePos);

            Vector3 force = mousePos - thisTransform.position;
            force.z = force.magnitude;
当球和球都处于角度(0,0,0)时,此选项有效。但是当角度改变时,我不能朝正确的方向射击

            Vector3 mousePos = Input.mousePosition;
            mousePos.z = thisTransform.position.z - camTransform.position.z;
            mousePos = mainCamera.ScreenToWorldPoint (mousePos);

            Vector3 force = mousePos - thisTransform.position;
            force.z = force.magnitude;
假设球和相机都在右侧看45度角,相同的代码不起作用

当前代码假定两者都处于角度(0,0,0)。所以在上述情况下,投掷方向总是错误的


我想把球抛向任何方向。但是,假设它为0角度,并相应地抛出。

使用
摄影机。在这种情况下,ScreenToWorldPoint
是错误的

应该对平面使用光线投射。下面是一个没有不必要的数学运算的演示:

光线投射为您提供了一个优势,即您不必猜测用户单击的“深度”(坐标
z

下面是上述功能的一个简单实现:

/// <summary>
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is
/// on the axis of front/back and up/down of this transform.
/// Throws an UnityException when the mouse is not pointing towards the plane.
/// </summary>
/// <returns>The 3d mouse position</returns>
Vector3 GetMousePositionInPlaneOfLauncher () {
    Plane p = new Plane(transform.right, transform.position);
    Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
    float d;
    if(p.Raycast(r, out d)) {
        Vector3 v = r.GetPoint(d);
        return v;
    }

    throw new UnityException("Mouse position ray not intersecting launcher plane");
}
//
///获取鼠标光标指向的三维平面的三维位置,该平面是
///在该变换的前/后和上/下轴上。
///当鼠标未指向平面时引发UnityException。
/// 
///三维鼠标位置
Vector3 GetMousePositionInPlaneOfLauncher(){
平面p=新平面(transform.right,transform.position);
Ray r=Camera.main.ScreenPointRoay(输入.鼠标位置);
浮动d;
如果(p.Raycast(r,out d)){
向量3 v=r.GetPoint(d);
返回v;
}
抛出新的UnityException(“鼠标位置光线不与发射器平面相交”);
}


演示:

干得好!但每次我想计算鼠标位置时,是否有必要创建一个平面?是的,请你上传一个所有人都可以玩的演示。对不起,没有注意到你关于飞机的问题:它不是必需的,但是它太便宜了,你不应该麻烦它。这只是一个数学构造,并不比向量复杂多少。另外,如果每帧都重新计算,那么你可以轻松地移动平面。对我来说,这总是会返回一个异常。@PersonthHuman,你确定鼠标指针在平面上吗?也许你必须移动相机或者连接了这个脚本的游戏对象?如果不确定如何使用脚本,请查看演示项目。