如題目所示,本文實現這三個效果。所有代碼都在pc端成功運行,移植到手機端改變相應的判斷條件即可,核心算法沒有問題。
一、 鼠標拖拽移動物體
效果演示
源代碼
public class mousedrag : MonoBehaviour
{
private Vector3 targetScreenpos;//拖拽物體的屏幕座標
private Vector3 targetWorldpos;//拖拽物體的世界座標
private Transform target;//拖拽物體
private Vector3 mouseScreenpos;//鼠標的屏幕座標
private Vector3 offset;//偏移量
Color oricolor = Color.black;//物體本來的顏色
void Start ()
{
target = transform;
}
void OnMouseEnter()
{
//當鼠標在物體上時,改變物體顏色。
GetComponent<Renderer>().material.color = Color.blue;
}
void OnMouseExit()
{
GetComponent<Renderer>().material.color = oricolor;
}
//被移動物體需要添加collider組件,以響應OnMouseDown()函數
//基本思路。當鼠標點擊物體時(OnMouseDown(),函數體裏面代碼只執行一次),記錄此時鼠標座標和物體座標,並求得差值。如果此後用戶仍然按着鼠標左鍵,那麼保持之前的差值不變即可。
//由於物體座標是世界座標,鼠標座標是屏幕座標,需要進行轉換。具體過程如下所示。
IEnumerator OnMouseDown()
{
targetScreenpos = Camera.main.WorldToScreenPoint(target.position);
mouseScreenpos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z);
offset = target.position -Camera.main.ScreenToWorldPoint(mouseScreenpos);
while(Input.GetMouseButton(0))//鼠標左鍵被持續按下。
{
mouseScreenpos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z);
targetWorldpos = Camera.main.ScreenToWorldPoint(mouseScreenpos) + offset;
target.position = targetWorldpos;
yield return new WaitForFixedUpdate();
}
}
}
二、滾輪控制視野縮放
效果演示
void Update()
{
Camera.main.fieldOfView = Camera.main.fieldOfView + Input.GetAxis("Mouse ScrollWheel")*20;
}
在移動端時,需要判斷兩手指的移動距離。不在這裏寫出來了。
三、按下鼠標左鍵旋轉物體
效果演示
源代碼
//旋轉速度,需要調試
public float xSpeed = 250.0f;
public float ySpeed = 130.0f;
//限制旋轉角度,物體繞x軸旋轉限制,不能上下顛倒。
public float yMinLimit = -30;
public float yMaxLimit = 30;
//物體的旋轉角度
public float x = 0.0f;
public float y = 0.0f;
void Start()
{
//初始化旋轉角度,記錄開始時物體的旋轉角度。
Vector3 angels = transform.eulerAngles;
x = angels.y;
y = angels.x;
//
}
void Update()
{
if(Input.GetMouseButton(0))
{
//鼠標沿x軸的移動乘以係數當作物體繞y軸的旋轉角度。
//鼠標沿y軸的移動乘以係數當作物體繞x軸的旋轉角度。
x += Input.GetAxis("Mouse X")*xSpeed*0.02f;
y += Input.GetAxis("Mouse Y")*ySpeed*0.02f;
}
}
void LateUpdate()
{
//限制繞x軸的移動。
y = Mathf.Clamp(y,yMinLimit,yMaxLimit);
Quaternion rotation = Quaternion.Euler(y,-x,0);
transform.rotation = rotation;
}
這裏部分參考了宣雨鬆的代碼。
上週找了個實習,是用unreal做虛擬現實和遊戲的,所以最近一直在熟悉虛幻4的UMG和blueprint。感覺blueprint可視化編程確實效率很高,在開發大型遊戲、虛擬現實方面可以減輕一定的代碼工作量,不過虛幻的umg系統確實太垃圾了,ui做起來太費事。
今後可能unity方面的文章會很少寫了,抓緊時間學習虛幻引擎。