[遊戲製作進度] [大型專案:BK MOD] ~EP.03~ 各種哩哩摳摳的功能陸續上菜嘍



  繼前回的說明文,這回小弟將地圖編輯器功能完整之後,開始加入闖關需要的一些要素。前一次的說明可以參考以下的文章:



上一篇:
[遊戲製作進度] [大型專案:BK MOD] ~EP.02~ 自定義遊戲地圖編輯器與2D物理系統架構
https://hcyang1227.blogspot.com/2023/04/bk-mod-ep02-2d.html

下一篇:
[遊戲製作進度] [大型專案:BK MOD] ~EP.04~ 各種細節微調與招式初步製作
https://hcyang1227.blogspot.com/2023/06/bk-mod-ep04.html




遊戲名稱:BK-MOD(V0.1.09)
遊戲類型:橫向卷軸動作遊戲
發表日期:2024/10/08

遊戲雛型下載點:
https://drive.google.com/file/d/1OamQtUduZo45rS_ZEUS6mhnlNRLknV8Z





★加入中立物件【Stone】






  【Stone】是第一個小弟加入BK MOD的中立物件。其實如果只有這個中立物件,它的動作是所有角色物件當中最簡單的了。只要加上Rigidbody2D物理碰撞引擎Collider2D碰撞範圍,基本上就大功告成了,非常輕鬆寫意ヽ(✿゚▽゚)ノ





  為了讓石頭有種在"滾動"的感覺,除了Rigidbody2D不勾選freeze position與freeze rotation以外,小弟還加了一段C# script,讓石頭可以在旋轉0~60度時顯示第一個sprite,旋轉60~120度時顯示第二個sprite,以此類推。這是為了模擬LF2的石頭在滾動的時候會顯示不同的sprite。




  另外小弟也踩了幾個坑。最一開始,【Stone】的Collider2D是圓形的,感覺沒什麼問題,石頭也會掉下來然後滾來滾去。然而後來就發現不對勁了,當石頭在一個碗狀地形滾的時候,石頭來來回回滾了十幾次,太多次了,跟實際的石頭不符;但是把石頭的material2D的摩擦力調到爆高,也解決不了問題,最後才用Polygon Collider2D勉強解決。真實世界的石頭,事實上也不是正圓形的,而是有某些一定的稜角,只是很接近圓形而已(๑´ㅂ`๑)




  另一個小弟踩的坑,也還沒有完美解決的,是玩家移動主角的時候,玩家會"走上"甚至"翻越"石頭。這個原因主要是因為,玩家移動的時候,必須用持續的rigidbody2d.AddForce為玩家物件增加往前的外力,並達到終端走路速度。然而因為給的外力是持續的,當這股往前的力碰到【Stone】的時候,石頭會往前滾,並給玩家物件一個稍微往上的反作用力,因此走久了,這股反作用力就會讓玩家"翻越"石頭。小弟順著ChatGPT的解答,嘗試了調高石頭material2D的摩擦力,沒有用。從AddForce(..., ForceMode2D.Force)改成AddForce(..., ForceMode2D.Impulse),沒有用。修改玩家物件的Collider2D形狀,沒有用。這時候的ChatGPT便開始鬼打牆了。小弟最後只好改成,讓玩家碰觸到石頭的當下,將向前的速度反轉成向後的速度,才勉強解決問題。但是這樣的解法,變成玩家有辦法利用這反轉向後的速度後跳躍,增加跳躍的移動速度,很不符合實際世界的物體動態。但是沒辦法,小弟目前沒轍(。í _ ì。)





★加入第一個敵人【SlimeBlue】






  用以前在拯救貪吃老人大作戰蒐集的素材,小弟移植了第一個敵人【SlimeBlue】。在上次的地圖編輯器其實就開始做了,只是為了完整這個角色,後面又費了不少心力。因為史萊姆的AI跟動作相對好做,小弟就不斷地以牠為主題,增加各種周邊功能。為了模擬史萊姆黏黏的移動狀態,小弟將史萊姆的Rigidbody2D的Angular Drag調成10000(如此一來,史萊姆便會旋轉得很慢、有種阻尼的感覺),並且設定Material2D的Slime材質的摩擦力為50(如此一來,史萊姆便會移動得很遲緩),兩者皆遠高於一般的物件。





  在做好【SlimeBlue】的基本物理動作後,接下來便是設計AI跟各種狀態。AI的部分容小弟不透漏,畢竟是遊戲的要素,而且寫得也很簡略。各種狀態的部分,小弟加入了各種正負面狀態(包含Buff跟Debuff),然後就很開心的看著自己創造的史萊姆被火燒、被雷電、被冰凍,呈現其他負面狀態(中毒、麻痺等等)。為了讓玩家更能一目瞭然目前的敵人狀態,小弟試著將【SlimeBlue】的SpriteRenderer的Color變色,做出被火燒的冒煙效果,做出被冰凍無法移動(被卡在冰塊裡)的效果,也做出Buff跟Debuff狀態底下、敵人右上角會出現目前是哪項能力被Buff/Debuff d(`・∀・)b






  接下來,小弟也設計了一些判定式,可以讓敵人/我方有速度太高的判定效果。速度太高的另外一種講法,就是從高處落下的高速運動、衝刺撞到另一個反向運動的相對高速運動等等。簡單來說,撞牆、落下、我方與敵方的高速招式相撞,都會進入這個判定,並根據速度的快慢計算損傷。也就是說,如果玩家/敵人從非常高的地方落下,是會喪命的(。◕∀◕。)





