【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 ...
随机推荐
- 为什么国内的网盘公司都在 TB 的级别上竞争,成本会不会太高?(还有好多其它回复)
作者:杜鑫链接:http://www.zhihu.com/question/21591490/answer/18762821来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...
- Python函数式编程:内置函数map()使用说明
一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...
- docker学习笔记11:Dockerfile 指令 CMD介绍
我们知道,通过docker run 创建并启动一个容器时,命令的最后可以指定容器启动后在容器内立即要执行的指令,如: docker run -i -t ubunu /bin/bash //表示容器 ...
- VC多线程编程
一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...
- JavaScript 中的日期和时间
前言 本篇的介绍涵盖以下部分: 1. 时间标准指的是什么?UCT和GMT 的概念.关联和区别? 2. 时间表示标准有哪些? 3. JS 中时间的处理 日期时间标准 日期的标准就不多说了 -- 公元纪年 ...
- 对base-adapter-helper的简单分析
在微博上看到了这篇Android ListView适配器应该这样写,受益匪浅. 于是依据文章结尾的介绍来到了base-adapter-helper的github,地址:https://github.c ...
- TROUBLE SHOOTING: FRM-30425
关键字:Oracle Form buider FRM-30425 汇总 错误信息如下: FRM-30425: Summarized database item must reside in a blo ...
- typedef和define
typedef int INT; #define INTPTR1 (int*) typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性. #define是一 ...
- BZOJ 1537: [POI2005]Aut- The Bus(dp + BIT)
对y坐标离散化, 然后按x坐标排序, dp. 一个点(x, y), 设到达这个点接到的最多乘客数为t, 那么t可以用来更新y'>=y的所有点.用树状数组维护最大值. -------------- ...
- 05-IOSCore - 单例模式、KVO
单例模式 是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一 要素: 各个地方都能访问方法 + 静态消息 只要导入类 就能访问 保持唯一 1.在静态消息内限制对象的创建 2.外 ...