1,Update()函数: 这个函数在渲染一帧之前被调用。这里是大部分游戏行为代码被调用的地方
FixedUpdate: 这个函数在每个物理时间步被调用一次。
2,大多数游戏物体的操作是通过游戏物体的 Transform和Rigidbody来做的.
移动一个游戏对象我们需要用transform 来更改它的位置,属于Translate,Translate函数有x,y 和z三个参数
function Update () {
transform.Translate(Input.GetAxis(“Horizontal”), 0, Input.GetAxis("Vertical")); }
3,Input.GetAxis()函数返回-1或1的一个值,例如在横轴上左光标键映射为-1,右光标键映射为1
游戏对象的移动按秒执行.将返回的值乘以 Input.GetAxis()函数中的Time.deltaTime:
varspeed = 5.0;
function Update () {
varx = Input.GetAxis("Horizontal") * Time.deltaTime* speed;
varz = Input.GetAxis("Vertical ") * Time.deltaTime* speed;
transform.Translate(x, 0, z); }
4,主相机的地方有个聚光灯照耀.
Unity 中有个函数能做到这一点. transform.LookAt().
使用一个暴露变量(Transform类型)。
vartarget : Transform; //follow脚本
function Update () {
transform.LookAt(target); }
5,访问组件
一个游戏对象有多个脚本(或其他组件).要访问其他组件的函数或变量,通过GetComponent() 函数来实现
按下跳跃键(默认空格键)的同时让聚光灯射向Cube1.
Var switchToTarget: Transform;//switch脚本添加在聚光灯下
function Update () {
if (Input.GetButtonDown("Jump"))
GetComponent(Follow).target = switchToTarget; }
6,GameObject.FindWithTag()函数通过标签寻找组件.代码如下:
Function Update () {
if(Input.GetButtonDown("Jump")) {
var newTarget
GameObject.FindWithTag("Cube1").transform;
GetComponent(Follow).target = newTarget; } }
1.哪个物体做我们的实例? 2.在哪里做实例化?
实例化函数有三个参数: (1)要建立的对象, (2)对象的三维位置 (3)对象的旋转位置.
varnewObject: Transform;
function Update () {
if (Input.GetButtonDown("Fire1")) {
Instantiate(newObject, transform.position, transform.rotation); } }
当一个对象被实例化,通常将对象设置为预设(prefab),
8,调试Debug.Log()函数
Log()函数允许用户发送信息到Unity的控制台
在”Instantiate”代码内”if”处添 加如下代码: Debug.Log("Cube created");
第六讲:脚本概览
1,绕着Y轴每帧旋转5度
Function Update()
{ transform.Rotate(0,5,0); }
2,向前移动一个物体
Function Update()
{ transform.Translate(0,0,2); }
3,一个恒定的速度旋转
Function Update()
{ transform.Rotate(0,5*Time.deltaTime,0); }
4,以5米/秒移动物体
Function Update()
{ transform.Translate(0,0,2*Time.deltaTime); }
5,随着时间的增加增加光照范围
Function Update()
{ light.range= 2.0*Time.deltaTime; }
6,常用的组件可以作为成员变量访问:
组件是被用来附加到游戏物体上的
常用组件:Transform Rigidbody Renderer Camera Light Animation Collider
对应变量:transform rigidbody renderer camera light animation collider
7,访问其它组件
任何附加到一个游戏物体的组件或者脚本都可以通过GetComponent访问。
transform.Translate(0,1,0);等同于 GetComponent(Transform).Translate(0,1,0);
transform和Transform.之间大小写的区别,前者是变量(小写),后者是类或者脚本名称(大写)。使用GetComponent可以找到任何附加在同一款游戏物体上的脚本和组件。
8,访问其他游戏物体
<1>通过检视面板赋值引用。在检视面板中可以将任何变量赋值给对象。
<2>通过物体层次定位。 对于一个已经存在的物体,可以通过游戏物体的 Transform组件来找到它的子物体和父物体。
//找到脚本所附加的游戏物体的子物体”Hand”
transform.Find("Hand").Translate(0, 1, 0);
一旦找到这个物体,我们就可以使用GetComponent 函数来或取它的脚本。
//找到名为”Hand”的物体,在附加到它上面的 OtherScript中,设置foo为2. transform.Find("Hand").GetComponent(OtherScript).foo= 2;
//找到名为”Hand”的物体,调用附加到它上面的 OtherScript脚本中的DoSomething函数.
transform.Find("Hand").GetComponent(OtherScript).DoSome thing("Hello");
//找到名为”Hand”的物体,应用一个力到附加在 Hand的Rigidbody上。 transform.Find("Hand").rigidbody.AddForce(0, 10, 0);
//移动所有的子物体,向上移动10个单位
for (var child : Transform in transform)
{ child.Translate(0, 1, 0); }
9,根据名称或标签定位。
我们可以使用GameObject.FindGameObjectWithTag 和GameObject.Find WithTag 搜索具有特定标签的游戏物体。使用GameObject.Find 根据名称查找物体。
function Start (){
// 通过名称
Var go = GameObject.Find(“SomeGuy”);
go.transform.Translate(0, 1, 0);
// 通过标签
Var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);
}
10,作为参数传递 一些事件本身包含详细的信息。例如,触发器事件将碰撞物体的Collider组件传递给处理函数。 OnTriggerStay给我们一个碰撞触发器的引用。从这个碰撞触发器我们可以获取附加到其上的刚体。
function OnTriggerStay( other : Collider) {
// 如果另一个碰撞物体也是刚体,给其加上一个力
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0); } }
11,我们也可以通过碰撞触发器获取附加在同一物体上的任何组件。
function OnTriggerStay( other : Collider ) {
// 如果另一个碰撞物体附加了OtherScript,调用它的OtherScript,通常碰撞物体不会附加脚本,所以我们需要先检查以避免null引起的异常。
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething(); } }
12,使用Object.FindObjectsOfType找到所有具有相同类或脚本名称的物体
function Start (){
// 找到场景中可以附加到任意一个游戏物体上的
OtherScript varother : OtherScript= FindObjectOfType(OtherScript); other.DoSomething(); }
以下为向量
13,Unity使用Vector3类统一表示所有的3维向量。3维向量的不同组件可以通过x,y,z成员变量访问。
varaPosition: Vector3;
aPosition.x= 1; aPosition.y= 1; aPosition.z= 1;
14,Vector3也定义了一些常用的常量值
vardirection = Vector3.up; // 等同于Vector3(0, 1, 0);
vardirection = Vector3.forward; // 等同于Vector3(0, 0, 1);
vardirection = Vector3.right; // 等同于Vector3(1, 0, 0);
成员变量&全局变量
15,定义在任何函数之外的变量是一个成员变量。通过检视面板来访问
变量类型是一个组件类型(例如 Transform, Rigidbody, Collider, script ),我们可以在检视面板中通过拖动一个游戏物体来设置它们
varenemy : Transform;
function Update() {
if ( Vector3.Distance( enemy.position, transform.position ) < 10 ) {
print("I sense the enemy is near!"); } }
16,私有成 员变量可以用来存储那些在该脚本之外不可见的状态。
private varlastCollider: Collider;
function OnCollisionEnter( collisionInfo: Collision ) {
lastCollider= collisionInfo.other; }
17,可以用static关键字创建全局变量。下面创建了一个全局变量。
static var someGlobal= 5;
//可以在脚本内部像访问普通变量一样访问它
print(someGlobal); someGlobal= 1;
如果是另一个脚本访问它,只需要使用这个脚本名称加上一个点和全局变量名。
print(TheScriptName.someGlobal);
TheScriptName.someGlobal= 10;
18,实例化,就是指复制一个物体。
例如,有一个小的脚本,当附加到一个带有碰撞触发器的刚体上时将销毁它自己并实例化一个爆炸物体
Var explosion : Transform;
// 当发生碰撞时销毁自己并复制一个爆炸物体
function OnCollisionEnter(){
Destroy (gameObject);
Var theClonedExplosion:Transform;
theClonedExplosion= Instantiate(explosion, transform.position, transform.rotation); }
19,Yield语句是一个特殊类型的返回,它确保在下次调用时该函数继续从该语句之后执行
while(true)
{ // 做步骤0 yield;
// 等待一帧
// 做步骤1 yield; // 等待一帧 // ... }
也可以传递特定值给yield来延迟Update函数的执行,直到一个特性的事件发生
yield WaitForSeconds(5.0); // 等5秒 // 做更多事情
19,Unity将所有的脚本编译为.NET dll文件,dll文件将在运行时执行。
脚本编译分四个步骤: 1、所有在“Standard Assets”, “Pro Standard Assets” 或“Plugins”中的脚本被首先编译。 在这些文件夹之内的脚本不能直接访问这些文件夹之外的脚本。不能直接引用类或它的变量,但是可以使用 Gameobject.SendMessage与它们通信。
2、所有在“Standard Assets/Editor”, “Pro Standard Assets/Editor” 或“Plugins/Editor”中的脚本被编译
3、所有在“Editor”中的脚本被编译
4、所有其他的脚本被编译。