- Unity 4 3D開發實戰詳解
- 峰 杜化美 張月霞 索依娜編著
- 547字
- 2019-01-01 21:15:10
4.3 常用的輸入對象
有一點游戲開發經驗的讀者都知道,游戲開發中經常需要獲取用戶的輸入情況,主要包括與觸控動作相關的各個參數和按鍵的情況等。在一般的開發平臺下,開發人員需要編寫不少代碼才能完成此項工作,而Unity 3D在設計平臺時就充分考慮到了這一點。
針對這方面的需要,專門為開發人員提供了兩個輸入對象——Touch與Input。開發人員通過Touch與Input輸入對象可以非常方便地獲取用戶輸入的各種參數,包括觸控的位置、按下的移動的位置、是哪個鍵等。下面將一一進行介紹。
4.3.1 Touch輸入對象
在Unity中使用Touch輸入對象來獲取觸控動作相關的各個參數。由于Unity 3D是跨平臺的,而現今流行的Android平臺和iPhone平臺都是基于屏幕觸控的,因此Touch輸入對象是開發過程中經常遇到的問題,也是較難解決的問題。
解決Touch輸入對象可以將Touch代碼寫在相應的腳本中,把腳本掛載到相應的游戲對象上即可。Unity提供了豐富的Touch事件的變量,下面將對Touch事件的變量進行詳細介紹,具體的變量信息如表4-53所示。
表4-53 Touch輸入對象的變量

各個變量在開發過程中將會一起相互配合使用,只有各個變量的相互配合才能解決實際的問題,具體實現如下面的代碼片段所示:
1 var speed : float = 0.1; //定義一個浮點型速度變量
2 function Update () { //聲明Update變量
3 if (Input.touchCount > 0 && //如果觸控點大于0
4 Input.GetTouch(0).phase == TouchPhase.Moved) { //如果當前事件的狀態是移動5 //創建一個坐標touchDeltaPosition并讀取離開觸控時點的坐標
6 var touchDeltaPosition:Vector2 = Input.GetTouch(0).deltaPosition;
7 transform.Translate (-touchDeltaPosition.x * speed,
8 -touchDeltaPosition.y * speed, 0); //移動一定的距離
9 } }
在游戲開發過程中還經常會遇到這樣的觸控問題,例如,子彈的生成與發射。當觸控發射按鈕就會生成一個子彈發射出去,這個在射擊類游戲中是必不可少的環節,因此這樣的觸控問題也是必須解決的,具體實現如下面的代碼片段所示:
1 var projectile : GameObject; //聲明一個子彈的游戲對象
2 function Update () { //聲明Update方法
3 for (var i = 0; i < Input.touchCount; ++i) { //對觸控點進行循環
4 if (Input.GetTouch(i).phase == TouchPhase.Began) {//如果觸控的狀態時開始觸控
5 clone = Instantiate (projectile, transform.position, transform.rotation);//實例化一個子彈的游戲對象
6 } } }
在一些游戲開發過程還會在屏幕的固定區域塊設置觸控事件,因此對觸控區域的劃分也是經常要面對的問題,下面就對觸控區域的劃分進行用代碼講解,具體實現如下面的代碼片段所示:
1 function Update(){ //聲明Update方法
2 //如果觸控點大于0并且當前觸控事件的狀態是開始觸控
3 if(Input.touchCount>0&&Input.GetTouch(0).phase==TouchPhase.Began) {
4 var tposition=Input.GetTouch(0).position; //則聲明一個變量并記錄當前的觸控位置
5 //設置第一個矩形觸控區域
6 if(tposition.x<=250&&tposition.x>=60&&tposition.y>=700&&tposition.y<=820 ){
7 dateOrScore=0; //將標志位dateOrScore置0
8 }//設置第一個矩形觸控區域
9 if(tposition.x<=500&&tposition.x>=270&&tposition.y>=700&&tposition.y<=820 ){
10 dateOrScore=1; //將標志位dateOrScore置1
11 } } }
4.3.2 Input輸入對象
Input輸入對象作為系統輸入的接口,是外部事件信息與系統聯系的紐帶與橋梁,是一個項目所必須存在的,也是項目開發所必須解決的問題,因此,Input輸入對象是開發過程中經常遇到的問題和必須解決的問題。
解決Input輸入對象可以將Input代碼寫在相應的腳本中,把腳本掛載到相應的游戲對象上即可。Unity 提供了豐富的Input輸入對象的變量和方法,下面將對Input輸入對象的變量進行詳細介紹,具體的變量信息如表4-54所示。
表4-54 Input事件的主要變量

