【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;
}
}
执行后:
【Unity 3D】学习笔记三十九:控制组件的更多相关文章
- tensorflow学习笔记(三十九):双向rnn
tensorflow 双向 rnn 如何在tensorflow中实现双向rnn 单层双向rnn 单层双向rnn (cs224d) tensorflow中已经提供了双向rnn的接口,它就是tf.nn.b ...
- angular学习笔记(三十)-指令(2)-restrice,replace,template
本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
- angular学习笔记(三十)-指令(7)-compile和link(1)
这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
- angular学习笔记(三十)-指令(5)-link
这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...
- 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView
目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...
随机推荐
- 关于QuartusII对ram块的综合
之前在看Altera的官方教程上就有说明,如果我们定义一个reg [`word_w]user_ram[`word_d] ; QuartusII会自动综合成为一个ram—— 当然有一些前提:(后续补充 ...
- Android studio多个项目之间怎么实现快速切换?
Android studio多个项目之间怎么实现快速切换?Android studio中打开的项目太多了,想切换到一个项目很麻烦,怎么才能快速切换到另一个项目中呢?请看下文详细介绍 在对Android ...
- 解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...
- Debian 7 下载
Debian 7 DOWNLOAD http://cdimage.deb ...
- sql2008r2局域网复制订阅实操
10.129.186.37 本机 10.129.186.95 服务器 局域网环境 复制类型:事务复制 注意点:要复制的表,必须有主键,否则不可选复制表. 要点1,局域网尝试用共享的方式保存快照文件夹, ...
- Struts2 学习笔记17 I18N国际化
讲解一下国际化的内容,比如书有些大的网站可以一键切换语言,例如中英切换,这时候就会用到国际化.但是由于struts2大多数是用来写后台,国际化并不是十分重要,而且用国际化开发会减慢开发的速度,大家只要 ...
- 使用Xshell生成key,避免password登录linux
我们通常Xshell使用命令ssh user@ip远程登录linux,这将促使我们进入password更麻烦的,通缉免费password日志的话,我们可以生成相应的key.然后把遥控器server上, ...
- C# - 委托_ 匿名方法
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- C#的事件处理机制
链接地址:http://blog.csdn.net/niuox/article/details/7527876 在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否 ...
- 百度地图api基本用法
首先 ,如果想调用百度地图api,你需要获取一个百度地图api的密钥. 申请密钥很简单,在百度地图api的首页就有相关链接,填写相关信息百度就会给你一个密钥了. 接下来,就是引入百度地图的api 关键 ...