没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、 脚本概览
这是一个关于 Unity 内部脚本如何工作的简单概览。
Unity 内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不
同志的函数被特定的事件调用。最常用的列在下面:
Update:
这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物
理代码。
FixedUpdate:
这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。
在任何函数之外的代码:
在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。
注意:文档的这个部份假设你是用 Java script,参考用 C#编写获取如何使用 C#和 Boo
编写脚本的信息。
你也能定义事件句柄,它们的名称都以 On 开始,(例如 OnCollisionEnter),为了查看完
整的预定义事件的列表,参考 MonoBehaviour 文档。
概览:常用操作
大多数游戏物体的操作是通过游戏物体的 Transform 或 Rigidbody 来做的,在行为脚本
内部它们可以分别通过 transform 和 rigidbody 访问,因此如果你想绕着 Y 轴每帧旋转 5 度,
你可以如下写:
functionUpdate(){
transform.Rotate(0,5,0);
}
如果你想向前移动一个物体,你应该如下写:
functionUpdate(){
transform.Translate(0,0,2);
}
概览:跟踪时间
Time 类包含了一个非常重要的类变量,称为 deltaTime,这个变量包含从上一次调用
Update 或 FixedUpdate(根据你是在 Update 函数还是在 F
ixedUpdate 函数中)到现在的时
间量。
所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:
functionUpdate(){
transform.Rotate(0,5*Time.deltaTime,0);
}
移动物体:
functionUpdate(){
transform.Translate(0,,0,2*Time.deltaTime);
}
如果你加或是减一个每帧改变的值,你应该将它与 Time.deltaTime 相乘。当你乘以
Time.deltaTime 时,你实际的表达:我想以 10 米/秒移动这个物体不是 10 米/帧。这不仅仅
是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)
另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以 2 单位/秒改变半
径。
functionUpdate(){
light.range+=2.0*Time.deltaTime;
}
当通过力处理刚体的时候,你通常不必用 Time.deltaTime,因为引擎已经为你考虑到了
这一点。
概览:访问其他组件
组件被附加到游戏物体,附加 Renderer 到游戏物体使它在场景中渲染,附加一个 Camera
使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。
最常用的组件可以作为简单成员变量访问:
Component可如下访问
Transformtransform
Rigidbodyrigidbody
Rendererrenderer
Cameracamera(onlyoncameraobjects)
Lightlight(onlyonlightobjects)
Animationanimation
Collidercollider
…等等。
对于完整的预定义成员变量的列表。查看 Component,Behaviour 和 MonnoBehaviour
类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为 null。
任何附加到一个游戏物体的组件或脚本都可以通过 GetComponent 访问。
transform.Translate(0,3,0);
//等同于
Ge
tComponent(Transform).Translate(0,1,0);
注意 transfom 和 Transform 之间大小写的区别,前者是变量(小写),后者是类或脚本
名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
应用我们所学,你可以使用 GetComponent 找到任何附加在同一游戏物体上的脚本和组
件,请注意要使用下面的例子能够工作,你需要有一个名为 OtherScript 的脚本,其中包含
一个 DoSomething 函数。OtherScript 脚本必须与下面的脚本附加到相同的物体上。
//这个在同一游戏物体桑找到名为 OtherScript 的脚本
//并调用它上加的 DoSomething
functionUpdate(){
otherScript=GetComponent(OtherScript);
otherScript.DoSomething();
}
概览:访问其它游戏物体
大多数高级的代码不仅需要操作一个物体,Unity 脚本接口有各种方法来找到并访问其
他游戏物体和组件。在下面,我们假定有个一名为 OtherScript,js 的脚本附加到场景的游戏
物体上。
varfoo=5;
functionDoSomething(param:String){
print(param+"withfoo:"+f
oo);
}
1.通过检视面板赋值引用
你可以通过检视面板赋值变量到任何物体
//变换拖动到 target 的物体
vartarget:Transform;
functionUpdate()
{
target.Translate(0,1,0);
}
你也可以在检视面板中公开到其他物体的引用,下面你可以拖动一个包含的游戏物体
到检视面板中的 target 槽。
//设置在检视面板中赋值的 target 变量上的 foo,调用 DoSomething
vartarget:OtherScript;
functionUpdate()
{
//设置 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(varchild:Transformintransform)
{
child.Translate(0,1,0);
}
参考 Transform 类文档获取更多信息。
3.根据名称或标签定位.
你可以使用 GameObject.FindWithTag 和 GameObject.FindGameObjectsWithTag 搜索具
有特定标
签的游戏物体,使用 GameObject.Find 根据名称查找物体。
functionStart()
{
// 按照名称
vargo=GameObject.Find("SomeGuy");
go.transform.Translate(0,1,0);
// 按照标签
varplayer=GameObject.FindWithTag("Player");
player.transform.Translate(0,1,0);
}
你可以在结果上使用 GetComponent,在找到的游戏物体上得到任何脚本或组件。
functionStart()
{
// 按名称
vargo=GameObject.Find("SomeGuy");
go.GetComponent(OtherScript).DoSomething();
// 按标签
varplayer=GameObject.FindWithTag("Player");
player.GetComponent(OtherScript).DoSomething();
}
一些特殊的物体有快捷方式,如主相机使用 Camera.main。
4.作为参数传递
一些事件消息在事件包含详细信息。例如,触发器事件传递碰撞物体的 Collider 组件到
处理函数。
OnTriggerStay 给我们一个到碰撞器的引用。从这个碰撞器我们可以获取附加到其上的
刚体。
functionOnT
riggerStay(other:Collider){
// 如果另一个碰撞器也有一个刚体
// 应用一个力到它上面
if(other.rigidbody){
other.rigidbody.AddForce(0,2,0);
}
}
或者我们可以通过碰撞器获取附加在同一个物体上的任何组件。
functionOnTriggerStay(other:Collider){
// 如果另一个碰撞器附加了 OtherScript
// 调用它上面的 DoSomething
// 大多数时候碰撞器不会附加脚本
// 所以我们需要首先检查以避免 null 引用异常
if(other.GetComponent(OtherScript)){
other.GetComponent(OtherScript).DoSomething();
}
}
注意通过上述例子中的 other 变量,你可以访问碰撞物体中的任何组件。
5.一种类型的所有脚本
使用 Object.FindObjectsOfType 找到所有具有相同类或脚本名称的物体,或者使用
Object.FindObjectOfType.找到这个类型的第一个物体。
functionStart()
{
// 找到场景中附加了 OtherScript 的任意一个游戏物体
varother:OtherScript=FindObjectOfType(OtherScript);
other.DoSomething();
}
概览:向量
Unity 使用 Vector3 类同一表示全体 3D 向量,3D 向量的不同组件可以通过想 x,y 和 z
成员变量访问。
varaPosition:Vector3;
aPosition.x=1;
aPosition.y=1;
aPosition.z=1;
你也能够使用 Vector3 构造函数来同时初始化所有组件。
varaPosition=Vector3(1,1,1);
Vector3 也定义了一些常用的变量值。
vardir
ection=Vector3.up;// 与 Vector3(0,1,0);相同
单个向量上的操作可以使用下面的方式访问:
someVector.Normalize();
使用多个向量的操作可以使用 Vector3 类的数;
theDistance=Vector3.Distance(oneVector,otherVector);
(注意你必须在函数名之前写 Vector3 来告诉 JavaScript 在哪里找到这个函数,这适用
于所有类函数)
你也可以使用普通数学操作来操纵向量。
combined=vector1+vector2;
查看 Vector3 类文档获取完整操纵和可用属性的列表。
概览:成员变量 & 全局变量变量
定义在任何函数之外的变量是一个成员变量。在 Unity 中这个变量可以通过检视面板来
访问,任何保存在成员变量中的值也可以自动随工程保存。
varmemberVariable=0.0;
上面的变量将在检视面板中显示为名为"MemberVariable"的数值属性。
如果你设置变量的类型为一个组件类型(例如 Transform,Rigidbody,Collider,任何脚本
名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
varenemy:Transform;
functionUpda
te()
{
if(Vector3.Distance(enemy.position,transform.position)<10);
print("Isensetheenemyisnear!");
}
}
你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的
剩余461页未读,继续阅读
LovePurple
- 粉丝: 12
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页