我一直试图在Unity 3D中拖放对象在移动设备上工作。我希望它是这样的,当您在屏幕上拖动时,对象在z轴上移动,如果您向上或向下拖动屏幕,对象将在z轴而不是y中移动。这是我目前的代码......
public class MovementController : MonoBehaviour
{
Vector3 dist;
Vector3 startPos;
float posX;
float posZ;
float posY;
void OnMouseDown()
{
startPos = transform.position;
dist = Camera.main.WorldToScreenPoint(transform.position);
posX = Input.mousePosition.x - dist.x;
posY = Input.mousePosition.y - dist.y;
posZ = Input.mousePosition.z - dist.z;
}
void OnMouseDrag()
{
float disX = Input.mousePosition.x - posX;
float disY = Input.mousePosition.y - posY;
float disZ = Input.mousePosition.z - posZ;
Vector3 lastPos = Camera.main.ScreenToWorldPoint(new Vector3(disX, disY, disZ));
transform.position = new Vector3(lastPos.x, startPos.y, lastPos.z);
}
}
然而,这使得物体仅在z轴上移动很小的量,我必须直接到屏幕的顶部才能移动一点。有没有更好的方法来做到这一点,因为我似乎无法找到一种方法来更改代码来解决这个问题。谢谢。
你混淆了变量的目的 - 他们没有包含他们的名字描述的值:)
用于XY平面:
public class MovementController : MonoBehaviour
{
Vector3 startPos;
Vector3 dist;
void OnMouseDown()
{
startPos = Camera.main.WorldToScreenPoint(transform.position);
dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z));
}
void OnMouseDrag()
{
Vector3 lastPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z);
transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
}
}
或者,如果您更喜欢XZ飞机:
public class MovementController : MonoBehaviour
{
Vector3 startPos;
Vector3 dist;
void OnMouseDown()
{
startPos = Camera.main.WorldToScreenPoint(transform.position);
dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y));
}
void OnMouseDrag()
{
Vector3 lastPos = new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y);
transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
}
}
编辑:
控制位置变化多少,改变:
transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
至:
Vector3 targetPos = Camera.main.ScreenToWorldPoint(lastPos) + dist;
Vector3 dir = targetPos - transform.position;
float dist = dir.magnitude;
Vector3.Normalize(dir);
// change 1.0f to something else if you want:
transform.position += new Vector3(dir.x * dist * 1.0f, dir.y * dist * 1.0f, dir.z * dist * 1.0f);
如果你将dir.z * dist * 1.0f
改为dir.z * dist * 2.0f
,那么你将在Z方向上移动两倍。