标签: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); } } }
运行:
点击起飞:
点击降落:
碰撞监测
角色控制器可感应游戏对象之间的碰撞,监测它们碰撞时,需要调用父类方法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 character 移动 飞行 角色控制器
原文地址:http://blog.csdn.net/u013289188/article/details/37994053