[原]Unity3D深入浅出 - 脚本开发基础(Scripts)
常用脚本事件:
Update:每帧调用一次
Start:在第一次Update执行前调用
Awake:脚本实例在创建时调用
FixedUpdate:每个固定物理时间间隔调用一次
LateUpdate:每帧调用一次,在Update之后
MonoBehaviour类:
MonoBehaviour类是uniyt中非常重要的类,定义了基本的脚本行为,所有脚本类均需要从它直接或间接继承。MonoBehaviour还定义了对各种特定事件的响应函数,这些函数名均以On作为开头,下面是一些常用的事件响应函数。
OnMouseEnter:鼠标移入GUI控件或碰撞体时调用
OnMouseOver:鼠标停留~~~
OnMouseExit:鼠标移除~~~
OnMouseDown:鼠标按下~~~~
OnMouseUp:鼠标释放~~~
OnTriggerEnter:当其他碰撞体进入触发器时调用
OnTriggerExit:~~~~~~~~离开~~~~~~~~
OnTriggerStay:~~~~~~~停留~~~~~~~~~
OnCollisionEnter:当碰撞体或者刚体与其他碰撞体或者刚体接触时调用
OnCollisionExit:~~~~~~~~~~~~~~~~~~~~~~~~离开时~~~
OnCollisionStay:~~~~~~~~~~~~~~~~~~~~~~~~保持接触时~~~
OnControllerColliderHit:当控制器移动时与碰撞体发生碰撞时调用
OnBecameVisible:对于任意一个相机可见时调用
OnBecameInvisible:对于任意一个相机不可见时调用
OnEnable:对象启用或者激活时调用
OnDisable:对象禁用或者取消激活时调用
OnDestory:脚本销毁时调用
OnGUI:渲染GUI和处理GUI消息时调用
脚本和组件交互:
一个对象由若干个组件组成,通常需要利用脚本来访问对象的各种组件并设置组件的参数。对于系统内置的常用组建,Unity提供了非常便利的访问方式,只需要在脚本里访问组件对应的成员变量即可,这些成员变量定义在MonoBehaviour中并被脚本继承了下来。
常用组件以及对应的变量如下。
| 组件名称 | 变量名 | 组件作用 |
| Tranform | tranform | 设置对象的位置,旋转,缩放 |
| Rigidbody | rigidbody | 设置物理引擎的刚体属性 |
| Renderer | renderer | 渲染物体模型 |
| Light | light | 设置灯光属性 |
| Camera | camera | 设置相机属性 |
| Collider | collider | 设置碰撞体属性 |
| Animation | animation | 设置动画属性 |
| Audio | audio | 设置声音属性 |
注意:如果对象上不存在某组件,则返回null。
访问不属于商标中列出的组件,或者是访问对象上的脚本(脚本属于自定义组件),通过如下方式访问来得到组件的引用:
GetComponent :得到组件
GetComponents:得到组件列表
GetComponentlnChildren:得到对象或对象子物体上的组件
GetComponentsInChildren:得到对象或对象子物体上的组件列表
注意:这几个函数都比较耗时,因此一般不要在Update函数中使用,应该在外部定一个接受组件引用的对象,在Start函数中使用GetComponent函数来获取组件引用。
示例:在一个cube里有一个move.cs脚本,在move.cs脚本中获cube的Tranform组件
Tranform c_tranform;
Move move;
void Start(){
//第一种方式
c_tranform = tranform;
//第二种方式
c_tranform = GetComponent<Transform>(); move = GetComponent<Move>();
} void Update{
}
访问场景中的对象:
在unity3d开发中,脚本不但需要访问脚本所在对象的组件,还经常需要访问其他的对象:
1.通过名称来查找:使用函数GameObject.Find,如果场景中存在指定名称的对象,则返回该对象的引用,否则返回null,如果存在多个同名的对象,则返回第一个对象的引用。
GameObject cube = GameObject.Find("MyCube");
2.通过标签来查找:GameObject.FindWithTag,如果场景中存在指定标签的对象,则返回该对象的引用,否则返回null,如果多个对象使用同一个标签,则返回第一个对象的引用。
注意:与GetComponent一样,GameObject.Find和GameObject.FindWithTag也是比较耗时的参数,因此不建议在update函数中调用它们,而是在初始化中查找一次后保存在变量中。
协同程序(Coroutine):
Coroutine也成为协同程序或协程,可以和主程并行运行,和多线程类似,但是在任一制定时刻只会有一个协同程序在运行,别的协同程序则会挂起。可以用来实现让一段程序等待一段时间后继续运行的效果。
协同程序(Coroutine)的相关函数如下:
- StartCoroutine:启动一个协同程序
- StopCoroutine:停止一个协同程序
- StopAllCoroutine:终止所有协同程序
- WaitForSeconds:等待若干秒。
- WaitForFixedUpdate:等待知道下一次FiexdUpdate调用。
javascript示例:
function Start()
{
print("starting "+Time.time);
yield WaitAndPrint();//启用一个协同程序
print("done "+Time.time)
} function WaitAndPrint()
{
yield WitForSeconds(5);//等待5s
print("waitandprint "+Time.time) }
C#示例:
IEnumerator Start () {
Debug.Log("等待5s "+Time.time);
yield return StartCoroutine(WaitMethod());
}
IEnumerator WaitMethod()
{
yield return new WaitForSeconds(5f);
Debug.Log("已经等待5s "+Time.time);
}
这里注意,C#中的协同函数的返回类型必须为IEnumerator,yield要用yield return来替代,并且启动协程用StartCoroutine()函数。
[原]Unity3D深入浅出 - 脚本开发基础(Scripts)的更多相关文章
- [原]Unity3D深入浅出 - 认识开发环境中的自带的Package资源包
Character Controller:角色控制器 Glass Refraction(pro only):玻璃反射资源包 Image Effects :图像效果资源包 Light Cookies:光 ...
- [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个类的实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了 ...
- [原]Unity3D深入浅出 - 认识开发环境中的GameObject菜单栏
Create Empty:创建空对象 Create Other:创建其他对象 Particle System:创建粒子系统 Camera:创建相机 GUI Text:GUI文本 GUI Texture ...
- [原]Unity3D深入浅出 - 认识开发环境中的Project面板
前面几个是用来创建脚步的,从Prefab说起: Prefab:预设物体,若一个Object在Scene中多处用到,即可选择为改对象创建一个Prefab.创建一个Prefab后,将源Object拖拽 ...
- [原]Unity3D深入浅出 - 认识开发环境中的RenderSettings面板
点击菜单栏的Edit项里的RenderSettings即可打开该面板. Fog:在Scene中开启雾效果 Fog Color:雾的颜色 Fog Mode:雾效果的模式,Linear(线性雾效果) Ex ...
- [原]Unity3D深入浅出 - 认识开发环境中的Layers面板
Layers(分层)下拉列表:用来控制Scene视图中游戏对象的显示,在下拉菜单中为勾选状态的物体将显示在Scene视图中. Everything:显示所有的游戏对象 Nothing:不显示任何游戏对 ...
- 【Unity】第6章 Unity脚本开发基础
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 游戏吸引人的地方在于它的可交互性.如果游戏没有交互,场景做得再美观和精致,也难以称其为游戏. 在Unity中,游戏交互通 ...
- [原]Unity3D深入浅出 - Shader基础开发
概述 简单来讲,shader是为渲染管线中的特定处理截断提供算法的一段代码.Shader是伴随着可编程渲染管线出现的,开发者可使用Shader对渲染过程加以控制,拥有更大的创作控件,因此Shader的 ...
- [原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
随机推荐
- 生成XML文件,通过实体生成XML文件
实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...
- 地形图比例尺、等高距和DEM分辨率关系
地表面的形态是很复杂的,不同地貌类型的形态是由它的相对高度、地面坡度以及所处的地势所决定的,它们是影响等高距的主要因素。从等高距计算公式可以看出,当地图比例尺和图上等高线间的最小距离简称等高线间距确定 ...
- 第二章 约束和排序数据(SQL基础)
第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时,条件包括边界值: ...
- 【dapper】.net平台下的框架
http://www.cnblogs.com/yipu/archive/2012/11/21/2780199.html Method Duration Remarks Hand coded (usin ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)
使用 HttpRequest 对象 HttpRequest 对象描述的是一个正在被处理的 HTTP 请求.下表列举了 HttpRequest 中的属性,它们提供了当前请求的相关信息(HttpReque ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)
不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...
- tableView中不易被注意到的方法
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ } 这个方法 在 r ...
- 让<未将对象引用到实例>见鬼去吧!
未将对象引用到实例,即NullReferenceException异常,我相信这是c#编程中最常见的错误之一,至少我在做项目的过程中,有很多时候都会抛出这个异常.每当这个异常出现的时候,我都会头皮一紧 ...
- Sublime Text 3 安装及简单配置
Sublime Text 3, 一款不错的文本编辑器, 加上各种插件和IDE就能化身各种语言的编译器, 界面以及多种插件的灵活组合搭配更是让程序员们在码代码这种枯燥的生活中增加一点调剂. 下载地址 点 ...
- qwt 6.1.0集成进Qt creator 2.8.1步骤
环境准备与文件编译 ·关于Qt 发现一个Qt正确安装的教程,非常棒!http://www.wikihow.com/Install-Qt-SDK-on-Ubuntu-Linux Qt版本是4.8.5,在 ...