大家好,我是冷宮先生!今天要發一個和小說完全無關的東西XD。
老實說,我國高中的時候,對寫遊戲這件事充滿了憧憬,不過總是三分鐘熱度,根本沒辦法靜下心來學習。後來誤打誤撞,讀了需要寫程式的科系,到了大學做專題的時候,就決定乾脆來寫一款RPG,從3D模型、動畫到程式腳本,幾乎全都是自己從零開始學習製作的。
當然,這一路上碰到過很多次瓶頸,多虧有好心的高手前輩願意指導,否則最後可能會什麼也做不出來。
於是乎,我也認為自己該有些回饋,把自己的一些實作成果分享出來,讓一些剛入門或找不到參考資料的人能有個方向。
那麼,進入正題。
我在專題中是以Unity3D這套軟體,搭配3ds max來製作我們的RPG,其中在戰鬥的部份,我們選擇了「棋盤式回合制」的戰鬥方式。這在近期的遊戲中似乎比較少見(?),不過在十年前左右還是挺流行的,很多單機遊戲都會採用這種遊戲方式,增加趣味性。
雖說同樣是棋盤式遊戲,但是不同的遊戲之間,仍然存在不同的「行走規則」。有些軍事類遊戲可以走六個方向,有些冒險類遊戲可以走八個方向,而我們的遊戲則是只能走四個方向。
像知名遊戲「空之軌跡」,就是可以走八個方向,而且在「移動」這項功能中,也比較不會因為被怪物阻擋而減少「可移動的距離」。
而我們的遊戲只能走四個方向,意即「上、下、左、右」,如果移動路徑上有怪物,由於無法直接穿越的關係,所以會影響到角色「可移動的距離」,原本可以走到的位置,有可能會因此走不到。
之所以要解釋這個,是因為不同的「行走規則」,在程式撰寫上會需要不同的演算法。也許不同的規則之間,概念並不會相差太多,但執行的結果就是不同,所以在寫程式之前,必須先確定你的需求、想要的是什麼樣的棋盤式遊戲,免得白忙一場。
(題外話,我個人認為SLG並不容易寫,雖然玩家操作的時候很簡單,但是它背後的演算法其實很複雜,至少我們選用的這套規則是這樣。)
由於程式演算法過於繁雜,我會在文末附上連結,同時也會提供完整的Unity範例檔,有需要的人可以下載參考,這裡我就只先簡單介紹一些參數。
首先,下載完檔案後,就先把chessPlay的場景打開(圖中的ChessTest為舊檔名,在拍圖時忘記更改,其檔案內容與chessPlay完全相同)。
打開後,我們可以在專案中看見一些預製物(prefabs)以及程式(Script)。
我們先檢視場景中的 lin-je-chi 這個模型,他是我們的主要玩家角色,在範本中只有他能被操控。我們可以在最右邊的視圖中,看見他所裝載的腳本。
「Path」是用來計算「可移動範圍」,它的參數「M」可以用來調整最大移動距離(圖中設定為可移動5格)。
「Player Controller」是用來讓角色「平滑移動」,其中有些參數有和「Path」共用。它的參數「Move Speed」可以用來調整角色移動的速度,圖中設定為2。
我在攝影機上也裝了一個腳本,可以產生一個「拉遠拉近」的效果,遠近的程度可以透過上圖的兩個參數控制。
如果你不想要有這種效果,可以將兩個參數數值設定成同一個常數。直接刪掉腳本我不確定是否會出錯,因為「Camera Control」的公用參數(public),在其他腳本中也有被呼叫使用。
大致上就是這樣,至於那些紅色方塊則是怪物的替代品。啊,還有一點需要注意,就是棋盤上的角色和怪物,他們的X座標與Z座標必須為整數,否則無法正確執行(這是出於我程式設計的關係)。
一開始是想盡量設計成方便好用的模組,讓不懂程式的人也能使用,不過寫到後來真的覺得有困難
。詳細的腳本裝載跟設定,可以直接參考範例檔會比較清楚。
事實上,我這個程式還不算寫完,例如角色移動時的「跑步動作」,我還沒寫進程式裡(其實是懶得寫
)。而且「移動」只是SLG的其中一項功能,其他還有「攻擊」、「技能」、「道具」等等的,我都沒寫完。
還有一個最最最重要的,那就是怪物的AI系統啊!我覺得這大概是最難寫的部份
,但是要完成這些,才有辦法讓別人去玩你設計的SLG,這絕對不是一件容易的事,有心的人真的要加油,不要放棄!
如果有任何問題的話(像是我的程式BUG啊、解說錯誤啊、或者你覺得怎麼寫更好),都歡迎在底下留言,或是寄站內信討論。
那麼,希望這篇實作分享能對你有幫助喔!
2017/6/5更新:
距離分享這個實作也已經快要兩年了,回頭一看,馬上就能看出這個程式寫得實在不好,但沒想到這居然是我小屋裡,點閱率最高的文章,而且還每天都在上升
?!
有鑑於此,我還是得提醒一下各位朋友。這篇的演算法可以參考,實作方式也可以參考,但盡量不要直接使用。
C#是基於「類別(Class)」的程式語言,也就是我們常說的「物件導向程式(OOP)」,但由於我當初剛學Unity時,最熟的語言是C,C是基於「函式(Function)」的程式語言,兩者在撰寫習慣上大不相同。
簡言之,在寫C#的時候,千萬不要模仿本篇的寫法啊XD。如果有時間的話,我會再把這個東西重寫一次,相信看起來會更好。
不過,相信能理解這套演算法的人,一定也能自己重新實作一次。祝各位學習愉快!
2022/06/03更新: