前幾篇文章介紹了很多Unity3D引擎自身的一些問題, 今天我們在回到IOS設(shè)備上討論一些觸摸屏幕手勢,本章的目標(biāo)是通過觸摸iPhone屏幕手勢 實現(xiàn)模型左右的旋轉(zhuǎn),與模型的縮放。
前幾篇文章介紹了很多Unity3D引擎自身的一些問題, 今天我們在回到IOS設(shè)備上討論一些觸摸屏幕手勢,本章的目標(biāo)是通過觸摸iPhone屏幕手勢 實現(xiàn)模型左右的旋轉(zhuǎn),與模型的縮放。
大家想一想模型的旋轉(zhuǎn),實際上是鏡頭的旋轉(zhuǎn)。模型的縮放實際上是鏡頭Z軸方向的坐標(biāo)。那么實現(xiàn)本章的內(nèi)容只需要控制鏡頭的位置方可實現(xiàn)。
我們在游戲場景中創(chuàng)建一些簡單的模型做為參照物,插一句 “大家有誰知道 . FBX 的模型那里可以免費找到,我想在博文中加點游戲模型讓場景更好看一些,可是苦于找不到有點郁悶,用公司的模型來寫博文有覺得有點不合適”哇咔咔 ,如果有知道的哥們 不妨告訴我喔。啦啦啦。
我們創(chuàng)建一個簡單的游戲平面, 然后平面中放一個箱子做為旋轉(zhuǎn)縮放的參照物。如下圖所示,選中攝像機,給攝像機添加一個腳本名稱為Move. 腳本中有一個參數(shù) Target,它的作用是設(shè)置攝像頭旋轉(zhuǎn)移動參照物,這里把一個箱子賦值給了 Target,那么左右滑動屏幕會發(fā)現(xiàn)箱子在旋轉(zhuǎn),兩手縮放屏幕會發(fā)現(xiàn)箱子在放大與縮小。
我們看看Move這條腳本,說明一下幾個重要的 :
這些方法都是系統(tǒng)自己調(diào)用的方法
function Start () : 游戲啟動以后只調(diào)用一次,可用于腳本的初始化操作,
function Update ():Start()方法調(diào)用結(jié)束以后每一幀都會調(diào)用,可以在這里更新游戲邏輯。
function LateUpdate (): Start()方法調(diào)用結(jié)束以后每一幀都會調(diào)用,但是它是在 Update()調(diào)用完后調(diào)用。
Move.js完整代碼
[代碼]js代碼:
002 |
var target : Transform; |
014 |
//記錄上一次手機觸摸位置判斷用戶是在左放大還是縮小手勢 |
015 |
private var oldPosition1 : Vector2; |
016 |
private var oldPosition2 : Vector2; |
021 |
var angles = transform.eulerAngles; |
025 |
// Make the rigid body not change rotation |
027 |
rigidbody.freezeRotation = true; |
034 |
if(Input.touchCount == 1) |
037 |
if(Input.GetTouch(0).phase==TouchPhase.Moved) |
040 |
x += Input.GetAxis("Mouse X") * xSpeed * 0.02; |
041 |
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02; |
047 |
if(Input.touchCount >1 ) |
050 |
if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved) |
052 |
//計算出當(dāng)前兩點觸摸點的位置 |
053 |
var tempPosition1 = Input.GetTouch(0).position; |
054 |
var tempPosition2 = Input.GetTouch(1).position; |
055 |
//函數(shù)返回真為放大,返回假為縮小 |
056 |
if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2)) |
058 |
//放大系數(shù)超過3以后不允許繼續(xù)放大 |
059 |
//這里的數(shù)據(jù)是根據(jù)我項目中的模型而調(diào)節(jié)的,大家可以自己任意修改 |
066 |
//縮小洗漱返回18.5后不允許繼續(xù)縮小 |
067 |
//這里的數(shù)據(jù)是根據(jù)我項目中的模型而調(diào)節(jié)的,大家可以自己任意修改 |
074 |
oldPosition1=tempPosition1; |
075 |
oldPosition2=tempPosition2; |
082 |
//函數(shù)返回真為放大,返回假為縮小 |
083 |
function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean |
085 |
//函數(shù)傳入上一次觸摸兩點的位置與本次觸摸兩點的位置計算出用戶的手勢 |
086 |
var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y)); |
087 |
var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y)); |
099 |
//Update方法一旦調(diào)用結(jié)束以后進入這里算出重置攝像機的位置 |
100 |
function LateUpdate () { |
102 |
//target為我們綁定的箱子變量,縮放旋轉(zhuǎn)的參照物 |
106 |
y = ClampAngle(y, yMinLimit, yMaxLimit); |
107 |
var rotation = Quaternion.Euler(y, x, 0); |
108 |
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position; |
110 |
transform.rotation = rotation; |
111 |
transform.position = position; |
116 |
static function ClampAngle (angle : float, min : float, max : float) { |
121 |
return Mathf.Clamp (angle, min, max); |
在Untiy3D 中運行用鼠標(biāo)手勢點擊上看不到任何效果的,必需在iPhone真機上才可以觸摸感應(yīng)到效果喔 . 嘻嘻~
OK 接下來將Unity3D 導(dǎo)出成Xcode項目,導(dǎo)出的方法有誰還不會??? 我的第一篇文章有說明噢。哇咔咔~~ 然后運行項目只能在真機上運行哦。。 看看我在iPhone 上的截圖。
觸摸iPhone屏幕鏡頭旋轉(zhuǎn)與縮放以后的效果,這個圖確實有點不太好截,我一會把項目的源代碼工程下載地址貼上來,方便大家閱讀與學(xué)習(xí),哇咔咔~~
鏡頭任意的旋轉(zhuǎn)與縮放,還不錯噢,大家快點來學(xué)習(xí)Unity3D游戲開發(fā)吧,哇咔咔~~