剛讀到Unity的網絡系統,在這裡順便撰下一些筆記,做一些簡易翻譯工作,主要文件請參考:
http://unity3d.com/support/documentation/Components/net-HighLevelOverview.html
在unity中,server可以按其功能和需求劃分為兩種,一種是Authoritative Server(掌權伺服器)和Non-Authoritative Server(非掌權伺服器)。
在掌權伺服器中,用戶如果想執行某些動作,需先發送一些請求,然後等待伺服器回應,並負責控制角色活動。換言之,動作並不在本地執行(the action will not be made logically)。譬喻,當作為玩家的我想移動角色時,我的螢幕並不會立刻顯示角色的移動,而是先發送請求到伺服器,告知他更新狀態(state),然後再由伺服器告知所有user(包括我在內),我的位置更新了。
這種伺服器的優點是可以使用戶有更高的實時性和同步性,但可能有延遲問題出現。且一旦斷開與伺服器的連接,會立刻當機。
在非掌權伺服器中,伺服器並不負責回饋用戶的輸入/控制其活動。相反,用戶在本地活動(the client act logically),然後才寄送結果到伺服器中,再傳送給其他用戶。
在Unity官方文件中,還提及兩種標準的networking method,網絡連接方法:Remote Procedure Calls(RPCs,這裡先譯作遠端程序請求)和State Synchronization(狀態同步)。
RPCS是指電腦透過server去呼叫其他電腦的程序,像是函數,物件的方法等等。這種方法適用於更新不頻密的動作,原因是,若不斷請求對方電腦呼叫程序,會造成一定負擔。
State Synchronization是指不斷分享一些需要頻密更新的數據,像是角色的坐標位置,血氣量等其它重要的角色資訊。
最後,Unity官方文件還提及幾點注意事項,包括要注意IP位址的性質,私用公用等等,若連接的電腦是使用私用IP位址,便需要使用NAT(network address translation)技術 -- 但大概unity已經幫我們完成了這項功夫,如果你想了解細節,請參考官方文件。暫時值得注意的是,建立實時遊戲時必需盡量減低頻寬(bandwidth),這將會是影響遊戲遊暢度的關鍵,在下幾章,我們將會更深入探討有關問題,並正式進入unity的網絡程式編寫。
Our workshop
Unity3D 共同學習筆記。
2012年6月15日 星期五
2012年6月14日 星期四
[Unity Script] Unity的圖層概念
在Unity中,如果我們想把一些物件(例如選單)放在較前端的圖層上,放在遊戲主畫面前,要怎樣作呢?這是製作遊 戲時不得不考慮的問題。幸而,Unity內建了兩個圖層物件,GUI Layer(圖形用戶介面圖層)和Flare Layer(閃光圖層),並且預設成為主鏡頭(main camera)的組件,替我們省下不少功夫。今天這裡主要介紹GUI Layer。
當我們建立任何GUI物件(例如GUI button,GUI text),它們便會自動分配到GUI Layer中。並且,GUI物件的X,Y坐標指向在螢幕的相對位置,介乎0~1。
你也可以設定GUIText組件中的屬性控制物件的位置
細節請參考官方文件:
GUI Text: http://unity3d.com/support/documentation/Components/class-GuiText.html
GUI Layer: http://unity3d.com/support/documentation/Components/class-GUILayer.html
Life_programmer
當我們建立任何GUI物件(例如GUI button,GUI text),它們便會自動分配到GUI Layer中。並且,GUI物件的X,Y坐標指向在螢幕的相對位置,介乎0~1。
你也可以設定GUIText組件中的屬性控制物件的位置
細節請參考官方文件:
GUI Text: http://unity3d.com/support/documentation/Components/class-GuiText.html
GUI Layer: http://unity3d.com/support/documentation/Components/class-GUILayer.html
Life_programmer
[Unity Script] 基本物件操作(2) - 鍵盤事件處理
目前,你應該對如何旋轉或移動物件有初步認識,但這樣是不足夠製作遊戲的,一個遊戲還必需接受與玩家的互動,譬喻,當我按下鍵盤的「上鍵」時,它要懂得向前行。
要達成這個目的,我們需要用Input類別,並在update()函數中不斷判斷用戶是否有按下某些鍵。以下列出一些常用的鍵盤事件:
function update(){
// 上下左右
if(Input.GetAxisRaw("Horizontal") > 0) Debug.Log("按下了右鍵");
else if(Input.GetAxisRaw("Horizontal") < 0) Debug.Log("按下了左鍵");
if(Input.GetAxisRaw("Vertical") > 0) Debug.Log("按下了上鍵");
else if(Input.GetAxisRaw("Vertical") < 0) Debug.Log("按下了下鍵");
// 其他鍵盤事件
if(Input.getKey("a")) Debug.Log("按下了a");
}
除了鍵盤事件外,Input類別還可判斷Button事件,滑鼠事件等等,你可以參考以下文件來學習如何進一步使用Input類別來建立你的遊戲:
Input類別:http://unity3d.com/support/documentation/ScriptReference/Input.html
要達成這個目的,我們需要用Input類別,並在update()函數中不斷判斷用戶是否有按下某些鍵。以下列出一些常用的鍵盤事件:
function update(){
// 上下左右
if(Input.GetAxisRaw("Horizontal") > 0) Debug.Log("按下了右鍵");
else if(Input.GetAxisRaw("Horizontal") < 0) Debug.Log("按下了左鍵");
if(Input.GetAxisRaw("Vertical") > 0) Debug.Log("按下了上鍵");
else if(Input.GetAxisRaw("Vertical") < 0) Debug.Log("按下了下鍵");
// 其他鍵盤事件
if(Input.getKey("a")) Debug.Log("按下了a");
}
除了鍵盤事件外,Input類別還可判斷Button事件,滑鼠事件等等,你可以參考以下文件來學習如何進一步使用Input類別來建立你的遊戲:
Input類別:http://unity3d.com/support/documentation/ScriptReference/Input.html
Life_programmer
[Unity Script] 基本物件操作(1) - 移動﹑旋轉
在本章,我們會介紹如何旋轉,移動一些物體,在此之前,我們首先要創建一個物體。
1. 先開啟Unity,然後在上方list中選GameObject > Create Other > Cube
Cube是一個正方體,你也可選擇創建Sphere(球體)等物件,隨你喜歡
2. 接著選取Assets>create>javascript,創建一個javaScript的腳本
3. 在Project介面中,你會看到剛才創建了一個未命名的script,先重新命名,如改成"Move3D"。
4. double click這個script,然後它會自動開啟UnityScript的編輯器。
在新的Script中,你會看到以下程式碼:
#pragma strict
function Start () {
}
function update(){
}
你目前還不用理解第一行: #pragma strict 到底替你做了什麼,你只需要大概知道,前置處理器替你作了一些事情,而這些事情對程式運行有幫助。
新創建的Script預設只有兩個function,start()和update(),在start(){}中的腳本會在物件完成載入後立刻被呼叫,換言之,它通常用於初始化設定,例如物件的起始坐標位置。
例如,我們可以寫:
function Start () {
transform.position.x = 0;
transform.position.y = 0;
transform.position.z = 0;
}
寫完儲存後,把script拖到你剛才創建的物件,播放程序,以上程式便會把物件的初始坐標設為(0,0,0)。
在 此範例中,transform是你指定的物件的一個Component。Transform類別是unity任何object的基本元素,它指向物件的坐 標,位置,大小等資訊。而它的Position成員,實際上是一個三維向量(Vector3)類別。你除了可以在script中初始化物件的坐標,也可選 擇直接在以下介面中輸入物件的Transform初始值。
1. 先開啟Unity,然後在上方list中選GameObject > Create Other > Cube
Cube是一個正方體,你也可選擇創建Sphere(球體)等物件,隨你喜歡
2. 接著選取Assets>create>javascript,創建一個javaScript的腳本
3. 在Project介面中,你會看到剛才創建了一個未命名的script,先重新命名,如改成"Move3D"。
4. double click這個script,然後它會自動開啟UnityScript的編輯器。
在新的Script中,你會看到以下程式碼:
#pragma strict
function Start () {
}
function update(){
}
你目前還不用理解第一行: #pragma strict 到底替你做了什麼,你只需要大概知道,前置處理器替你作了一些事情,而這些事情對程式運行有幫助。
新創建的Script預設只有兩個function,start()和update(),在start(){}中的腳本會在物件完成載入後立刻被呼叫,換言之,它通常用於初始化設定,例如物件的起始坐標位置。
例如,我們可以寫:
function Start () {
transform.position.x = 0;
transform.position.y = 0;
transform.position.z = 0;
}
寫完儲存後,把script拖到你剛才創建的物件,播放程序,以上程式便會把物件的初始坐標設為(0,0,0)。
在 此範例中,transform是你指定的物件的一個Component。Transform類別是unity任何object的基本元素,它指向物件的坐 標,位置,大小等資訊。而它的Position成員,實際上是一個三維向量(Vector3)類別。你除了可以在script中初始化物件的坐標,也可選 擇直接在以下介面中輸入物件的Transform初始值。
然而,若我們要旋轉或移動物件,該如何作呢?
施轉(Rotate)
通常我們不會一次過旋轉物件,而是慢慢地旋轉,所以我們要在update() function中撰寫script
同樣的,我們利用transform指向目前的物件,然後呼叫Rotate方法。
function update(){
// 每一秒大概旋轉3度
transform.Rotate(0,
3*Time.deltaTime, 0);
}
Time.deltaTime 傳回對上一次執行update()直至現在所經過的時間。這個數值非常重要,因為它可以確保在不同效能的電腦上,物件旋轉的頻率不會有太大差異。(如果你 曾經寫過ActionScript,你應該馬上想起onEnterFrame,每播放一影格,便會執行onEnterFrame指定的函數,但這種做法的 最大缺點是,在不同電腦上可能會有截然不同的動畫效果。比較之下,在Unity中Time.deltaTime解決了這個問題。)
移動
一般而言,移動物件有兩種方法,最傳統的方法是加減物件的坐標值,例如要一物件每秒向右移動10個單位,做法便是:
function update(){
transform.position.x +=
10*Time.deltaTime;
}
這種做法在建立2D遊戲上是非常方便的,但是用來建立3D遊戲卻非常麻煩,在Unity中,你被鼓勵用向量(Vector)類別來移動物件。在向量類別中,你可以直觀地移動3D物件,而且還可以簡單地合併,旋轉向量。
// 首先建立一個三維向量物件
private
var vector:Vector3 = Vector3(1,1,1);
function update(){
// 每秒移動50單位向量
transform.position +=
50*vector*Time.deltaTime;
}
以上的程式,就相當於
function update(){
transform.position.z +=
50*Time.deltaTime;
transform.position.y
+= 50*Time.deltaTime;
transform.position.x +=
50*Time.deltaTime;
}
顯然而見,在Unity中,學會向量操作是非常重要的。
參考文件:
Life_programmer
[Unity Script] 引言
本人學習programming已久,也寫過Flash的ActionScript,最近第一次接觸Unity3D,希望創造一些電腦遊戲。在此容許我先介紹一下這個軟件。
Unity 是一個製作3D遊戲的遊戲引擎(game engine),它提供了大量操作3D物件的類別庫,至今發展已非常成熟,而它最重要的一個特點是,其腳本(script)是極輕量級的。在Unity 中,即使你完全不懂編寫程式,只要用數行script,你就可以做到平常可能要數千百行程式才做到的事,如旋轉﹑移動3D物體,配置場地,播放獨立動畫等 等。所以,基本上Unity是一個非常完善的3D遊戲開發框架(framework)。目前,Unity還支援在不同平台上發佈遊戲,如 Android,IOS,Window等等。
更詳細的背景資料請參考Unity的官方網站:
http://unity3d.com/
(備:你也可在其中找到Unity的主程式,並且免費下載)
若你希望快速入門Unity,了解其基本操作方法,我推薦以下網站:
http://www.cg.com.tw/Unity/Unity.asp
在裡面,基本上你能大致學會如何使用Unity介面,創建Object,Character,加入地形﹑樹木,等基本操作。
如果你已有基礎知識,想深入了解更仔細的東西,可參考以下網站:
http://design.gugebb.com/f7-forum
在 此,值得一提的是,Unity中有一非常重要的特徵,那就是,物件的創建與Script的創建是互相獨立的,你可以在Unity的編輯介面中,先製作好你 想要的物件,包括其大小﹑外形﹑材質等等,如果你想這物件擁有一些操作,你便可把獨立寫好的script移到物件中,這script便會成為該物件的組成 部份(Component)之一。這種做法的優點有很多:如,script可重用(同時給多個物件使用而互不干擾),加速開發,等等。
如 果你有學過flash的actionScript,你可以把這些腳本理解為.as檔,每一個腳本都是一個類別(class),當你把Script指定到給 物件,就等同以類別定義了這一個物件。(當然,他們實際上是不同的,因為我們並非以建構函式來為對象進行初始化,而是使用start() function,這與Unity的底層處理有密切關系,目前你還不用理解它,但你只需記著,如果你想初始物件的一些屬性,你需要在start()內撰寫 腳本。)
在下一章,我們將會介紹如何利用腳本對物件進行一些基本操作。
Life_programmer
Unity 是一個製作3D遊戲的遊戲引擎(game engine),它提供了大量操作3D物件的類別庫,至今發展已非常成熟,而它最重要的一個特點是,其腳本(script)是極輕量級的。在Unity 中,即使你完全不懂編寫程式,只要用數行script,你就可以做到平常可能要數千百行程式才做到的事,如旋轉﹑移動3D物體,配置場地,播放獨立動畫等 等。所以,基本上Unity是一個非常完善的3D遊戲開發框架(framework)。目前,Unity還支援在不同平台上發佈遊戲,如 Android,IOS,Window等等。
更詳細的背景資料請參考Unity的官方網站:
http://unity3d.com/
(備:你也可在其中找到Unity的主程式,並且免費下載)
若你希望快速入門Unity,了解其基本操作方法,我推薦以下網站:
http://www.cg.com.tw/Unity/Unity.asp
在裡面,基本上你能大致學會如何使用Unity介面,創建Object,Character,加入地形﹑樹木,等基本操作。
如果你已有基礎知識,想深入了解更仔細的東西,可參考以下網站:
http://design.gugebb.com/f7-forum
在 此,值得一提的是,Unity中有一非常重要的特徵,那就是,物件的創建與Script的創建是互相獨立的,你可以在Unity的編輯介面中,先製作好你 想要的物件,包括其大小﹑外形﹑材質等等,如果你想這物件擁有一些操作,你便可把獨立寫好的script移到物件中,這script便會成為該物件的組成 部份(Component)之一。這種做法的優點有很多:如,script可重用(同時給多個物件使用而互不干擾),加速開發,等等。
如 果你有學過flash的actionScript,你可以把這些腳本理解為.as檔,每一個腳本都是一個類別(class),當你把Script指定到給 物件,就等同以類別定義了這一個物件。(當然,他們實際上是不同的,因為我們並非以建構函式來為對象進行初始化,而是使用start() function,這與Unity的底層處理有密切關系,目前你還不用理解它,但你只需記著,如果你想初始物件的一些屬性,你需要在start()內撰寫 腳本。)
在下一章,我們將會介紹如何利用腳本對物件進行一些基本操作。
Life_programmer
訂閱:
意見 (Atom)



