標籤: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】學習筆記三十九:控制組件