1.点中物体拖动的方法(将脚本挂在需要拖动的物体上即可)
public class Test : MonoBehaviour
{
bool IsDrag=false;//是否能拖动
Vector3 offset;//两者的向量
Vector3 screenPoint;//物体的屏幕坐标
void Update()
{
screenPoint = Camera.main.WorldToScreenPoint(transform.position);//得到物体的屏幕坐标
if (Input.GetKey(KeyCode.Mouse0) && IsDrag)//拖动中
{
Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);//实时计算鼠标屏幕坐标
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace)+offset;//将当前鼠标的屏幕坐标转换成世界坐标,再加上两者间的距离
transform.position = curPosition;//新坐标赋值
}
if (Input.GetKeyUp(KeyCode.Mouse0) && IsDrag)
{
IsDrag = false;//左键抬起,重新初始化
}
}
/// <summary>
/// 回调函数,当物体被鼠标点中时才执行
/// </summary>
void OnMouseDown()
{
IsDrag = true;//可以拖动
offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));//计算此刻物体与鼠标之间的距离,由于鼠标坐标是二维,因此要转成世界坐标
}
}
2.点中屏幕拖动的方法(类似飞机大战,将脚本挂在需要拖动的物体上即可)
public class Test2 : MonoBehaviour
{
Vector3 offset;//两者的向量
Vector3 screenPoint;//物体的屏幕坐标
void Start ()
{
screenPoint = Camera.main.WorldToScreenPoint(transform.position);//得到物体的屏幕坐标
}
void Update ()
{
Vector3 vector = Input.mousePosition;//实时计算鼠标的屏幕坐标
if (Input.GetKeyDown(KeyCode.Mouse0))
{
offset = screenPoint - vector;//鼠标按下,计算鼠标与物体的距离(物体的坐标要先转换成屏幕坐标,这步很重要)
}
if (Input.GetKey(KeyCode.Mouse0))
{
Vector3 curPosition = vector + offset;//鼠标坐标加上两者的距离
transform.position = Camera.main.ScreenToWorldPoint(curPosition);//将屏幕坐标转化成世界坐标并赋值
screenPoint = Camera.main.WorldToScreenPoint(transform.position);//重新计算物体的屏幕坐标
}
}
}