真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Unity3D如何使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角-創(chuàng)新互聯(lián)

這篇文章主要介紹Unity3D如何使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括鞏留網(wǎng)站建設(shè)、鞏留網(wǎng)站制作、鞏留網(wǎng)頁(yè)制作以及鞏留網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鞏留網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鞏留省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

Unity使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角,具體內(nèi)容如下

用代碼在Game界面完美實(shí)現(xiàn)Scene界面的操作方法。

使用方法:把腳本掛在相機(jī)上,把跟蹤的target拖到腳本上。

視角跟蹤的是一個(gè)空物體,當(dāng)然如果你是做RPG游戲需要跟蹤某一角色的視角,那就不需要中鍵平移功能,把空物體換成角色就行。

代碼主要是分三部分功能進(jìn)行實(shí)現(xiàn)。

1.右鍵拖動(dòng)控制視角的旋轉(zhuǎn);
2.滾輪旋轉(zhuǎn)控制視角的縮放;
3.中鍵拖動(dòng)控制視角的平移。

右鍵拖動(dòng)控制旋轉(zhuǎn)主要是用GetAxis獲得鼠標(biāo)在x方向與y方向平移的距離,相機(jī)的旋轉(zhuǎn)是通過(guò)旋轉(zhuǎn)相機(jī)本體坐標(biāo)系的x軸與y軸實(shí)現(xiàn)的,重要的是在旋轉(zhuǎn)相機(jī)的同時(shí),要控制相機(jī)和target物體的相對(duì)距離,即同時(shí)控制相機(jī)繞target物體的旋轉(zhuǎn)。這個(gè)網(wǎng)上多數(shù)實(shí)現(xiàn)都相同,不贅述

中鍵滾輪控制視角的縮放,定義Distance變量控制相機(jī)與target的距離(相機(jī)z軸方向的距離),用GetAxis獲得滾輪旋轉(zhuǎn)的程度,控制Distance的變動(dòng)。這里和網(wǎng)上已有的方法也沒(méi)什么區(qū)別。

中鍵拖動(dòng)控制視角的平移,之前在網(wǎng)上查找相關(guān)的實(shí)現(xiàn),結(jié)果實(shí)際效果都比較差,所以自己實(shí)現(xiàn)了一下。視角的平移是通過(guò)獲取中鍵在屏幕坐標(biāo)系下的平移的方向向量,然后轉(zhuǎn)換為世界坐標(biāo)系下的target坐標(biāo)的平移,然后調(diào)整相機(jī)的位置進(jìn)行相應(yīng)的平移以保證旋轉(zhuǎn)和縮放不受影響。

屏幕坐標(biāo)系的平移轉(zhuǎn)換到世界坐標(biāo)系下的平移,本質(zhì)上就是世界坐標(biāo)系下沿著相機(jī)的本體坐標(biāo)系的x與y軸進(jìn)行相應(yīng)的平移。所以只需要求出屏幕坐標(biāo)系x與y方向的平移,分別乘以相機(jī)x與y軸的方向向量,然后與target原來(lái)的坐標(biāo)相加,就可以獲得target平移后的位置,再將相機(jī)的位置平移過(guò)去即實(shí)現(xiàn)了視角的平移,這種平移保證了相機(jī)平面和target之間的相對(duì)距離保持不變。具體代碼如下:

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

public class MouseLookTest : MonoBehaviour {

 //相機(jī)跟隨的目標(biāo)物體,一般是一個(gè)空物體
 public Transform target;
 private int MouseWheelSensitivity = 1; //滾輪靈敏度設(shè)置
 private int MouseZoomMin = 1; //相機(jī)距離最小值
 private int MouseZoomMax = 20; //相機(jī)距離大值

 private float moveSpeed = 10; //相機(jī)跟隨速度(中鍵平移時(shí)),采用平滑模式時(shí)起作用,越大則運(yùn)動(dòng)越平滑

 private float xSpeed = 250.0f; //旋轉(zhuǎn)視角時(shí)相機(jī)x軸轉(zhuǎn)速
 private float ySpeed = 120.0f; //旋轉(zhuǎn)視角時(shí)相機(jī)y軸轉(zhuǎn)速

 private int yMinLimit = -360;
 private int yMaxLimit = 360;

 private float x = 0.0f; //存儲(chǔ)相機(jī)的euler角
 private float y = 0.0f; //存儲(chǔ)相機(jī)的euler角

 private float Distance = 5; //相機(jī)和target之間的距離,因?yàn)橄鄼C(jī)的Z軸總是指向target,也就是相機(jī)z軸方向上的距離
 private Vector3 targetOnScreenPosition; //目標(biāo)的屏幕坐標(biāo),第三個(gè)值為z軸距離
 private Quaternion storeRotation; //存儲(chǔ)相機(jī)的姿態(tài)四元數(shù)
 private Vector3 CameraTargetPosition; //target的位置
 private Vector3 initPosition; //平移時(shí)用于存儲(chǔ)平移的起點(diǎn)位置
 private Vector3 cameraX; //相機(jī)的x軸方向向量
 private Vector3 cameraY; //相機(jī)的y軸方向向量
 private Vector3 cameraZ; //相機(jī)的z軸方向向量

