[英]Object only moving small amount in dragged direction [Unity 2D isometric]
所以我目前正在開發一個等距的 2D 游戲,我正在嘗試用鼠標拖動對象。 在遵循一些教程之后,我添加了下面的腳本,但是 object 只在它被拖動的方向上移動了一點。 我不知道為什么 object 不僅遵循鼠標的坐標,而且如果您需要任何其他信息,我不介意提供。
private void OnMouseDown()
{
mouseOffset = MouseWorldPos() - (Vector2)transform.position;
}
private void OnMouseDrag()
{
transform.position = MouseWorldPos() - mouseOffset;
}
private Vector2 MouseWorldPos()
{
Vector2 mousePos = Input.mousePosition;
return Camera.main.ScreenToViewportPoint(mousePos);
}
為什么要轉換為Viewport
坐標?
視口空間是標准化的並且相對於相機。 相機的左下角是(0,0); 右上角是 (1,1)。 z position 采用相機的世界單位。
=> 你先做
mouseOffset = MouseWorldPos() - (Vector2)transform.position;
最大可以是 position 0
到√(2)
遠離transform.position
。
然后你做
transform.position = MouseWorldPos() - mouseOffset;
它基本上保持在你原來的 position +- √(2)
在任何方向。
您可能更願意做類似的事情,例如
private readonly struct DragInfo
{
public Plane Plane { get; }
public Vector3 StartHitPoint { get; }
public Vector3 OriginalPosition { get; }
public DragInfo(Plane plane, Vector3 startHitPoint, Vector3 originalPosition)
{
Plane = plane;
StartHitPoint = startHitPoint;
OriginalPosition = originalPosition;
}
}
private DragInfo? dragInfo;
private Camera mainCamera;
private void OnMouseDown()
{
if(!mainCamera) mainCamera = Camera.main;
var ray = mainCamera.ScreenPointToRay(Input.mousePosition);
var plane = new Plane(-mainCamera.transform.forward, transform.position);
if(!plane.Raycast(ray, out var hitDistance)) return;
var startPoint = ray.GetPoint(hitDistance);
dragInfo = new DragInfo(Plane, startPoint, transform.position);
}
private void OnMouseDrag()
{
if(!dragInfo.HasValue) return;
var ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if(!dragInfo.Plane.Raycast(ray, out var hitDistance)) return;
var currentPoint = ray.GetPoint(hitDistance);
var delta = currentPoint - dragInfo.StartHitPoint;
transform.position = dragInfo.OriginalPosition + delta;
}
private void OnMouseUp()
{
dragInfo = null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.