查看: 1126|回复: 1
打印 上一主题 下一主题

Unity3D脚本中文教程1.1

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-5-11 14:55:41 |只看该作者 |倒序浏览
unity3d脚本中文教程

一、 脚本概览

这是一个关于Unity内部脚本如何工作的简单概览。

Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:

Update:

这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。

FixedUpdate:

这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。

在任何函数之外的代码:

在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。

注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。

你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。
概览:常用操作

大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:

function Update(){

transform.Rotate(0,5,0);

}

如果你想向前移动一个物体,你应该如下写:

function Update(){

transform.Translate(0,0,2);

}

概览:跟踪时间

Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。

所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:

function Update(){

transform.Rotate(0,5*Time.deltaTime,0);

}

移动物体:

function Update(){

transform. Translate (0, ,0,2*Time.deltaTime);

}

如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)

另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半

径。

function Update (){

light.range += 2.0 * Time.deltaTime;

}

当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。

概览:访问其他组件

组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。

最常用的组件可以作为简单成员变量访问:

Component             可如下访问

Transform             transform

Rigidbody             rigidbody

Renderer              renderer

Camera                camera (only on camera objects)

Light                 light (only on light objects)

Animation             animation

Collider              collider

…等等。

对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。

任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。

transform.Translate(0,3,0);

//等同于

GetComponent(Transform).Translate(0, 1, 0);

注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。

应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。

//这个在同一游戏物体桑找到名为OtherScript的脚本

//并调用它上加的DoSomething

function Update(){

otherScript = GetComponent(OtherScript);

otherScript.DoSomething();

}

概览:访问其它游戏物体

大多数高级的代码不仅需要操作一个物体,Unity脚本接口有各种方法来找到并访问其他游戏物体和组件。在下面,我们假定有个一名为OtherScript,js的脚本附加到场景的游戏物体上。

var foo = 5;

function DoSomething ( param : String) {

print(param + " with foo: " + foo);

}

1.通过检视面板赋值引用

你可以通过检视面板赋值变量到任何物体

//变换拖动到target的物体

var target : Transform;

function Update ()

{

target.Translate(0, 1, 0);

}

你也可以在检视面板中公开到其他物体的引用,下面你可以拖动一个包含的游戏物体到检视面板中的target槽。

//设置在检视面板中赋值的target变量上的foo,调用DoSomething

var target : OtherScript;

function Update ()

{

//设置target物体的foo变量

target.foo = 2;

// 调用target上的DoSomething

target.DoSomething("Hello");

}

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

0

主题

1

听众

73

积分

设计初学者

Rank: 1

纳金币
67
精华
0

活跃会员 灌水之王

沙发
发表于 2013-2-19 21:43:02 |只看该作者
Unity3D脚本学习必备的好东东,收藏起来慢慢学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-2-5 06:55 , Processed in 0.070553 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部