主要步驟
- 得到物體屏幕坐標(biāo)的Z值
- 物體由世界坐標(biāo)轉(zhuǎn)為屏幕坐標(biāo)
- 得到鼠標(biāo)的世界坐標(biāo)(Z值是物體的屏幕坐標(biāo))
- 鼠標(biāo)三維屏幕坐標(biāo)從屏幕坐標(biāo)轉(zhuǎn)為世界坐標(biāo)
- 計(jì)算攝像機(jī)與物體的偏移量
- 都是世界坐標(biāo)下勋又,計(jì)算鼠標(biāo)世界坐標(biāo)與物體世界坐標(biāo)的偏移值
- 循環(huán)判斷是否按鼠標(biāo)左鍵
- 按鍵后去扣,得到當(dāng)前的鼠標(biāo)世界坐標(biāo)
- 物體世界坐標(biāo) = 目前當(dāng)前的世界坐標(biāo) + 偏移值
注意
- 要用while循環(huán)
- 要用協(xié)程
- 要yield return new WaitForFixedUpdate()
- 在Start方法中調(diào)用StartCoroutine(要調(diào)用的協(xié)程方法)
- 此腳本要掛載在要實(shí)現(xiàn)此功能的物體上
- 要調(diào)用OnMouseDown方法
代碼
using System.Collections;
using UnityEngine;
public class Test : MonoBehaviour {
Vector3 cubeScreenPos;
Vector3 offset;
void Start()
{
StartCoroutine(OnMouseDown());
}
IEnumerator OnMouseDown()
{
//1. 得到物體的屏幕坐標(biāo)
cubeScreenPos = Camera.main.WorldToScreenPoint(transform.position);
//2. 計(jì)算偏移量
//鼠標(biāo)的三維坐標(biāo)
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);
//鼠標(biāo)三維坐標(biāo)轉(zhuǎn)為世界坐標(biāo)
mousePos = Camera.main.ScreenToWorldPoint(mousePos);
offset = transform.position - mousePos;
//3. 物體隨著鼠標(biāo)移動(dòng)
while (Input.GetMouseButton(0))
{
//目前的鼠標(biāo)二維坐標(biāo)轉(zhuǎn)為三維坐標(biāo)
Vector3 curMousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);
//目前的鼠標(biāo)三維坐標(biāo)轉(zhuǎn)為世界坐標(biāo)
curMousePos = Camera.main.ScreenToWorldPoint(curMousePos);
//物體世界位置
transform.position = curMousePos + offset;
yield return new WaitForFixedUpdate(); //這個(gè)很重要,循環(huán)執(zhí)行
}
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者