一般的遊戲當中都有戰鬥的場景,那就免不了要讓我們控制的角色發射子彈或者是弓箭等動作。在程序中這通常是動態生成一個新的物體,然後讓它沿著一定的軌跡向前運動即可。不過在 Unity3D 中這會遇上一個非常讓初學者頭痛的事情(實際上深入使用的話也會讓老手頭痛,甚至有一個叫 "uPrefabs" 的插件專門來解決這個問題)。這個問題就是"預設體"的概念。我們先來看看通常的做法是什麼樣的,這樣才好理清頭緒。
首先,這需要在場景中先建立好子彈的模型,並且關聯好各種腳本 -- 這都好理解。然後就到了關鍵的一步,要先在 Unity3D 中創建一個Prefabs 。方法如圖:
右鍵在 assets 文件夾上彈出菜單,按照圖示依次選擇就可以了。然後關鍵的一步來了:將場景中要作為子彈的物體拖放到這個新建出來的 prefab 上 ... ... 我很無奈文字實在不好描述,而且對於初學者來說確實不好操作。我總結出來的 u3d 中的拖放經驗大體是這樣:先點擊要操作的物體,然後鬆開滑鼠,這個時候又要選擇另外一個物體做它的屬性或者是別的呀 ... 技巧是,這時點中要選擇的另外一個物體但千萬不要鬆開滑鼠,立即將它拖放到第一個選中的物體上就成功了!如果是作為屬性,還要精確的拖放到物體的屬性上 ...
好了,這時候可以用內置的全局函數 Instantiate() 函數來生成很多很多子彈了,但這個函數的第一個參數是類,那 u3d 怎麼知道我要創建的是什麼類呢?其實這個函數可以理解為 new 函數,只要給出 new 的類是什麼就可以了。那麼 u3d 中怎麼告訴它這個要建立的類是什麼呢?答案是:又是要拖放 ... ... 方法是先在要創建的腳本所在的類中定義一個類型為 Transform 的變量,然後回到 u3d 的 ide 界面中,將前面弄好的那個 prefab 拖放到這個變量上 ... ... 說真的,很匪夷所思的操作方式,也不知道最開始發明這種操作的人是怎麼想的。當然習慣了的話也還好了。
總之對於新手來說,這個操作要多練習。最後給出一個實際的代碼,如下:
Instantiate(fire_zt1, ship1.transform.position, ship1.transform.rotation);
這個函數還是挺方便的,第一個參數就是拖放的變量,第二個參數是位置,第三個參數就是我們前面文章說過的表示旋轉角度的4元數變量了。另外這個子彈可以讓它自動在某個時間後銷毀,方法是在子彈運行的腳本上加上以下代碼:
Destroy(this.gameObject, 2);
第二個參數就是指定多久後自動銷毀子彈,單位是秒。一般是加在子彈的 Start() 函數中。
好了,這些就是我們今天要學習的內容,不太容易理解,所以要多練習。