![見出し画像](https://assets.st-note.com/production/uploads/images/149010792/rectangle_large_type_2_2312114ddd9cf345a40c6fdcab36a7a7.png?width=1200)
ゲーム開発日記12(7月22 ~ 7月29)
週一の進捗日記 13週目
コードとかは乗せるかもしれないけどゲーム部分、ストーリーやギミックのネタバレは避けます
ゲームエンジン godot4.2 OS windows10 開発ゲーム:リミナルスペースをもとにしたメトロイドヴァニアホラーアクション
進捗
・攻撃やクリック 当たり判定が完成した 以前から悩んでいたONOFFに関する問題も解決した
攻撃自体をリソースすることで大幅に使いやすくなった
最近のマイブームは設計に困ったらGodotの使用や設計にならって作ってみること Godotがもともと洗練されまくってるのでそれに似た仕組みの使用を実装するだけでコードがきれいになる
全体的にテストコードとデバッグを書いて安全性を高めた
エンティティの進捗
最終的なエンティティの継承関係は以下のようになる予定
BaseEntty (すべてのエンティティの元)
WarkEntty (BaseEnttyを継承する すべての歩くエンティティの元)
HumanEntty (WarkEntty を継承する 人型エンティティの元)
キャラクター (HumanEnttyを継承する 各キャラクターの実装になる)
現在WarkEntty までは作成した 操作感も違和感なくなった(ワンチャン慣れてしまっただけかもしれない)
HumanEnttyの部分を作成中
インベントリシステムが完成した
初期ではvvvvが14個ある それぞれのアイテムにはスタック限界とスタック数が設定されている
![](https://assets.st-note.com/img/1722317817366-SZ6jOeBSZE.png?width=1200)
左側にある二つのアイテムをとり vvvvが19個 ggggが15 flanが63個になった
![](https://assets.st-note.com/img/1722317822895-xxJ5oPgEom.png?width=1200)
アイテムオブジェクトの排出以外は大体完成した
・メトリドヴァニアに必須なスキルの追加機能も完成した 汎用性を求めすぎた結果コンポーネントの統一管理システムじみた物になった
スキルかんりだけでなくコンポーネント全体の管理という役目をもたせてみてもいいかもしれない
各スキルは一つのクラスでスキルノード側から自身の存在を申告し スキル管理システムに登録させるという事
このシステムにしたことで自由度が跳ね上がった 当初はBaseSkillのようなものを作成する予定だったがこの方式にして正解だった
これによってスキル自体は スキル名(識別名)と起動するスキルさえあればいい 継承元はRefCountでもNodeでもいい
active_skillという関数を作成しておけばスキル管理側が操作をもとにいい感じに操作キーを割り当て実行してくれる
ただ今の設計では関数の上書きはできない たとえばパディがあったとして スキルを獲得することによってパディver2になるとする
その場合 今の設計ではactive_skillにパディver2の中身を書いてしまうとパディとパディver2両方が実行されてしまう事になる
パディ側にスキルの保有を検知して切り替えるような仕組みを作れば解決はするが 関数の上書きじみた仕組みができないかと考えたりしなかったりしている
さすがにそこまでの能力があると保守性に問題が出るからいまのままでいいかもしれない、、、ただ切り替えは重複する仕組みだからこれもコンポーネント化することになるだろう
大体以下のようなものはできるようになった 一週間の成果としていいと思う
スイッチ、レバー、 ドア クリックすると何かおきるが壊すことできるオブジェクト
クリックで開けれる宝箱 壊すとアイテムがでる樽 ステージ 地上敵、 プレイヤー
Tips
メモリ管理、循環参照の注意
Refcountは参照によってメモリ管理を行っているため循環参照をしてしまうとメモリリークが発生する 注意
Refcountを継承するResorseを多用する場合も要注意
nodeより軽いものが欲しい場合 Objectは明示的にObject.freeをしないとメモリに残り続けるためResorseやRefcountを基本的に使用する
ただしNodeの場合 treeで管理されているためその心配はない ただシグナルの解除は明示的にやった方がいい場合もある
@exportと_initの順番 _initの後@exportが実行される 以下のような場合、エディタからMAXを設定するとvalueへの反映が行われなくなるので注意
extends Resource
class_name FloatPram
@export var MAX:float = 1.
@export var MIN:float = 0.
@export var value:float = 0.0
func _init(max_ = null,min_= null):
if max_ !=null:
MAX = max_
if min_ !=null:
MIN = min_
value = MAX#ほんとはエディタで設定したMaxになってほしいが@exportは後から実行されるため常に1になる
デバッグの知見
いままでコードにprintをつけたり その都度表示するコードを書いてデバッグしていた
もし同じやり方をしてる人がいたら デバッグ用コンポーネント シグナルによるコンポーネントを押したい
デバッグ用のスクリプトをアタッチしたラベルノードを作り手動でシグナルをつないだりデバッグしたいノードの参照を持たせる(@exportをつかうとよい)
そしてtextに表示したい内容を書かせる これのメリットは作成しているコードを汚さずにデバッグができそのテストコードも再利用できるという事
課題、
マップシステムを仕上げる
・部屋を実際にツリーに追加する処理がまだできてない
・ミニマップの表示をもう少し充実
・loadの問題を解決する
・プラグイン化して別のプロジェクトに入れてみる
エンティティシステムを完成させる
・基礎は出来たので具体的な敵の挙動などを作っていく
ヴィジュアル
・決まったはずのヴィジュアルのほう格子柄が再び錯綜し始めた
・スクリーンと焼きこみリニアの見え方の差を改善
・GDshederの関数や変数についての情報が少ないまま
・ リムライトや鏡面反射は自分で実装する必要がありそう
・絵のクオリティ向上
・動き関連の知識とノウハウが少ないので強化する必要がある
・スケルトン2Dについては相変わらずようわかんまま
絵素材は自分で書けるからいいが音楽とか音ほんとにどうしよ、BGMは必須だよな でもフリー素材は被る