Unity3D 遊戲引擎之IOS觸控螢幕手勢控制鏡頭旋轉與縮放
雨松MOMO原創文章如轉載,請註明:轉載至我的獨立網域名稱部落格雨松MOMO程式研究院
,原文地址:http://www.xuanyusong.com/archives/512
前幾篇文章介紹了很多Unity3D引擎自身的一些問題, 今天我們在回到IOS裝置上討論一些觸控螢幕幕手勢,本章的目標是通過觸摸iPhone螢幕手勢 實現模型左右的旋轉,與模型的縮放。
大家想一想模型的旋轉,實際上是鏡頭的旋轉。模型的縮放實際上是鏡頭Z軸方向的座標。那麼實現本章的內容只需要控制鏡頭的位置方可實現。
我們在遊戲情境中建立一些簡單的模型做為參照物,插一句 “大家有誰知道 . FBX 的模型那裡可以免費找到,我想在博文中加點遊戲模型讓情境更好看一些,可是苦於找不到有點鬱悶,用公司的模型來寫博文有覺得有點不合適”哇哢哢 ,如果有知道的哥們 不妨告訴我喔。啦啦啦。
我們建立一個簡單的遊戲平面, 然後平面中放一個箱子做為旋轉縮放的參照物。如所示,選中攝像機,給攝像機添加一個指令碼名稱為Move. 指令碼中有一個參數 Target,它的作用是設定網路攝影機旋轉移動參照物,這裡把一個箱子賦值給了 Target,那麼左右滑動螢幕會發現箱子在旋轉,兩手縮放螢幕會發現箱子在放大與縮小。
我們看看Move這條指令碼,說明一下幾個重要的 :
這些方法都是系統自己調用的方法
function Start () : 遊戲啟動以後只調用一次,可用於指令碼的初始化操作,
function Update ():Start()方法調用結束以後每一幀都會調用,可以在這裡更新遊戲邏輯。
function LateUpdate (): Start()方法調用結束以後每一幀都會調用,但是它是在 Update()調用完後調用。
Move.js完整代碼
//用於綁定參照物對象var target : Transform;//縮放係數var distance = 10.0;//左右滑動移動速度var xSpeed = 250.0;var ySpeed = 120.0;//縮放限制係數var yMinLimit = -20;var yMaxLimit = 80;//網路攝影機的位置var x = 0.0;var y = 0.0;//記錄上一次手機觸摸位置判斷使用者是在左放大還是縮小手勢private var oldPosition1 : Vector2;private var oldPosition2 : Vector2;//初始化遊戲資訊設定function Start () { var angles = transform.eulerAngles; x = angles.y; y = angles.x;// Make the rigid body not change rotation if (rigidbody)rigidbody.freezeRotation = true;}function Update () {//判斷觸摸數量為單點觸摸if(Input.touchCount == 1){//觸摸類型為移動觸摸if(Input.GetTouch(0).phase==TouchPhase.Moved){ //根據觸摸點計算X與Y位置x += Input.GetAxis("Mouse X") * xSpeed * 0.02; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;}}//判斷觸摸數量為多點觸摸if(Input.touchCount >1 ) { //前兩隻手指觸摸類型都為移動觸摸 if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved) { //計算出當前兩點觸摸點的位置 var tempPosition1 = Input.GetTouch(0).position;var tempPosition2 = Input.GetTouch(1).position; //函數返回真為放大,返回假為縮小 if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2)) { //放大係數超過3以後不允許繼續放大 //這裡的資料是根據我項目中的模型而調節的,大家可以自己任意修改 if(distance > 3) { distance -= 0.5; } }else{ //縮小洗漱返回18.5後不允許繼續縮小 //這裡的資料是根據我項目中的模型而調節的,大家可以自己任意修改 if(distance < 18.5) { distance += 0.5; } } //備份上一次觸摸點的位置,用於對比 oldPosition1=tempPosition1;oldPosition2=tempPosition2; } }}//函數返回真為放大,返回假為縮小function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean{//函數傳入上一次觸摸兩點的位置與本次觸摸兩點的位置計算出使用者的手勢 var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y)); var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y)); if(leng1<leng2) { //放大手勢 return true; }else { //縮小手勢 return false; }}//Update方法一旦調用結束以後進入這裡算出重設攝像機的位置function LateUpdate () { //target為我們綁定的箱子變數,縮放旋轉的參照物 if (target) { //重設攝像機的位置 y = ClampAngle(y, yMinLimit, yMaxLimit); var rotation = Quaternion.Euler(y, x, 0); var position = rotation * Vector3(0.0, 0.0, -distance) + target.position; transform.rotation = rotation; transform.position = position; }}static function ClampAngle (angle : float, min : float, max : float) {if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp (angle, min, max);}
在Untiy3D 中運行用滑鼠手勢點擊上看不到任何效果的,必需在iPhone真機上才可以觸摸感應到效果喔 . 嘻嘻~
OK 接下來將Unity3D 匯出成Xcode項目,匯出的方法有誰還不會??? 我的第一篇文章有說明噢。哇哢哢~~ 然後運行項目只能在真機上運行哦。。 看看我在iPhone 上的。
觸摸iPhone螢幕鏡頭旋轉與縮放以後的效果,這個圖確實有點不太好截,我一會把項目的原始碼工程貼上來,方便大家閱讀與學習,哇哢哢~~
鏡頭任意的旋轉與縮放,還不錯噢,大家快點來學習Unity3D遊戲開發吧,哇哢哢~~
最後歡迎各位盆友可以和MOMO一起討論Unity3D遊戲開發,哇哢哢~~~ 附上工程的,檔案名稱是zoom.unitypackage,下載完畢的盆友們雙擊就可以自動在Unity3D 下開啟它啦。然後匯出成iPhone項目就可以運行了。今天回家裝個windows 7 最近對wp7的遊戲開發有點興趣哦~ 哦也~回家鑽研一下~哇哢哢
:http://www.xuanyusong.com/archives/512