控制组件
角色控制组件和刚体组件都具备物理引擎的功能,须要绑定游戏对象才干实现对应的物理效果,而且同一个游戏对象中两者仅仅能存在一个,不能共存。刚体组件能够很精确的模拟现实世界中的一切物理效果,而角色控制器则没有那么精准。
加入角色控制器之前,须要确定是否把角色控制器标准资源包引入project,未引人是无法加入角色控制器的。在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); } } }
执行:
点击起飞:
点击降落:
碰撞监測
角色控制器可感应游戏对象之间的碰撞,监測它们碰撞时,须要调用父类方法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; } }执行后: