我有这个跟踪项目,我从事了很长时间。基本上,用户移动一个立方体以跟踪随机移动的球体的运动。目前,我正在处理用户运动。
问题是用户用来在所有方向上移动的设备是结合了箭头键的鼠标。这是因为鼠标处理二维(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);
}
}
}
}
答案 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))
现在,您只需要根据收到的命中点移动对象即可。
希望这会有所帮助。