使用鼠标在3D空间中向各个方向移动对象

时间:2018-12-19 08:03:33

标签: c# .net unity3d 3d

我有这个跟踪项目,我从事了很长时间。基本上,用户移动一个立方体以跟踪随机移动的球体的运动。目前,我正在处理用户运动。

问题是用户用来在所有方向上移动的设备是结合了箭头键的鼠标。这是因为鼠标处理二维(x-y),而箭头键处理二维(x-z)。但是,我想让我可以只使用鼠标。

因此,我的教授建议我使用Shift键在x-y和x-z运动之间切换。但是,我对如何执行此操作感到困惑。

下面的代码代表了我目前所拥有的以及关于Shift键移动的尝试。

有人可以帮我解决这个问题,还是有更好的方法解决这个问题?

谢谢!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshCollider))]

public class UserController : MonoBehaviour {

public int speed = 20;

// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{

    // get input data from keyboard or controller
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");

    // update player position based on input
    Vector3 position = transform.position;
    position.x += moveHorizontal * speed * Time.deltaTime;
    position.z += moveVertical * speed * Time.deltaTime;
    transform.position = position;
}

void OnMouseDrag()
{

    while(Input.GetMouseButton(0))
    {
        int shiftCalled = 0;
        //3D Drag, courtesy of Unity Forums
        if(Input.GetKey(KeyCode.LeftShift))
        {
            float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
        }

        //Plane Drag, courtesy of Unity Forums
        if(Input.GetKey(KeyCode.RightShift))
        {
            float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            Vector3 pos_move = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
            transform.position = new Vector3(pos_move.x, transform.position.y, pos_move.z);
        }
    }





}
}

1 个答案:

答案 0 :(得分:0)

这就是我要做的-

想象一下,光线从鼠标在屏幕上的位置朝着以X和Z角度伸展的2D平面传播。所述射线与平面的交点将是您希望在其上拖动对象的X,Z坐标。 现在,想象同一条光线与在X和Y坐标上延伸的不同平面相交。这将生成您正在寻找的另一种运动。

通过按住SHIFT按钮,您实际上将交换这两个平面,这将生成您想要的结果。

您可以使用-

在代码中生成两个平面
xy_Plane = new Plane(Vector3.forward, m_DistanceFromCamera);
xz_Plane = new Plane(Vector3.up, m_DistanceFromCamera);

使用-产生射线

 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Initialise the enter variable
        float enter = 0.0f;

        if (xy_Plane.Raycast(ray, out enter))
            Vector3 hitPoint = ray.GetPoint(enter);

并检查应使用哪个平面-

if(Input.GetKey(KeyCode.Shift))

现在,您只需要根据收到的命中点移动对象即可。

希望这会有所帮助。