簡體   English   中英

Object 僅在拖動方向上移動少量[Unity 2D isometric]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM