1. 程式人生 > >Unity3D 旋轉相機視角 鏡頭縮放 拖動相機視角 Game視窗還原Sence視窗功能

Unity3D 旋轉相機視角 鏡頭縮放 拖動相機視角 Game視窗還原Sence視窗功能

最近在做一個工程,在Game視窗內用到了和Sence視窗內差不多的功能,研究了一段,做了一個小小的Demo,一下貼出一部分的程式碼,還有工程連結,有興趣的朋友可以參考借鑑,轉載請註明出處。

1、以下是效果圖


2、開始貼程式碼吧
第一個新建一個C#指令碼MouseOrbit,這個指令碼是借鑑了unity3D自帶的MouseOrbit指令碼,我在其基礎上進行了修改,刪掉一部分內容,增加了不少東西,用射線檢測來檢測螢幕中心點物體的碰撞盒,並以此為旋轉中心,如果螢幕中心沒有物體,就採用偏移向量的方式來重新定位旋轉中心,大體上功能是沒有什麼問題,如果有朋友有更好的想法歡迎指點和相互交流。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseOrbit : MonoBehaviour {

    
    //偏移量和中心店
    Vector3 offest;
    Vector3 target;

    //記錄第一座標
    Vector3 P1;

    float distance = 15.0f;

    float xSpeed = 250.0f;
    float ySpeed = 120.0f;

    float x = 0.0f;
    float y = 0.0f;

    //相機移動速度
    float Speed = 40.0f;

    // Use this for initialization
    void Start ()
    {

        var angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;

        //旋轉中心初始點
        target = new Vector3(0, 0, 0);
    }

    private void Update()
    {
    }
    void LateUpdate()
    {      
        if (Input.GetMouseButton(0))
        {
            
            x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

            //返回一個四元數 繞某個軸旋轉某個角度
            var rotation = Quaternion.Euler(y, x, 0);
            var position = rotation * new Vector3(0.0f, 0.0f, -distance) + target;

            transform.rotation = rotation;
            transform.position = position;
           
        }
        else if(Input.GetMouseButton(1))
        {
            
            float x;
            float y;
            x = Input.GetAxis("Mouse X");
            y = Input.GetAxis("Mouse Y");
            transform.Translate(new Vector3(-x, -y, 0) * Time.deltaTime * Speed);
            //print("轉換過的:" + Camera.main.ScreenToWorldPoint(new Vector3(x, y, 0)));
                  
        }
       
        
        if (Input.GetMouseButtonDown(1))
        {
          
            P1 = transform.position;

        }
        if (Input.GetMouseButtonUp(1))
        {
            
            ////利用射線檢測來獲取螢幕中心點座標
            Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))  
            {
                if (hit.collider)
                {
                    target = new Vector3(hit.point.x, hit.point.y, hit.point.z);
                    distance = (hit.point - transform.position).magnitude;
                    print(hit.collider.name);
                }
            }
            else
            {

                offest = transform.position - P1;
                target = target + offest;
                distance = (target - transform.position).magnitude;
            }


        }

    }
}


3、兩個指令碼都掛在相機的視角下就可以了,左鍵按住滑動滑鼠可以讓相機繞旋轉中心旋轉,右鍵按住後可以拖動相機左右上下移動,當旋轉中心為某個特定物體時,相機會圍繞著該物體為中心做旋轉。

4、附上原始碼工程,有需要的可以下載

http://download.csdn.net/download/mr_sun88/10194839

作者:大蝦小二

CSDN:Mr_Sun88

轉載請註明出處!