下面將對各個變量進行詳細介紹,將用真實的代碼片段對變量的用法和用途進行講解。
1.mousePosition變量
mousePosition變量是二維或三維的空間坐標,其一般需要用靜態變量聲明,如下面的代碼片段所示:
static var mousePosition : Vector3 ; //聲明mousePosition變量
當前鼠標光標位置的像素坐標是以屏幕或者窗口的左下角為(0,0),屏幕或窗口的右上角的坐標為(Screen.width,Screen.height)。
下面將用一段機槍開火的代碼片段來說明mousePosition變量具體的用法與用途,具體實現如下面的代碼片段所示:
1 var particle : GameObject; //聲明一個子彈的游戲對象
2 function Update () { //聲明Update方法
3 if (Input.GetButtonDown ("Fire1")) { //判斷開火按鈕是否被按下
4 var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);// 構建一個當前位置的攝像機
5 if (Physics.Raycast (ray)) {
6 Instantiate (particle, transform.position, transform.rotation);// 實例化一個子彈
7 } } }
2.anyKey變量
anyKey變量是對當前鍵的持有權進行判定,其一般需要用靜態變量聲明,如下面的代碼片段所示:
static var anyKey : boolean; //聲明靜態的anyKey變量
下面將用一段代碼片段來說明anyKey變量具體的用法與用途,具體實現如下面的代碼片段所示:
1 function Update() { //聲明Update方法
2 if(Input.anyKey) //對鍵的持有權進行判定
3 Debug.Log("A key or mouse click has been detected");//若具有持有權,則打印消息
4 }
3.anyKeyDown變量
anyKeyDown變量是用戶單擊任何鍵或者鼠標按鈕的標志,若單擊則返回第一幀為true,其一般需要用靜態變量聲明,如下面的代碼片段所示:
static var anyKeyDown : boolean; //聲明anyKeyDown變量
下面將用一段代碼片段來說明anyKeyDown變量具體的用法與用途,具體實現如下面的代碼片段所示:
1 function Update() { //聲明Update方法
2 if(Input.anyKeyDown) //對當前鍵是否被按下進行判定
3 Debug.Log("A key or mouse click has been detected");//若被按下則打印消息
4 }
4.inputString變量
inputString 變量是返回鍵盤輸入的字符串,在項目開發的過程中也會遇到從鍵盤中輸入命令來執行一些操作,一次對鍵盤輸入的字符串就應該進行一系列操作,因此就需要inputString變量將鍵盤輸入的字符串記錄下來,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 for (var c : char in Input.inputString) { //對輸入的字符串進行循環遍歷
3 //如果遍歷的字符c為\b 則執行下面的操作
4 if (c == "\b"[0]) {
5 if (guiText.text.Length != 0) //對guiText的文本長度判斷是否為0
6 guiText.text = guiText.text.Substring(0, guiText.text.Length - 1);//若長度不為0,
7 }
8 //如果遍歷的字符c為\ n或者為\r,則執行下面的操作
9 else if (c == "\n"[0] || c == "\r"[0]) {
10 print ("User entered his name: " + guiText.text); //打印提示信息
11 }
12 //若果不是上面判斷的字符,則執行下面的操作
13 else {
14 guiText.text += c; //在guiText的文本內容后面添加上字符c
15 } } }
5.acceleration變量
acceleration變量是確定當前在三維坐標空間的線性加速度。在一些3D游戲的開發過程中也會遇到這樣的問題,就是讀取當前在三維坐標空間的線性加速度,以用來確定游戲下一步該怎么走,下面將用代碼說明如何確定三維坐標空間的線性加速度以及各個坐標的分量,具體實現如下面的代碼片段所示:
1 var speed = 10.0; //聲明速度變量等于10.0
2 function Update () { //聲明Update方法
3 var dir : Vector3 = Vector3.zero; //確定一個三維空間坐標
4 dir.x = -Input.acceleration.y; //獲取當前三維空間坐標x軸的加速度分量
5 dir.z = Input.acceleration.x; //獲取當前三維空間坐標z軸的加速度分量
6 if (dir.sqrMagnitude > 1) //對加速度數值進行判斷
7 dir.Normalize();
8 dir *= Time.deltaTime; //獲取當前時間
9 transform.Translate (dir * speed); //按指定的速度移動
10 }
6.touches變量
touches變量是聲明觸控動作,從而確定一些觸控動作的狀態以及所要解決的問題,由于觸控動作是項目開發過程中經常要面對和要解決的問題,因此 touches 變量也會經常用到,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 var fingerCount = 0; //聲明計數器fingerCount
3 for (var touch : Touch in Input.touches) { //對觸控事件進行循環
4 if (touch.phase != TouchPhase.Ended && touch.phase != TouchPhase.Canceled)//對觸控事件進行判定
5 fingerCount++; //計數器自加
6 }
7 if (fingerCount > 0) //對計數器進行判定
8 print ("User has " + fingerCount + " finger(s) touching the screen");//打印說明信息
9 }
Input輸入對象不僅擁有豐富的變量,而且還提供了大量的方法,下面將對Input輸入對象的方法進行詳細的介紹,具體的方法信息如表4-55所示。
表4-55 Input輸入對象的主要方法

