【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 ...
随机推荐
- django学习之Model(三)QuerySet
接下来主要学习Models中的Making queries 写好models.py后,django会自动提供一个数据库的抽象API,来实现CRUD(create, retrieve, update, ...
- struts2--配置文件中使用通配符
struts2的配置文件是 struts.xml.. 在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性.. 使用通配符的原则是 约定高于配置 ...
- validform 一行代码完成所有验证
validform一行代码完成所有验证 在使用的时候想更改提示效果为右侧提示却一直不能成功 tiptype可以为1.2 和 自定义函数.2 表示右侧提示. 注意:tiptype为 2 时,各表单元素对 ...
- Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactory
Error creating bean with name ‘org.springframework.validation.beanvalidation.LocalValidatorFactoryBe ...
- awk 工具简介NF-NR
相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理. 因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的:[root@linu ...
- Linux less命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- 怎样让js不产生冲突,避免全局变量的泛滥,合理运用命名空间
为了避免变量之间的覆盖与冲突.能够生成命名空间.命名空间是一种特殊的前缀,在js中,通过{ }对象实现. 在不同的匿名函数中,依据功能声明一个不同的命名空间,每一个匿名函数中GLOBAL对象的属性都不 ...
- javascript操作元素的css样式
我们经常要使用Javascript来改变页面元素的样式.当中一种办法是改变页面元素的CSS类(Class),这在传统的Javascript里,我们一般是通过处理HTML Dom的classname特性 ...
- 哈,又一款超级简单的队列(MQ)实现方案来了~
开源的消息队列已经很多了,但大部分很重,实际环境下,很多可能只是使用到了一点功能而已,杀鸡使用牛刀,着实有些浪费了.很多时候,我们只想要一片绿叶,但它们给了我们整个的春天,很难消化.本着DIR精神, ...
- EasyUI - DataGrid 组建 - [ 删除,修改 ]
效果: html代码: <div style="padding-top: 50px; width: 800px; margin: 0 auto;"> <!--使用 ...