首页 > 代码库 > 【Unity 3D】学习笔记三十九:控制组件

【Unity 3D】学习笔记三十九:控制组件

控制组件

角色控制组件和刚体组件都具备物理引擎的功能,须要绑定游戏对象才干实现对应的物理效果,而且同一个游戏对象中两者仅仅能存在一个,不能共存。刚体组件能够很精确的模拟现实世界中的一切物理效果,而角色控制器则没有那么精准。


加入角色控制器之前,须要确定是否把角色控制器标准资源包引入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);   
	
		}
	}
}

上述代码中,注意一点: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;
	}
}
执行后: