C# 如何在X&;上进行拖放;Unity3D中的Z轴?
我一直在尝试在手机上实现Unity 3D中对象的拖放。我希望这样,当你在屏幕上拖动时,对象在z轴上移动,如果你在屏幕上向上或向下拖动,对象将在z轴而不是y轴上移动。 这是我目前拥有的代码C# 如何在X&;上进行拖放;Unity3D中的Z轴?,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我一直在尝试在手机上实现Unity 3D中对象的拖放。我希望这样,当你在屏幕上拖动时,对象在z轴上移动,如果你在屏幕上向上或向下拖动,对象将在z轴而不是y轴上移动。 这是我目前拥有的代码 public class MovementController : MonoBehaviour { Vector3 dist; Vector3 startPos; float posX; float posZ; float posY; void OnMouseDown() { startPos = tr
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;
致:
如果将
dir.z*dist*1.0f
更改为dir.z*dist*2.0f
,则在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;
致:
如果您将
dir.z*dist*1.0f
更改为dir.z*dist*2.0f
,那么您将在z方向上移动两倍。谢谢,此代码将对象上下左右移动(在y轴和x轴上)。如果可能,我希望它在z轴和x轴上移动?感谢您的回复。第二种解决方案应该将其移动到X和Z上-请参阅使用输入的位置。mousePosition.y
(第一种情况下为y,第二种情况下为Z)Ok Cool,有没有办法减少其在Z轴上的移动量?因为我移动鼠标一点点,它就会移动好几英里。谢谢Hanks,这段代码将对象上下左右移动(在y轴和x轴上)我希望它在Z轴和x轴上移动,如果可能的话?感谢您的回复。第二种解决方案应该将其移动到X和Z上-请参阅使用输入的位置。mousePosition.y
(第一种情况下为y,第二种情况下为Z)Ok Cool,有没有办法减少其在Z轴上的移动量?因为我移动鼠标一点点,它就会移动好几英里。谢谢