【Unity 3D】學習筆記三十九:控制組件

來源:互聯網
上載者:User

標籤:unity   character   移動   飛行   角色控制器   

控制組件

角色控制組件和剛體組件都具備物理引擎的功能,需要綁定遊戲對象才能實現相應的物理效果,並且同一個遊戲對象中兩者只能存在一個,不能共存。剛體組件可以非常精確的類比現實世界中的一切物理效果,而角色控制器則沒有那麼精準。


添加角色控制器之前,需要確定是否把角色控制器標準資源套件引入工程,未引人是無法添加角色控制器的。在component——physics——character controller即可添加角色控制器。

添加完後,就需要在指令碼中控制角色控制器組件。首先建立一個遊戲指令碼,然後使用GetComponent<CharacterController>()擷取角色控制器組件對象。接著通過調用SimpleMove( )方法實現角色的移動。

本例通過角色控制器組件來控制立方體對象的選擇和移動,並且感應物理引擎的碰撞:

using UnityEngine;using System.Collections;public class Script_06_05 : MonoBehaviour {//角色控制器對象private CharacterController controller = null;//角色的移動的速度private float moveSpeed = 30.0f;//角色的旋轉速度private float rotateSpeed = 3.0f;void Start(){//擷取角色控制器對象controller = GetComponent<CharacterController>();}void OnGUI(){//控制角色旋轉if(GUILayout.RepeatButton("向左旋轉")){transform.Rotate(0,-rotateSpeed, 0);}if(GUILayout.RepeatButton("向右旋轉")){transform.Rotate(0,rotateSpeed, 0);}//控制角色移動if(GUILayout.RepeatButton("向前移動")){controller.SimpleMove(Vector3.forward * moveSpeed);}if(GUILayout.RepeatButton("向後移動")){controller.SimpleMove(Vector3.forward * -moveSpeed);}if(GUILayout.RepeatButton("向左移動")){controller.SimpleMove(Vector3.right * -moveSpeed);}if(GUILayout.RepeatButton("向右移動")){controller.SimpleMove(Vector3.right * moveSpeed);}}}
運行後:




飛行與移動

角色控制器組件還可以實現飛行和降落的功能,通過move()方法實現,其中的參數是飛行的角度。與simplemove()方法只適用與平面移動不同,move()適用與所有方向的移動。

在開發中,盡量使用move方法,因為它更加靈活。下面的例子便實現立方體的起飛與降落:

using UnityEngine;using System.Collections;public class Script_06_06 : MonoBehaviour {//角色控制器對象private CharacterController controller = null;//角色的移動的速度private float moveSpeed = 3.0f;//角色的旋轉速度private float rotateSpeed = 3.0f;void Start(){//擷取角色控制器對象controller = GetComponent<CharacterController>();}void OnGUI(){//控制角色旋轉if(GUILayout.RepeatButton("向左旋轉")){transform.Rotate(0,-rotateSpeed, 0);}if(GUILayout.RepeatButton("向右旋轉")){transform.Rotate(0,rotateSpeed, 0);}//控制角色移動if(GUILayout.RepeatButton("向前移動")){Vector3 forward = transform.TransformDirection(Vector3.forward);controller.Move(forward*moveSpeed);}if(GUILayout.RepeatButton("向後移動")){Vector3 forward = transform.TransformDirection(Vector3.forward);controller.Move( forward*-moveSpeed);}//控制角色飛行與降落if(GUILayout.RepeatButton("起飛")){transform.Translate(0, 1, 0);   }if(GUILayout.RepeatButton("降落")){transform.Translate(0, -1, 0);   }}}

上述代碼中,注意一點:transform.TransformDirection(  )方法得到當前主角移動時面朝的方向

運行:


點擊起飛:


點擊降落:



碰撞監測

角色控制器可感應遊戲對象之間的碰撞,監測它們碰撞時,需要調用父類方法OnControllerColliderHit(  )方法。

using UnityEngine;using System.Collections;public class Script_06_07 : MonoBehaviour {//角色控制器對象private CharacterController controller = null;//角色的移動的速度private float moveSpeed = 3.0f;//角色的旋轉速度private float rotateSpeed = 3.0f;//碰撞的遊戲對象private GameObject colliderObj = null;void Start(){//擷取角色控制器對象controller = GetComponent<CharacterController>();}void OnGUI(){//控制角色旋轉if(GUILayout.RepeatButton("向左旋轉")){transform.Rotate(0,-rotateSpeed, 0);}if(GUILayout.RepeatButton("向右旋轉")){transform.Rotate(0,rotateSpeed, 0);}//控制角色移動if(GUILayout.RepeatButton("向前移動")){Vector3 forward = transform.TransformDirection(Vector3.forward);controller.Move(forward*moveSpeed);}if(GUILayout.RepeatButton("向後移動")){Vector3 forward = transform.TransformDirection(Vector3.forward);controller.Move( forward*-moveSpeed);}//控制角色飛行與降落if(GUILayout.RepeatButton("起飛")){transform.Translate(0, 1, 0);   }if(GUILayout.RepeatButton("降落")){transform.Translate(0, -1, 0);   } //碰撞中if(controller.collisionFlags == CollisionFlags.Sides){if(colliderObj != null){GUI.color = Color.black;GUI.Label(new Rect(200,100,200,100),"碰撞的遊戲對象為:" + colliderObj.name);}}}void OnControllerColliderHit(ControllerColliderHit hit){//得到碰撞的遊戲對象colliderObj = hit.gameObject;}}
運行後:




【Unity 3D】學習筆記三十九:控制組件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.