码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-20 22:42:23      阅读:307      评论:0      收藏:0      [点我收藏+]

标签: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);
		}
	}
}
运行后:

bubuko.com,布布扣

bubuko.com,布布扣


飞行与移动

角色控制器组件还可以实现飞行和降落的功能,通过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(  )方法得到当前主角移动时面朝的方向

运行:

bubuko.com,布布扣

点击起飞:

bubuko.com,布布扣

点击降落:

bubuko.com,布布扣


碰撞监测

角色控制器可感应游戏对象之间的碰撞,监测它们碰撞时,需要调用父类方法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;
	}
}
运行后:

bubuko.com,布布扣

bubuko.com,布布扣


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

标签:unity   character   移动   飞行   角色控制器   

原文地址:http://blog.csdn.net/u013289188/article/details/37994053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!