Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放
前幾篇文章介紹了很多Unity3D引擎自身的一些問(wèn)題, 今天我們?cè)诨氐絀OS設(shè)備上討論一些觸摸屏幕手勢(shì),本章的目標(biāo)是通過(guò)觸摸iPhone屏幕手勢(shì) 實(shí)現(xiàn)模型左右的旋轉(zhuǎn),與模型的縮放。
大家想一想模型的旋轉(zhuǎn),實(shí)際上是鏡頭的旋轉(zhuǎn)。模型的縮放實(shí)際上是鏡頭Z軸方向的坐標(biāo)。那么實(shí)現(xiàn)本章的內(nèi)容只需要控制鏡頭的位置方可實(shí)現(xiàn)。
我們?cè)谟螒驁?chǎng)景中創(chuàng)建一些簡(jiǎn)單的模型做為參照物,插一句 “大家有誰(shuí)知道 . FBX 的模型那里可以免費(fèi)找到,我想在博文中加點(diǎn)游戲模型讓場(chǎng)景更好看一些,可是苦于找不到有點(diǎn)郁悶,用公司的模型來(lái)寫(xiě)博文有覺(jué)得有點(diǎn)不合適”哇咔咔 ,如果有知道的哥們 不妨告訴我喔。啦啦啦。?
我們創(chuàng)建一個(gè)簡(jiǎn)單的游戲平面, 然后平面中放一個(gè)箱子做為旋轉(zhuǎn)縮放的參照物。如下圖所示,選中攝像機(jī),給攝像機(jī)添加一個(gè)腳本名稱為Move. 腳本中有一個(gè)參數(shù)?Target,它的作用是設(shè)置攝像頭旋轉(zhuǎn)移動(dòng)參照物,這里把一個(gè)箱子賦值給了 Target,那么左右滑動(dòng)屏幕會(huì)發(fā)現(xiàn)箱子在旋轉(zhuǎn),兩手縮放屏幕會(huì)發(fā)現(xiàn)箱子在放大與縮小。
我們看看Move這條腳本,說(shuō)明一下幾個(gè)重要的 :
這些方法都是系統(tǒng)自己調(diào)用的方法
function Start () : 游戲啟動(dòng)以后只調(diào)用一次,可用于腳本的初始化操作,
function Update ():Start()方法調(diào)用結(jié)束以后每一幀都會(huì)調(diào)用,可以在這里更新游戲邏輯。
function LateUpdate (): Start()方法調(diào)用結(jié)束以后每一幀都會(huì)調(diào)用,但是它是在 Update()調(diào)用完后調(diào)用。
Move.js完整代碼
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | //用于綁定參照物對(duì)象 var target : Transform; //縮放系數(shù) var distance = 10.0; //左右滑動(dòng)移動(dòng)速度 var xSpeed = 250.0; var ySpeed = 120.0; //縮放限制系數(shù) var yMinLimit = -20; var yMaxLimit = 80; //攝像頭的位置 var x = 0.0; var y = 0.0; //記錄上一次手機(jī)觸摸位置判斷用戶是在左放大還是縮小手勢(shì) private var oldPosition1 : Vector2; private var oldPosition2 : Vector2; //初始化游戲信息設(shè)置 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 () { //判斷觸摸數(shù)量為單點(diǎn)觸摸 if(Input.touchCount == 1) { //觸摸類型為移動(dòng)觸摸 if(Input.GetTouch(0).phase==TouchPhase.Moved) { ????//根據(jù)觸摸點(diǎn)計(jì)算X與Y位置 x += Input.GetAxis("Mouse X") * xSpeed * 0.02; ???????? y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02; } } //判斷觸摸數(shù)量為多點(diǎn)觸摸 if(Input.touchCount >1 ) ????{ ???? //前兩只手指觸摸類型都為移動(dòng)觸摸 ???? if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved) ???? { ???? ????//計(jì)算出當(dāng)前兩點(diǎn)觸摸點(diǎn)的位置 ?? var tempPosition1 = Input.GetTouch(0).position; var tempPosition2 = Input.GetTouch(1).position; ???????????? //函數(shù)返回真為放大,返回假為縮小 ???????????? if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2)) ???????????? { ???????????? //放大系數(shù)超過(guò)3以后不允許繼續(xù)放大 ???????????? //這里的數(shù)據(jù)是根據(jù)我項(xiàng)目中的模型而調(diào)節(jié)的,大家可以自己任意修改 ?????????????? if(distance > 3) ?????????????? { ?????????????? distance -= 0.5; ?????????????? } ?????????? }else { ???????????????? //縮小洗漱返回18.5后不允許繼續(xù)縮小 ???????????????? //這里的數(shù)據(jù)是根據(jù)我項(xiàng)目中的模型而調(diào)節(jié)的,大家可以自己任意修改 ???????????????? if(distance < 18.5) ???????????????? { ???????????????? distance += 0.5; ???????????????? } ???????????? } ????????????//備份上一次觸摸點(diǎn)的位置,用于對(duì)比 ???????? oldPosition1=tempPosition1; oldPosition2=tempPosition2; ???? } ????} } //函數(shù)返回真為放大,返回假為縮小 function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean { //函數(shù)傳入上一次觸摸兩點(diǎn)的位置與本次觸摸兩點(diǎn)的位置計(jì)算出用戶的手勢(shì) ????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) ????{ ???? //放大手勢(shì) ???????? return true; ????}else ????{ ???? //縮小手勢(shì) ????????return false; ????} } //Update方法一旦調(diào)用結(jié)束以后進(jìn)入這里算出重置攝像機(jī)的位置 function LateUpdate () { ????//target為我們綁定的箱子變量,縮放旋轉(zhuǎn)的參照物 ????if (target) { ???? //重置攝像機(jī)的位置 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 中運(yùn)行用鼠標(biāo)手勢(shì)點(diǎn)擊上看不到任何效果的,必需在iPhone真機(jī)上才可以觸摸感應(yīng)到效果喔 . 嘻嘻~
OK 接下來(lái)將Unity3D 導(dǎo)出成Xcode項(xiàng)目,導(dǎo)出的方法有誰(shuí)還不會(huì)??? 我的第一篇文章有說(shuō)明噢。哇咔咔~~ 然后運(yùn)行項(xiàng)目只能在真機(jī)上運(yùn)行哦。。 看看我在iPhone 上的截圖。 觸摸iPhone屏幕鏡頭旋轉(zhuǎn)與縮放以后的效果,這個(gè)圖確實(shí)有點(diǎn)不太好截,我一會(huì)把項(xiàng)目的源代碼工程下載地址貼上來(lái),方便大家閱讀與學(xué)習(xí),哇咔咔~~ 鏡頭任意的旋轉(zhuǎn)與縮放,還不錯(cuò)噢,大家快點(diǎn)來(lái)學(xué)習(xí)Unity3D游戲開(kāi)發(fā)吧,哇咔咔~~
最后歡迎各位盆友可以和MOMO一起討論Unity3D游戲開(kāi)發(fā),哇咔咔~~~ 附上工程的下載地址,文件名稱是zoom.unitypackage,下載完畢的盆友們雙擊就可以自動(dòng)在Unity3D 下打開(kāi)它啦。然后導(dǎo)出成iPhone項(xiàng)目就可以運(yùn)行了。
今天回家裝個(gè)windows 7 最近對(duì)wp7的游戲開(kāi)發(fā)有點(diǎn)興趣哦~ 哦也~回家鉆研一下~哇咔咔
下載地址:http://vdisk.weibo.com/s/abssL
- 本文固定鏈接:?http://www.xuanyusong.com/archives/512
- 轉(zhuǎn)載請(qǐng)注明:?雨松MOMO?2012年05月01日?于?雨松MOMO程序研究院?發(fā)表
MOMO與MO嫂提醒您:親,如果您覺(jué)得本文不錯(cuò),快快將這篇文章分享出去吧 。另外請(qǐng)點(diǎn)擊網(wǎng)站頂部彩色廣告或者捐贈(zèng)支持本站發(fā)展,謝謝!
總結(jié)
以上是生活随笔為你收集整理的Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从iOS应用中,启动一个Unity Ap
- 下一篇: xcode 写代码没有补全 提示