 private Vector3 initScreenPos; //中鍵剛按下時(shí)鼠標(biāo)的屏幕坐標(biāo)(第三個(gè)值其實(shí)沒(méi)什么用)
 private Vector3 curScreenPos; //當(dāng)前鼠標(biāo)的屏幕坐標(biāo)(第三個(gè)值其實(shí)沒(méi)什么用)
 void Start () {
 //這里就是設(shè)置一下初始的相機(jī)視角以及一些其他變量,這里的x和y。。。是和下面getAxis的mouse x與mouse y對(duì)應(yīng)
 var angles = transform.eulerAngles;
 x = angles.y;
 y = angles.x;
 CameraTargetPosition = target.position;
 storeRotation = Quaternion.Euler (y + 60, x, 0);
 transform.rotation = storeRotation; //設(shè)置相機(jī)姿態(tài)
 Vector3 position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition; //四元數(shù)表示一個(gè)旋轉(zhuǎn),四元數(shù)乘以向量相當(dāng)于把向量旋轉(zhuǎn)對(duì)應(yīng)角度,然后加上目標(biāo)物體的位置就是相機(jī)位置了
 transform.position = storeRotation * new Vector3 (0, 0, -Distance) + CameraTargetPosition; //設(shè)置相機(jī)位置

 // Debug.Log("Camera x: "+transform.right);
 // Debug.Log("Camera y: "+transform.up);
 // Debug.Log("Camera z: "+transform.forward);

 // //-------------TEST-----------------
 // testScreenToWorldPoint();

 }

 void Update () {
 //鼠標(biāo)右鍵旋轉(zhuǎn)功能
 if (Input.GetMouseButton (1)) {
 x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;
 y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;

 y = ClampAngle (y, yMinLimit, yMaxLimit);

 storeRotation = Quaternion.Euler (y + 60, x, 0);
 var position = storeRotation * new Vector3 (0.0f, 0.0f, -Distance) + CameraTargetPosition;

 transform.rotation = storeRotation;
 transform.position = position;
 } else if (Input.GetAxis ("Mouse ScrollWheel") != 0) //鼠標(biāo)滾輪縮放功能
 {
 if (Distance >= MouseZoomMin && Distance <= MouseZoomMax) {
 Distance -= Input.GetAxis ("Mouse ScrollWheel") * MouseWheelSensitivity;
 }
 if (Distance < MouseZoomMin) {
 Distance = MouseZoomMin;
 }
 if (Distance > MouseZoomMax) {
 Distance = MouseZoomMax;
 }
 var rotation = transform.rotation;

 transform.position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition;
 }

 //鼠標(biāo)中鍵平移
 if (Input.GetMouseButtonDown (2)) {
 cameraX = transform.right;
 cameraY = transform.up;
 cameraZ = transform.forward;

 initScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
 Debug.Log ("downOnce");

 //targetOnScreenPosition.z為目標(biāo)物體到相機(jī)xmidbuttonDownPositiony平面的法線距離
 targetOnScreenPosition = Camera.main.WorldToScreenPoint (CameraTargetPosition);
 initPosition = CameraTargetPosition;
 }

 if (Input.GetMouseButton (2)) {
 curScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
 //0.01這個(gè)系數(shù)是控制平移的速度,要根據(jù)相機(jī)和目標(biāo)物體的distance來(lái)靈活選擇
 target.position = initPosition - 0.01f * ((curScreenPos.x - initScreenPos.x) * cameraX + (curScreenPos.y - initScreenPos.y) * cameraY);

 //重新計(jì)算位置
 Vector3 mPosition = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + target.position;
 transform.position = mPosition;

 // //用這個(gè)會(huì)讓相機(jī)的平移變得更平滑,但是可能在你buttonup時(shí)未使相機(jī)移動(dòng)到應(yīng)到的位置,導(dǎo)致再進(jìn)行旋轉(zhuǎn)與縮放操作時(shí)出現(xiàn)短暫抖動(dòng)
 //transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed);

 }
 if (Input.GetMouseButtonUp (2)) {
 Debug.Log ("upOnce");
 //平移結(jié)束把cameraTargetPosition的位置更新一下,不然會(huì)影響縮放與旋轉(zhuǎn)功能
 CameraTargetPosition = target.position;
 }

 }

 //將angle限制在min~max之間
 static float ClampAngle (float angle, float min, float max) {
 if (angle < -360)
 angle += 360;
 if (angle > 360)
 angle -= 360;
 return Mathf.Clamp (angle, min, max);
 }

 void testScreenToWorldPoint () {
 //第三個(gè)坐標(biāo)指的是在相機(jī)z軸指向方向上的距離
 Vector3 screenPoint = Camera.main.WorldToScreenPoint (CameraTargetPosition);
 Debug.Log ("ScreenPoint: " + screenPoint);

 // var worldPosition = Camera.main.ScreenToWorldPoint(new Vector3(1,1,10));
 // Debug.Log("worldPosition: "+worldPosition);
 }
}

實(shí)現(xiàn)的效果如下圖:

Unity3D如何使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角

以上是“Unity3D如何使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


分享標(biāo)題:Unity3D如何使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://weahome.cn/article/dcsdej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部