★加入主角【Kate】






  【Kate】這個角色應該就比較有人可能知道了,也是小弟在高中時期一筆一筆畫出來的皮卡丘人偶裝的精靈圖。除了Collider2D是用直立的Capsule Collider2D以外,跟【SlimeBlue】一樣,會有Rigidbody2D的物理引擎影響,也有各種正負面狀態。製作到這個時候,小弟也將凱特跟其他角色加上了SkillPoint,去計算角色的基礎能力值、Buff跟Debuff的影響時間、Buff跟Debuff狀態下能力值提升\降低成多少數值等等。






  為了讓遊戲玩起來比較容易切入,小弟將傷害與攻擊\防禦等的關聯公式設計出來,公式如上。簡單來說,傷害可以分為物攻\物防、特攻\特防、固定傷害這三種,大部分玩家對寶可夢系列遊戲不陌生,或是有些也有玩過像是魔物獵人等遊戲,對於這些傷害的設定,應該會比較容易理解。






  目前還在努力的,是主角【Kate】的各種大大小小的招式。除了一般的攻擊(揮拳、甩尾巴等等),也移植了拯救貪吃老人大作戰跟以前LF2_Kate的招式。目前已經移植雷電球跟電光一閃兩個招式。未來還有很多要加進去,像是打雷、獄火球、各種武器、元素攻擊等等,這些應該也會增加遊戲的一些趣味性。:.゚ヽ(*´∀`)ノ゚.:。





★設定可視範圍【Camera】


  這個比較難用圖片表達,但簡單來說就是遊戲畫面的顯示範圍。小弟將主角不能越線的左右牆、視界的上下牆,也都加到遊戲裡面。【Camera】被限制在視界的上下左右牆內,玩家只能在限定的範圍內移動,便不會將視界以外不想顯示的東西顯示在畫面上





★對話框與配音






  做好大部分的關卡元素以後,小弟便花了數天時間製作劇本對話以及錄音。對話框如圖所示,目前還沒有美化,但基礎的功能至少有了。錄音的部分,小弟也是頻頻踩雷。第一次就要幫遊戲配三種語言的語音,其實非常的困難,因為配音員只有小弟我而已XD 其他都是靠效果器變聲,讓角色聽起來比較多元。


  這邊小弟也寫了一個小小的Python程序,是自動生成TTS語音的腳本。寫法也很簡單,這邊便不再贅述內容,直接上代碼。


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import xlrd
from gtts import gTTS
import os

path = "./GameDialogue.xls"
book = xlrd.open_workbook(path)
sheet = book.sheet_by_index(0)
row = 1
while (row < sheet.nrows):
    if (sheet.cell_value(rowx=row, colx=3) != "-"):

        string = sheet.cell_value(rowx=row, colx=4)
        if (not os.path.exists('./TTS/CHT-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')):
            if (len(str.replace(str.replace(string, '…', ''), '.', '')) > 1):
                print(string)
                tts = gTTS(text=string, lang="zh-tw")
                tts.save('./TTS/CHT-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')
        else:
            print("TTS already generated...")

        string = sheet.cell_value(rowx=row, colx=5)
        if (not os.path.exists('./TTS/ENG-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')):
            if (len(str.replace(str.replace(string, '…', ''), '.', '')) > 1):
                print(string)
                tts = gTTS(text=string, lang="en", tld='us')
                tts.save('./TTS/ENG-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')
        else:
            print("TTS already generated...")

        string = sheet.cell_value(rowx=row, colx=6)
        if (not os.path.exists('./TTS/JAP-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')):
            if (len(str.replace(str.replace(string, '…', ''), '.', '')) > 1):
                print(string)
                tts = gTTS(text=string, lang="ja")
                tts.save('./TTS/JAP-' + str(int(sheet.cell_value(rowx=row, colx=0))) + '.mp3')
        else:
            print("TTS already generated...")

    row += 1






★標題動畫(V0.0.8)


  這邊也不多敘述,讓各位大大直接欣賞標題的效果動畫吧~(❛◡❛✿)







★開頭動畫與關卡編輯器(V0.0.12)




沒有留言:

張貼留言