Godot 音シュー06「キューブ、置く。俺、進む。 2/2」
前回はキューブを置いただけ。今回はプレイヤを前進させる。本当はトンネルの中を進ませるはずだったんだけど、"ガワ"、作ってないぜ。無い方がスッキリしててイイのかもな。一応今回のゲームはプリミティブ(Godot内蔵の立体)だけで作るのが目標だけど、それでも配置するのがメンドイしな。
プレイヤの準備
ビートに合ったスピードでカメラを前進させるだけじゃなくて、これもちろん「音ゲー」でもあるんだから、イイ感じの所にキューブが来たらそれに反応させる機能も持ってないとイケナイ。じゃないと、キーを押しても Good やら Excellent やらの判断が出来ないからな。
というわけで「Camera」ノードの他、上下左右に「Area」ノードも付ける。このエリアにキューブが入ったらシグナルを出そうって魂胆だ。これらひと固まりでプレイヤとする。
[1]
「Camera」は、
- なんかFovがデフォの"70"だとキューブが近くに来た時、伸びきった感じに見えるので、"60"に変更。
- そんなに遠くの音符キューブが見えなくてもいいだろう。むしろ邪魔だし。1ビードが2mで、1小節4ビート。2小節先まで見えればいいから、"16"でよさそうなんだけど、下のトランスレィションで4m下げてるから、これ足して"20"かな。
- 中心("Spatial_player")より、"4"メートルz方向にずらしている。
とした。
[2]
「Area」ノードにはそれぞれ「Collision」はもちろんだが、エリア位置確認用の「MeshInstance」ノードも付けている。無いとエリア、見えないからね。大きさは、適当でいいと思うけど、配置したキューブと同じ1辺60cmにした。
で、配置位置は、キューブの配置位置、ゲーム画面のアスペクト(縦横比)、カメラの位置とFovなどと相談だ。一応、俺は上下"±1.5"m。左右"±3"mに配置してる。
[3]
肝心のプレイヤ中心、"Spatial_player"は"18"メートルz方向にずらしている。これカウントダウン分な。
カウントダウンは2小節、つまり16m。カウントダウンが始まるまでに1ビートあるから、これを足すと"18"。多分あってる。
こんな感じか。
進むスクリプト
メチャクチャ簡単タン。(スクリプト全文は最後)
[1]
- 変数追加。プレイヤノード操作用と、プレイヤ前進スピード。スピードの出し方さえわかってしまえば、特に問題ない感じだな。のりまき。
[2]
_ready()
関数内でプレイヤノードセット。
[3]
_process(delta)
関数内。お決まり、「my_speed * delta」や~(GDScriptの13)。進行方向は-zだからね、引いてる。
もちろん短くやりたければ、
nPlayer.translation.z -= playerSpeed * delta
だけど、なんでイコール"="の前にマイナス"-"? やっぱ意味わかんない。 "-="?
動くぜ
見た目、これで合ってるように見えるが、どうなんだろな。曲の長さだけキューブを配置するのはメンドクサイので、とりあえず最初の4小節分だけやってみた。
で、重いけど、GIF。
なんか、音が無いからあれだな。エリアに入ったら、キューブの色でも変えるかなー。
・・・いや、ここまで来てふと疑問に思った。
『「Area」ノードって動かしちゃっても、反応するの?』
しまったな。
スクリプト全文
extends Node #曲の前、カウントだうん用 var nASP_kyoku #曲AudioStreamPlayer操作用 var nASP_kouka #効果音AudioStreamPlayer操作用 var nLabel #カウントダウン数字を表示するラベル操作用 var BPM = 113.0 #BPM var SPB = 60.0 / BPM #1ビートが何秒か(ビートの間隔) second(s) per beat var beatTimer = 9 #何ビート後に曲をかけるか var myTime = 0.0 #シーン始まってからの経過時間(SPB越えたら引くけど) #プレイヤ前進用 var nPlayer #プレイヤ操作用 var playerSpeed = BPM / 30.0 #前進スピード(m/s) キューブは2メートル間隔だから(BPM * 2 / 60)で func _ready(): #カウントダウン用 nASP_kyoku = get_node("AudioStreamPlayer_kyoku") nASP_kouka = get_node("AudioStreamPlayer_kouka") nLabel = get_node("Label") #プレイヤ前進用 nPlayer = get_node("Spatial_player") func _process(delta): #カウントダウン-->曲play if beatTimer > 0: countDownPlay(delta) #プレイヤ前進 nPlayer.translation.z = nPlayer.translation.z - (playerSpeed * delta) func countDownPlay(dt): myTime = myTime + dt if myTime - SPB > 0: myTime = myTime - SPB beatTimer = beatTimer - 1 match beatTimer: 8: nASP_kouka.play() 6: nASP_kouka.play() 4: nLabel.text = "3" nASP_kouka.play() 3: nLabel.text = "2" nASP_kouka.play() 2: nLabel.text = "1" nASP_kouka.play() 1: nLabel.hide() 0: nASP_kyoku.play()