Unity3D脚本中文系列教程(一)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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”);
 }
2.通过物体层次定位
对于⼀个已经存在的物体,可以通过游戏物体的Transform组件来找到⼦和⽗物体;
//找到脚本所附加的
//游戏物体的⼦“Hand”
transform.Find(“Hand”)。

Translate(0, 1, 0);
⼀旦在层次视图中找到这个变换,你可以使⽤GetComponent来获取其他脚本,
//找到名为“Hand”的⼦
//在附加到它上⾯的OtherScript中,设置foo为2;
transform.Find(“Hand”)。

Translate(0, 1, 0);
//找到名为“Hand”的⼦
//然后应⽤⼀个⼒到附加在hand上的刚体
transform.Find(“Hand”)。

GetComponent(OtherScript)。

DoSomething(“Hello”);
// 找到名为“Hand”的了
// 然后应⽤⼀个⼒到附加在hand上的刚体
transform.Find(“Hand”)。

rigidbody.AddForce(0, 10, 0);
你可以循环所有的⼦,
//变换的所有⼦向上移动10个单位
for

var
child : Transform
in
transform)
{
child.Translate(0, 1, 0);
}
参考Transform类⽂档获取更多信息。

相关文档
最新文档