ゲーム開発日記17(9月16日から10月1日)
進捗報告
前回の日記時点ではシェーダーをすすむようという意気込みだったがどういうわけかシステム面を作り始めていた シェーダー関連は進んでいない
体感だがシステム関連は日記に書けることが多い気がする、シェーダーとかは書くことが少ない気がする...
godotのノードのアイコンを設定
カスタムノードが多くなってどれどれがどれだかわからないという事が多々あった その解決策としてノードのiconを設定できることを思い出した
左側の部分に注目してほしい、Nodeツリーが表示されている
アイコンを変えない場合
アイコンを変えた場合
アイテム関係がかなり完成まで近づいた
アイテムのUIや種類などが決定した 以前作っていなかった理由として目標の使用がきまっていなかったため ゲーム性がほとんどあやふやな状態で作るとかいう事をしていたためだ
アイテムスロットは1~9ありキーボードの対応する番号を押すことでそのスロットのアイテムを使える、(アイテムのソートはするかどうか悩んでいる、これは考えるより遊んでみてあった方がいいかの確認したほうがいい オプションでOnOff可能にして追加するか??)
バフの作成、
アイテムによって一時的に体力上限上昇や継続的な回復、攻撃力の上昇といった効果を実現するには結構ふくざつなシステムが必要らしい
これに結構時間がかかった、理由としてパラメータ関連を再設計したから
理由としてバフ側からパラメータを直接いじるのは結構危険である、とくにセーブ関連やレベルアップなど恒常的な変化に弱い
そのため基本パラメータと現状パラメータに分け、基本パラメータの変更は現状パラメータに反映されるが、現状パラメータの変更は基礎の方には反映されない
以上の変更に付随するBaseEnttyの再設計
パラメータは状態遷移関連などをちょこちょこと整備しなおした
とくに継承したクラスですでに作成した状態に分岐や機能を追加したい場合 結構めんどくさかったのでそこを解決した
マップシステムを再設計した
理由はコードが結構スパゲッティになっていたから、そのため新たなプロジェクトファイルを作りコードをコピペしながら1から作り直していった
一応追いつくことはできたし、いくつかバグや欠点が見つかったので直すことができた
ただその過程で問題が出た、これのせいで車輪の再発明に3日間も要することになった 問題というのはgodot側のバグだ
問題というのは作成したカスタムクラスすべてにclass_nameという行に以下のエラーが出る
Parser Error: Class "クラス名" hides a global script class.
一応名前を変えるとエラーはなくなるがリファクタリング機能が弱いgodotでいちいちそんなことするのは論外バグがバグを産む元になる、コード側に問題がないのにコードを変えるのはナンセンスだ
たぶんだけど同じ名前のクラスは登録できない的な意味なので、なぜかgodot内では同じスクリプトが重複して読み込まれてクラスとして登録しようとしているのだと思う
タイミングとしては別プロジェクトのシーンファイルをそのままぶち込むと問題になる
空のプロジェクトに別のプロジェクトのファイル群をまるまるぶち込むだけなら問題はないがすでに関連するカスタムクラスやスクリプトがある状態でぶち込むとなんかおかしくなる
パラメータの大幅整理
BaseStatesを作成し、attack pramateなどのリソースの継承先を変更 当初はpramateに実装されていた基本パラメータと現状パラメータの機能をBaseStates側に実装
ステータス関連を明確にまとめることができた,そしてattackにもバフが与えられるようになった
BaseStates
L pramate
L attack
コードを載せておく、もしgodot userがみてたら使ってくれ
extends Resource
class_name BaseStates
#自身をコピーし子を作成できる
#set_params で子に値の変更を反映できる pramの場合valueは反映されない
signal seted_pearent
#変化用の子を作る
var is_child:bool
func clone_child():
is_child = true
var child_pramete = self.duplicate()
seted_pearent.connect(child_pramete.set_increment)
return child_pramete
#基礎パラメータを変更する際
func set_params(pram_name:String,pram_value):
if is_child:#子があった場合
var now_pram = get(pram_name)
#ここに二つの型が合ってなければエラーを出すようにする機能もあった方がいい
if typeof(now_pram) != typeof(pram_value):
push_error("Type mismatch between current parameter and new value")
return
#差分を作成
var increment_pram = get_increment(now_pram, pram_value)
#差分を子に反映
seted_pearent.emit(pram_name,increment_pram)
set(pram_name, pram_value)
#差分による変数更新 バフがある状態でも基礎更新を反映するため差分を使う
func set_increment(pram_name:String,increment_pram,pearent = false):
var now_pram = get(pram_name)
if pearent:#pearentなら子にも適応する
seted_pearent.emit(pram_name,increment_pram)
#child_pramete.set_increment(pram_name,increment_pram)
if now_pram is IntPram or\
now_pram is FloatPram:
#変数は変更しない #now_pram.value -= increment_pram.value
now_pram.MIN -= increment_pram.MIN
now_pram.MAX -= increment_pram.MAX
elif now_pram is String:
set(pram_name, increment_pram)
else:
set(pram_name, now_pram + increment_pram)
#二つの値の差分を作成する
static func get_increment(pram1,pram2):
var increment_pram
if pram1 is IntPram or\
pram1 is FloatPram:
increment_pram = pram1.clone()
increment_pram.value -= pram2.value
increment_pram.MIN -= pram2.MIN
increment_pram.MAX -= pram2.MAX
elif pram1 is String:
increment_pram = pram2
else:#int float vectorNなど
increment_pram = pram2 - pram1
return increment_pram
pramateはエンティティやオブジェクト事に保有する 体力や防御、スピードなどほとんどの変数をまとめて保持する
attackは各攻撃ごとに保有し、hitboxやheatCompornentを通して輸送されpramateのHPを更新する
現在回復とattackは共通にしている 当初、0以下のダメージを与えれば実質回復!という思想のもと共通化する方針だったがエフェクトとかを考えると別にした方がいいかもしれない
課題と、今後の予定
当初は来年4月には完成するという甘い予想をしていたが、この調子ではその二倍はかかりそうである、ただアルファ版ならそのころまでに完成しそうである
どうやらグラフィックも仮で一面しかないが最低限遊べる状態のことをプロト版、中核のシステム、グラフィックやメインイベントが完成しているが細かい要素やバランス調整ができてないのがアルファ版というらしい、
プロト版 (開発から5月目の10月中に完成させる)
セーブデータなど必須機能
アクション要素 スキルの取得と使用、 バフ効果、
アイテムの取得と使用
マップ移動、ドアエリアに触れると一部の敵とプレイヤーが別の部屋へ移動できるようにする
ミニマップの表示とファストトラベルなど
簡易的な敵、ドロップ品
デバッグルームとしての簡易マップ 拾えるアイテム ボタン レバー 扉 調べれる場所などのテンプレートを作って機能することを確認する
アルファ版(開発から16月目の来4月中に完成させる )
実際のグラフィックを完成させとりあえず見せれる状態にはする
この時点でストーリーや実装するイベント、ボスも実装できるレベルまで決めておく
実際のマップも実装する
シェーダーも作っておく