ゲーム開発日記1(4月20日から5月13日)


こんにちわ クテェアです
開発を始めた段階で書くべきだったかもしれんが書かずに時間がたっちゃったものはしょうがない、今日から書いてく
現状、開発から1か月 というのもgodotエンジンを初めて触ったのでいろいろ操作感やら仕組みやらを調べてるうちに結構たっちゃった

4月20日から5月13日までの進捗とメモ

コードとかは乗せるかもしれないけどゲーム部分、ストーリーやギミックのネタバレは避けます

ゲームエンジン godot4.2   OS windows10

制作内容

メトロイドヴァニア+ホラーを組み合わせた2dアクションホラーゲーム
backroomやリミナルスペースのような空間をさまよい、奇妙なクリーチャーを倒しながら物語が進むというもの

3d一人称視点のリミナルスペース系ゲームはいろいろあるが2Dとかはあまりないので作ってみますすでに作っている人はいるのでbackroomsを直接扱うつもりはない、独自路線に行くことにする

あの明るいのに不気味な空間で幽霊とか怪物とかと戦ったり追いかけられたりしたい、後可愛い女の子が不気味な空間でぽつんといる光景って興奮する

進捗報告

まだ現状形になるものはない というのもヴィジュアルが決まってないので形になってる感がない、まともに見せられるようになるのって結構後になるんだなー

1.ステートマシンを作成、パラメータクラスを作成 (パラメータはひとまとまりにしたかった、しかしこれでいいのかな?)
2.とりあえず設計やらBaseクラス、コンポーネントを作成
まだ操作感が最悪なので要修正

パラメータ

体力とかの上限値がある変数とかをまとめるためintpram floatpramを作成してみた

extends Object
class_name Pramete

# Called when the node enters the scene tree for the first time.
var pram_type={}
var pram={}
func append(pram_name, velue,pram_max=null,pram_min=null):#パラメータの追加
 #print (typeof(pram_max)," ",TYPE_INT," ",TYPE_FLOAT)
	if typeof(pram_max) == TYPE_INT:
		if pram_min==null:
			pram_min=0
		pram[pram_name] =  intpram.new(pram_max,pram_min)
		
	elif typeof(pram_max) == TYPE_FLOAT:
		if pram_min==null:
			pram_min=0.0
		pram[pram_name] =  floatpram.new(pram_max,pram_min)
		
	else:
		pram[pram_name] =  velue
		
func update(pram_name, pram_num):#パラメータの値更新
	if pram[pram_name]is intpram or \
	pram[pram_name] is floatpram:
		pram[pram_name].velue =pram_num
	else:
		pram[pram_name] = pram_num
		
func add(pram_name, pram_num):#パラメータの値更新
	if pram[pram_name]is intpram or \
	pram[pram_name] is floatpram:
		pram[pram_name]._add(pram_num)
	else:
		pram[pram_name] += pram_num
		

			
class intpram:
	var velue
	var max
	var min
	func _init(max:int=100,min:int=0):
		self.velue = max
		self.max =max
		self.min = min
		
	func _add(other):
		velue = clamp(velue + other ,min,max)
		
class floatpram:
	var velue
	var max
	var min
	func _init(max:float=1,min:float=0):
		self.velue = max
		self.max =max
		self.min = min
		
	func _add(other):
		velue = clamp(velue + other  ,min,max)

ステートマシン、

add_stateで状態を追加する
name:状態名、state_func:状態の関数、change:外部から変更可能な移行先のリストを入力とする
change_stateで状態を切り替える
change_order、これは外部から状態を移行する命令を送るときの関数
 flagの中に移行先が入っていた場合のみ移行するまたstate_prcessというブール値で状態が以降可能かを指定できる 
これによって簡単に外部から状態移行をできるようにしながらオブジェクト側が状態移行先を知っている、管理している状態にできる(状態移行の条件は統一的に記述したかったためこのようにした)

extends Object
class_name StateMachine

