鼠標拖動物體、按下鼠標左鍵旋轉觀察物體、鼠標滾輪縮放視野

如題目所示,本文實現這三個效果。所有代碼都在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方面的文章會很少寫了,抓緊時間學習虛幻引擎。

發佈了23 篇原創文章 · 獲贊 68 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章