zoukankan      html  css  js  c++  java
  • 【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;
    	}
    }
    
    执行后:




  • 相关阅读:
    使用SQL语句对表进行分页查询
    [转]Message Crack Wizard for Win32 SDK Developer
    笔记——《C语言也能干大事》之对话框程序代码
    如何通过C#调用CHM帮助文件,显示到指定页面
    winform 数字输入控件初稿
    用JAVA在读取EXCEL文件时如何判断列隐藏
    css中height:100%不起作用的解决方法 项目个案
    枚举(enum)的常用操作
    转 VirtualBox“please use a kernel appropriate for your cpu”
    Asp.NET导出Excel文件乱码 终极解决方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3903264.html
Copyright © 2011-2022 走看看