var flag = {"nill":true}
var states = {"nill":nill}
var now_state = "nill"
var count=0
var state_prcess = true

func all_flag_change(args:bool = false):
	for a in flag.keys():
		flag[a] = args
		
func nill(args:String,data:Dictionary):
	pass
	
func add_state(name:String, state_func,change:Array=[]):
	states[name] = state_func
	var dict = {}
	for a in change:
		dict[a] = true
	flag[name] = dict#辞書型に変換して保存
	
func change_order(name:String,data:Dictionary={},Restart:bool=false):
	if flag[now_state].has(name) and state_prcess:
		if flag[now_state][name]:
			change_state(name,data,Restart)

func change_state(name:String,data:Dictionary={},Restart:bool=false):
	if !state_prcess:
		return
	if not Restart:
		if name == now_state:
			return
	if states.has(name):
		states[now_state].call("end",data)#終了処理
		states[name].call("start",data)#開始処理
		now_state = name
		count=0
	else:
		print("assart 未知のモーション:",name)
		
		
func update(data:Dictionary={},):
 #print (now_state, states.has(now_state))
	count+=1
	data["count"] = count
	if states.has(now_state):
		return states[now_state].call("update",data)
			

以下のように、一つの状態に一つの関数を割り当て argsで条件分岐してうんようするようにした 他の人のコードでは一つの状態に一つのクラスを割り当てているが記述量の少ないような状態にも対応できるようにこのようにした

func xxx_action(args:string,data):
	if args=="start"
		状態移行時の処理
	if args=="update"
		その状態の時の処理
	if args=="end"
		状態終了の処理


やっててわかったがNodeとシグナル便利すぎwwwww
こりゃすげえわ、こんなんしったらもうunityにもどれんやん、シグナルまじ便利

改善点、課題

グラフィックについて

なんでリミナルスペースの2Dゲームがほとんどないかがなんとなく分かった
相性が悪い、というのもリミナルスペースの性質上 建物、つまり平面が多い そして壁やら天井やらがきれいにつながっているせいでごまかしがきかないんだ
パララックススクロールやらフィルターで遠近感や空気感出すにはああいう幾何学的な空間って相性悪い 明らかに3Dの一人称が合う、まともな人ならこの時点でunrealの3dを作るんだと思う  
もちろん、レトロなグラフィックでドット絵とかにしたりRPGツクール的なグラフィックにすればそういう問題は気にしなくてもいいかもしれにけどそれだと没入感が足りない

あの不気味さを演出できない、広くて永遠に続いてそう、でも建物の中  明るいのに不気味で締め付けるような孤独感のような物を感じる
そんな雰囲気がリミナルスペースの魅力でゲームでもそれを出すのは必須、ドット絵ではあの雰囲気は出しずらい

あとメトロイドバニアにするなら視点とかの関係上、リミナルスペース特有の永遠に奥行きが続いてるみたいなのも多用しずらい
あってもいいけどあそこに気になるのになんでいけないの?みたいなシステムの制約間がプレイ中感じてしまうのは問題、
だから左右上下移動だけで気になる所をすべて探索した感が感じられてあの立体感と広さも演出しないといけない、あれ?むずくねこれ

そしてメトロイドバニアみたいなものがなんで自然とかぼこぼこしてる地形が多いのかというと丸いとパースやら奥行きやらをごまかしやすいからだと思う
ホロウナイトでもENDER liliersでも物体のシルエットを前後に配置することでタイルマップ地形の平坦さをごまかしてる、そうやってきれいな立体感がある空間ができてる
リミナルスペースライクの空間ではこれはむずい、物を置いてごちゃごちゃさせると雰囲気が壊れる

スケルトン2dの透明化問題

なんかなボーンを割り当てて有効化するとポリゴンが描画されなくなる、回転位置とかの関係でずれて見えなくなるみたいな話は見つけたがちょっと違う症状  情報見つからないしなんか解決の見込みない、どうすりゃいいん?


この記事が気に入ったらサポートをしてみませんか?