Unity 3D 腳本教學 (一)

上一篇主題 下一篇主題 向下

Unity 3D 腳本教學 (一)

發表  aaa1218bbb 于 周五 11月 25, 2011 1:59 pm


一、 腳本概覽
這是一個關於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類文檔獲取更多信息。






_________________
歡迎大家多多交流~

avatar
aaa1218bbb
社員
社員

文章數 : 65
積分 : 2235
注冊日期 : 2011-11-22

檢視會員個人資料 http://design.gugebb.com

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章