Unity3D官方案例--太空射擊遊戲總結

最近一段時間萌生了做遊戲的想法,便一發不可收拾,忙活了好幾天,終於跟着網上的教程做了一個太空射擊的FPS遊戲,想着應該好好總結一下,對於我這種剛接觸遊戲的小白來說,這個入門的項目還是可以學到很多東西的。
1.關於腳本的API的總結
(1)首先是用的很多的一個方法:MonoBehaviour.OnTriggerExit(),該方法的作用是:當Collider(碰撞體)停止觸發trigger(觸發器)時調用OnTriggerExit。(可以用這個判斷一些遊戲的邊界,也就是說當物體離開邊界的時候銷燬該物體)
void OnTriggerExit(Collider other){
Destroy (other.gameObject);
}
//順便要提一下,MonoBehaviour是所有腳本的基類,js腳本默認是繼承這個類,但是C#與Boo是需要顯式的繼承這個類的
(2)另外一個類似的方法也比較常用,那就是MonoBehaviour.OnTriggerEnter().當Collider(碰撞體)進入trigger(觸發器)時調用OnTriggerEnter。
銷燬所有進入觸發器的物體
void OnTriggerEnter(Collider other) {
Destroy(other.gameObject);
}
以上兩個方法有個共同點:這個消息被髮送到觸發器和接觸到這個觸發器的碰撞體。注意如果碰撞體附加了一個剛體,也只發送觸發器事件。(這句話並不是很理解)
(3)Transform類:場景中的每一個物體都有一個Transform。用於儲存並操控物體的位置、旋轉和縮放。每一個Transform可以有一個父級,允許你分層次應用位置、旋轉和縮放。可以在Hierarchy面板查看層次關係。他們也支持計數器(enumerator),因此你可以使用循環遍歷子物體。也就是說可以通過這個類的一些成員來控制關於物體在場景中的大小,位置等參數
(4)Transform附加到GameObject(遊戲物體)(如無附加則爲空)。就成了transform,也就是組件Component的一個變量,類似的變量還有rigidBody,camera等等,在5.0版本中必須要通過GetComponent<…>()來獲取組件!
(5)RigidBody剛體組件:非常常用的一個組件,這個組件有很多有用的變量可以通過GetComponent().來使用,如rotation,positionvelocity,angulerVelocity(角速度)等等。
void Start () {
//給帶剛體的GameObject一個速度值
GetComponent ().velocity = transform.forward * speed;
}
(6)Input類,這個類是輸入系統的接口,在各個平臺上這個類的作用是有一定差別的,具體要查閱API,有幾個常用的方法
Input.getAxis(string name):根據座標軸名稱返回虛擬座標系中的值。方向有Horizontal和Vertical,返回的值是-1到1之間;
Input.getButton(string name):根據按鈕名稱返回true當對應的虛擬按鈕被按住時。
Input.getKey(string name):當通過名稱指定的按鍵被用戶按住時返回true。想想自動開火。
Input.getKeyDown(string name):在給定名稱的虛擬按鈕被按下的那一幀返回true。
Input.getKeyUp(string name):在用戶釋放給定名字的按鍵的那一幀返回true。
(7)Time.deltaTime:增量時間
放在Update()函數中的代碼是以幀來執行的.如果我們需要物體的移動以秒來執行.我們需要將物體移動的值乘以Time.deltaTime。舉個例子,如果我們想物體以每秒10米的速度進行移動,應該是10*Time.deltaTime,如果不乘以這個的話,那麼物體是以每幀10米的速度進行移動的.
(8)Object.Instantiate():克隆原始物體,並且返回克隆的物體
clone = Instantiate(object, transform.position, transform.rotation);
(9)MonoBehaviour.InvokeRepeating():在time秒調用methodName方法;簡單說,根據時間調用指定方法名的方法,從第一次調用開始,每隔repeatRate時間調用一次.也就是經過time時間過後,每隔repeatRate時間調用一次
function InvokeRepeating (string methodName, float time, float repeateRate)
(10)MomoBehaviour.StartCoroutine()開始協同程序,下面有一個官方的演示程序來進行理解
此例演示如何調用協同程序和它的執行
function Start() {
// - After 0 seconds, prints “Starting 0.0”
// - After 0 seconds, prints “Before WaitAndPrint Finishes 0.0”
// - After 2 seconds, prints “WaitAndPrint 2.0”
// 先打印”Starting 0.0”和”Before WaitAndPrint Finishes 0.0”兩句,2秒後打印”WaitAndPrint 2.0”
print (“Starting ” + Time.time );
// Start function WaitAndPrint as a coroutine. And continue execution while it is running
// this is the same as WaintAndPrint(2.0) as the compiler does it for you automatically
// 協同程序WaitAndPrint在Start函數內執行,可以視同於它與Start函數同步執行.
StartCoroutine(WaitAndPrint(2.0));
print (“Before WaitAndPrint Finishes ” + Time.time );
}

function WaitAndPrint (waitTime : float) {
// suspend execution for waitTime seconds
// 暫停執行waitTime秒
yield WaitForSeconds (waitTime);
print (“WaitAndPrint “+ Time.time );
}
(11)Update()方法與FixedUpdate()方法的區別:
Update是在每次渲染新的一幀的時候纔會調用,FixedUpdate,是在固定的時間間隔執行,不受遊戲幀率(fps)的影響
FixedUpdate的時間間隔可以在項目設置中更改,Edit->Project Setting->time 找到Fixed timestep。就可以修改了!

2.關於整個遊戲製作過程中的一些心得和體會
(1)剛開始進行遊戲物體的添加的時候,一定要注意座標,也一定要注意世界座標和本地座標的區別,不要將遊戲物體胡亂拖拉拜訪,哪個物體在座標系中的哪個位置一定要心裏有數
(2)寫腳本的時候思路一定要清晰,不能想到什麼組件就加什麼組件,那樣會造成混亂,導致出現問題找bug的時候很難
(3)最重要的一點是:一定不要怕麻煩,不要畏難,做遊戲本身是一種枯燥的過程,特別是後臺的邏輯,思路一定要清晰,而且要有鑽研的精神,遇到不懂的多查查API,清楚其中的原理是很重要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章