下面將對各個方法進行詳細的介紹,將用真實的代碼片段對方法的用法和用途進行講解。
1.GetAxis方法
GetAxis 方法的作用是返回被標識的虛擬軸的值。這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetAxis (axisName : String) : float; //聲明靜態的GetAxis方法
在開發過程中經常會在屏幕中添加一些 2D 的虛擬軸,可以通過觸控事件或者鼠標事件改變虛擬軸的值來控制場景中的游戲對象的變換狀態。因此GetAxis方法在開發過程中也會經常用到,首先講述觸控事件下的應用,具體實現如下面的代碼片段所示:
1 var speed : float = 10.0; //聲明一個初始值為10.0的浮點型變量speed
2 var rotationSpeed : float = 100.0; //聲明一個初始值為100.0的浮點型變量rotationSpeed
3 function Update () { //聲明Update方法
4 var translation : float = Input.GetAxis ("Vertical") * speed;//為聲明的變量translation賦初值
5 var rotation : float = Input.GetAxis ("Horizontal") * rotationSpeed;//為聲明的變量rotation賦初值
6 translation *= Time.deltaTime;//變量translation等于translation乘以當前時間
7 rotation *= Time.deltaTime; //變量rotation等于rotation乘以當前時間
8 transform.Translate (0, 0, translation); //使游戲對象移動給的距離
9 transform.Rotate (0, rotation, 0); //使游戲對象旋轉給的度數
10 }
上面說明了在觸控事件下的GetAxis方法,但是很多時候也會用到鼠標事件,下面就是鼠標事件下的應用,具體實現如下面的代碼片段所示:
1 var horizontalSpeed : float = 2.0; //聲明一個初始值為2.0的浮點型變量horizontalSpeed
2 var verticalSpeed : float = 2.0; //聲明一個初始值為2.0的浮點型變量verticalSpeed
3 function Update () { //聲明Update方法
4 var h : float = horizontalSpeed * Input.GetAxis ("Mouse X");//為聲明的變量h賦初值
5 var v : float = verticalSpeed * Input.GetAxis ("Mouse Y");//為聲明的變量v賦初值
6 transform.Rotate (v, h, 0); //使游戲對象旋轉給的度數
7 }
2.GetAxisRaw方法
GetAxisRaw方法的作用是返回被標識的虛擬軸的值與不平滑濾波應用,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetAxisRaw (axisName : String) : float; //聲明靜態的GetAxisRaw方法
GetAxisRaw方法也是虛擬軸的一個特殊應用,其具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 var speed : float = Input.GetAxisRaw("Horizontal") * Time.deltaTime;//對聲明的變量speed賦值
3 transform.Rotate (0, speed, 0); //使游戲對象旋轉給定的度數
4 }
3.GetButton方法
GetButton方法的作用是如果虛擬按鈕被按下則返回true,由此進行一些事件的判定。這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetButton (buttonName : String) : boolean; //聲明靜態的GetButton方法
例如一個射擊類游戲,經常會在屏幕上設一個虛擬按鈕作為子彈的發射按鈕,在此就用這個功能的代碼片段來講解GetButton方法的使用,具體實現如下面的代碼片段所示。
1 var projectile : GameObject; //聲明一個子彈的游戲對象
2 var fireRate : float = 0.5; //聲明一個初始值為0.5的浮點型變量fireRate
3 private var nextFire : float = 0.0; //聲明一個初始值為0.0的浮點型私有變量nextFire
4 function Update () { //聲明Update方法
5 if (Input.GetButton ("Fire1") && Time.time > nextFire) {//對按鈕Fire1和時間進行判定
6 nextFire = Time.time + fireRate; //變量nextFire等于當前時間加上變量fireRate
7 //聲明一個游戲對象clone,并將實例化的子彈賦給clone
8 var clone : GameObject =Instantiate(projectile, transform.position, transform.rotation) as GameObject;
9 } }
4.GetButtonDown方法
GetButtonDown 方法的作用是當虛擬按鈕在被按下的狀態時被調用并返回 true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetButtonDown (buttonName : String) : boolean;//聲明靜態的GetButtonDown方法
GetButtonDown方法也是GetButton方法的一個特殊表現形態,其具體的使用方法與GetButton方法差不多,只是在按鈕的不同狀態下返回對應的值,具體實現如下面的代碼片段所示:
1 var projectile : GameObject; //聲明一個子彈的游戲對象
2 function Update () { //聲明Update方法
3 if (Input.GetButtonDown ("Fire1")) { //判斷是否被按下Fire1按鈕
4 Instantiate (projectile, transform.position, transform.rotation);//若被按下,則實例化一個子彈
5 } }
5.GetButtonUp方法
GetButtonUp方法的作用是當虛擬按鈕在被抬起的狀態時被調用并返回true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetButtonUp (buttonName : String) : boolean;//聲明靜態的GetButtonUp方法
GetButtonUp方法也是GetButton方法的一個特殊表現形態,其具體的使用方法與GetButton方法差不多,只是在按鈕的不同狀態下返回對應的值,具體實現如下面的代碼片段所示:
1 var projectile : GameObject; //聲明一個子彈的游戲對象
2 function Update () { //聲明Update方法
3 if (Input.GetButtonUp ("Fire1")) { //判斷是否被抬起Fire1按鈕
4 Instantiate (projectile, transform.position, transform.rotation);//若被抬起,則實例化一個子彈
5 } }
6.GetKey方法
GetKey方法的作用是如果用戶通過鍵名而獲得的按鍵狀態為按下時返回true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,而且還有兩種聲明方法,分別是通過鍵名和鍵碼來獲得指定鍵,首先講解用鍵名來聲明,具體的方法聲明如下面代碼片段所示:
static function GetKey (name : String) : boolean; //聲明靜態的GetKey方法
下面用一些具體的代碼片段來講解用鍵名來聲明GetKey方法,具體使用如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKey ("up")) //判斷是否得到鍵名up
3 print ("up arrow key is held down"); //打印提示信息
4 if (Input.GetKey ("down")) //判斷是否得到鍵名down
5 print ("down arrow key is held down"); //打印提示信息
6 }
再次講解一下用鍵碼來獲得指定的鍵,其一般的聲明也是靜態的,具體的方法聲明如下面代碼片段所示:
static function GetKey (key : KeyCode) : boolean; //聲明靜態的GetKey方法
下面用一些具體的代碼片段來講解用鍵碼來聲明GetKey方法,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKey (KeyCode.UpArrow)) //判斷是否得到鍵碼UpArrow
3 print ("up arrow key is held down"); //打印提示信息
4 if (Input.GetKey (KeyCode.DownArrow)) //判斷是否得到鍵碼DownArrow
5 print ("down arrow key is held down") //打印提示信息
6 }
7.GetKeyDown方法
GetKeyDown 方法的作用是如果用戶通過鍵名而獲得鍵值并在開始按下鍵時返回 true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,而且還有兩種聲明方法,分別是通過鍵名和鍵碼來獲得指定鍵,首先講解用鍵名來聲明,具體的方法聲明如下面代碼片段所示:
static function GetKeyDown (name : String) : Boolean; //聲明靜態的GetKeyDown方法
下面用一些具體的代碼片段來講解用鍵名來聲明GetKeyDown方法,具體使用如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKeyDown ("space")) //判斷是否得到鍵名space
3 print ("space key was pressed"); //打印提示信息
4 }
再次講解一下用鍵碼來獲得指定的鍵,其一般的聲明也是靜態的,具體的方法聲明如下面代碼片段所示:
static function GetKeyDown (key : KeyCode) : boolean; //聲明靜態的GetKeyDown方法
下面用一些具體的代碼片段來講解用鍵碼來聲明GetKeyDown方法,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKeyDown (KeyCode.Space)) //判斷是否得到鍵碼Space
3 print ("space key was pressed"); //打印提示信息
4 }
8.GetKeyUp方法
GetKeyUp方法的作用是如果用戶通過鍵名而獲得鍵的并在開始抬起鍵時返回true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,而且還有兩種聲明方法,分別是通過鍵名和鍵碼來獲得指定鍵,首先講解用鍵名來聲明,具體的方法聲明如下面代碼片段所示:
static function GetKeyUp (name : String) : boolean ; //聲明靜態的GetKeyDown方法
下面用一些具體的代碼片段來真正講解用鍵名來聲明GetKeyUp方法,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKeyUp ("space")) //判斷是否得到鍵名space
3 print ("space key was released"); //打印提示信息
4 }
再次講解一下用鍵碼來獲得指定的鍵,其一般的聲明也是靜態的,具體的方法聲明如下面代碼片段所示:
static function GetKeyUp (key : KeyCode) : boolean; //聲明靜態的GetKeyDown方法
下面用一些具體的代碼片段來講解用鍵碼來聲明GetKeyUp方法,具體實現如下面的代碼片段所示:
1 function Update () { //聲明Update方法
2 if (Input.GetKeyUp (KeyCode.Space)) //判斷是否得到鍵碼Space
3 print ("space key was released"); //打印提示信息
4 }
9.GetMouseButton方法
GetMouseButton方法的作用是返回指定的鼠標按鈕是否被按下,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,具體的方法聲明如下面代碼片段所示:
static function GetMouseButton (button : int) : boolean;//聲明靜態的GetMouseButton方法
下面用一個簡單的例子來講解一下GetMouseButton方法及具體使用,首先是聲明3個鼠標按鈕,Left Button的鍵值為0,Right Button的鍵值為 1,Middle Button的鍵值為3,通過獲得鍵值來執行相應的操作。具體實現如下面的代碼片段所示:
1 function Update() { //聲明Update方法
2 if(Input.GetMouseButton(0)) //判斷是否具有鍵值為0的鼠標按鈕持有權
3 Debug.Log("Pressed left click."); //打印提示信息
4 if(Input.GetMouseButton(1)) //判斷是否具有鍵值為1的鼠標按鈕持有權
5 Debug.Log("Pressed right click."); //打印提示信息
6 if(Input.GetMouseButton(2)) //判斷是否具有鍵值為2的鼠標按鈕持有權
7 Debug.Log("Pressed middle click."); //打印提示信息
8 }
10.GetMouseButtonDown方法
GetMouseButtonDown方法的作用是若指定的鼠標按鈕被按下則返回true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetMouseButtonDown (button : int) : boolean;//聲明靜態的GetMouseButtonDown方法
下面依然用上面的例子來對GetMouseButtonDown方法進行說明,即首先是聲明3個鼠標按鈕,Left Button的鍵值為0,Right Button的鍵值為 1,Middle Button的鍵值為3,通過獲得鍵值來執行相應的操作。具體實現如下面的代碼片段所示:
1 function Update() { //聲明Update方法
2 if(Input.GetMouseButtonDown(0)) //對鼠標按下鍵值為0的按鈕事件進行判定
3 Debug.Log("Pressed left click."); //打印提示信息
4 if(Input.GetMouseButtonDown(1)) //對鼠標按下鍵值為0的按鈕事件進行判定
5 Debug.Log("Pressed right click."); //打印提示信息
6 if(Input.GetMouseButtonDown(2)) //對鼠標按下鍵值為0的按鈕事件進行判定
7 Debug.Log("Pressed middle click."); //打印提示信息
8 }
11.GetMouseButtonUp方法
GetMouseButtonUp方法的作用是若指定的鼠標按鈕被抬起時則返回true,由此來判定一些事件的進展,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetMouseButtonUp (button : int) : boolean;//聲明靜態的GetMouseButtonUp方法
下面依然用上面的例子來對GetMouseButtonUp方法進行說明,即首先是聲明3個鼠標按鈕, Left Button的鍵值為0,Right Button的鍵值為1,Middle Button的鍵值為3,通過獲得鍵值來執行相應的操作。具體實現如下面的代碼片段所示:
1 function Update() { //聲明Update方法
2 if(Input.GetMouseButtonUp(0)) //對鼠標抬起鍵值為0的按鈕事件進行判定
3 Debug.Log("Pressed left click."); //打印提示信息
4 if(Input.GetMouseButtonUp(1)) //對鼠標抬起鍵值為1的按鈕事件進行判定
5 Debug.Log("Pressed right click."); //打印提示信息
6 if(Input.GetMouseButtonUp(2)) //對鼠標抬起鍵值為2的按鈕事件進行判定
7 Debug.Log("Pressed middle click."); //打印提示信息
8 }
12.GetTouch方法
GetTouch方法的作用是返回當前觸控事件的觸控狀態,這個方法的聲明一般都是靜態的,具體的方法聲明如下所示:
static function GetTouch (index : int) : Touch; //聲明靜態的GetTouch方法
在游戲開發過程中還經常會遇到這樣的觸控問題,例如是子彈的生成與發射,當觸控發射按鈕就會生成一個子彈發射出去,這個在射擊類游戲中是必不可少的環節,因此這樣的觸控問題也是必須解決的,這時就必須用到GetTouch方法,具體實現如下面的代碼片段所示:
1 var particle : GameObject; //聲明一個子彈的游戲對象
2 function Update () { //聲明Update方法
3 for (var i = 0; i < Input.touchCount; ++i) { //對觸控點進行循環
4 if (Input.GetTouch(i).phase == TouchPhase.Began){//判斷觸控事件是否為剛開始觸控
5 //創建一條垂直于屏幕觸控點的射線ray
6 var ray = Camera.main.ScreenPointToRay (Input.GetTouch(i).position);
7 if (Physics.Raycast (ray)) {//是否觸控到射線ray
8 //若觸控到,則實例化子彈
9 Instantiate (particle, transform.position, transform.rotation);
10 } } } }