這篇文章會講解如何拖曳 3D 物件。我的代碼實現了二個主要的功能就是拖曳和限制拖曳的方式。不廢話直上代碼。
using UnityEngine;
public class Move : MonoBehaviour
{
private Vector3 _offset;
private float _zCoord;
public Type moveType;
public enum Type
{
normal,
XAxis,
YAxis,
ZAxis,
XYPlane,
YZPlane,
ZXPlane
}
private void OnMouseDown()
{
_zCoord = Camera.main.WorldToScreenPoint(transform.position).z;
_offset = transform.position - GetMouseWorldPos();
}
private Vector3 GetMouseWorldPos()
{
Vector3 mousePoint = Input.mousePosition;
mousePoint.z = _zCoord;
return Camera.main.ScreenToWorldPoint(mousePoint);
}
private void OnMouseDrag()
{
Vector3 newPos = new Vector3(0, 0, 0);
switch (moveType)
{
case Type.normal:
newPos = GetMouseWorldPos() + _offset;
break;
case Type.XAxis:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = transform.position.y;
newPos.z = transform.position.z;
break;
case Type.YAxis:
newPos.x = transform.position.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = transform.position.z;
break;
case Type.ZAxis:
newPos.x = transform.position.x;
newPos.y = transform.position.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
case Type.XYPlane:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = transform.position.z;
break;
case Type.YZPlane:
newPos.x = transform.position.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
case Type.ZXPlane:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = transform.position.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
}
transform.position = newPos;
}
}
代碼最核心是以下幾句:
private void OnMouseDown()
{
_zCoord = Camera.main.WorldToScreenPoint(transform.position).z;
_offset = transform.position - GetMouseWorldPos();
}
private Vector3 GetMouseWorldPos()
{
Vector3 mousePoint = Input.mousePosition;
mousePoint.z = _zCoord;
return Camera.main.ScreenToWorldPoint(mousePoint);
}
private void OnMouseDrag()
{
transform.position = GetMouseWorldPos() + _offset;
}
有很人都不了解 GetMouseWorldPos 的部分,為甚麼要這樣寫。Input.mousePosition 是一個二維座標(x, y ),而我們現在要是三維座標(x, y, z),所以要補一個 Z座標。
為甚麼要給予一個 offset ,而不能直接是滑鼠的座標呢。以下是直接是滑鼠的座標的結果。
可以見到點擊方塊時會有一個少少移動,有小小不自然的感覺。
其實做法十分之簡單,就是將物件的 X Y Z分別計算。當只可以橫向移動,就改 y軸 的數值,而其他二兩個值 Y Z 就固定,就完成了!!!