前五天的內容介紹BlueRemedy這款遊戲的完整內容。第六天開始,將循序漸進介紹程式製作過程的內容、以及如何製作出各種特殊機制。
題外話
我總認為,程式開發就是不斷滿足企劃的天馬行空。
每次開會,聽著組員討論著他們想像中希望有的功能,身為程式的我邊聽邊覺得害怕...他們口中的一個簡單功能可能得多弄個兩三天啊!
但想想或許這也是件好事,這代表我們的遊戲會有更豐富的內容
(如果讓我負責發想,可能會優先考量製作時間與成效的CP值而取消許多機制吧)
每個遊戲的第一步都是設定主角的操作,我打算用兩天篇幅紀錄基礎操作的程式(硬要塞在一天會太長),今天的內容會包含主角Oka的移動、跳躍,而明天還有一項比較特別的機制"蹬牆跳"。
編寫程式前,先為我們的腳色Oka設定Rigidbody元件及Collider碰撞器。因為Oka基本上就是個圓形圖案所以我選擇以CircleCollider元件做設定。要注意的是,因為這是2D遊戲,也沒有特殊需求,所以加入元件時要特別選擇2D專用的元件。
左右移動的程式,網路資料大致分成兩種寫法:其一是設定腳色的transform.position值,第二種方法則是取的腳色的Rigidbody元件並設定velocity值,我習慣以第二種方式控制腳色移動。
首先在Player物件上加入PlayerControl腳本,
宣告以下變數
因為我們的Oka有三種變身,所以需要再設定一個整數變數 OkaID_Now,用來記錄現在的型態(之後才會用到)。0代表固態、1代表液態、2代表氣態,這組變數在許多腳本中都會使用到,所以我打算將它設為公開的靜態變數。
接下來創建Move函式(我習慣把功能用函式包起來,方便之後修改及Debug),接著在FixedUpdate中呼叫Move函式。
之所以使用FixedUpdate函式的原因而非Update,主要是因為Update呼叫頻率會依據每偵更新速度而有所不一,如果將移動功能放在Update裡面會感受到奇怪的停頓。而FixedUpdate的呼叫頻率會較為統一(內部原理我也不清楚),因此有關移動的程式建議都放在FixedUpdate中。
Move函式要做的事情很簡單,偵測鍵盤或搖桿的水平輸入,這個值會介於-1~1之間,乘上前面設定的moveSpeed變數,再把這個值設定為rb2d的velocity值即可。
主角Player物件底下有三個子物件,分別控制是個型態的外型圖示動畫。現在要在PlayerControl腳本內宣告一格Animator陣列並連結到三個子物件身上的Animator元件。
透過animator[OkaID_Now].SetFloat("xSpeed", Mathf.Abs(rb2d.velocity.x)) 可以設定目前型態animator中的參數設定為目前速度。
Animator中目前有兩個動畫IDLE、RUN,當速度>0時就會切為RUN,反則切回IDLE。看途中圈起來部分就好,其他內容之後會再做介紹。至於Animator網路上有很多教學了,這邊就不再多說。
喔!差點忘了一個重要功能,因為目前Oka圖是面向右的,當他往左邊走時總不能像是倒退嚕吧!要寫個函是讓他在向左時左右翻轉,聽起來很難? 其實只是scale.x乘上負號啦。
這時候前面寫的facingRight就派上用場啦,當X軸輸入不為零時,假如我按右邊但現在正面向左,或是我按左但正面向右邊時,就會呼叫Flip函式做x軸左右相反。
至於翻轉Flip函式則是這樣,簡單說就是把Scale乘以-1,並把facingRight的值true/false對調而已。
好了,最基本的移動完成,明天將挑戰跳躍!