俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

Godot 音シュー06「キューブ、置く。俺、進む。 2/2」

前回はキューブを置いただけ。今回はプレイヤを前進させる。本当はトンネルの中を進ませるはずだったんだけど、"ガワ"、作ってないぜ。無い方がスッキリしててイイのかもな。一応今回のゲームはプリミティブ(Godot内蔵の立体)だけで作るのが目標だけど、それでも配置するのがメンドイしな。

f:id:ore2wakaru:20180613110322p:plain


プレイヤの準備

ビートに合ったスピードでカメラを前進させるだけじゃなくて、これもちろん「音ゲー」でもあるんだから、イイ感じの所にキューブが来たらそれに反応させる機能も持ってないとイケナイ。じゃないと、キーを押しても Good やら Excellent やらの判断が出来ないからな。

というわけで「Camera」ノードの他、上下左右に「Area」ノードも付ける。このエリアにキューブが入ったらシグナルを出そうって魂胆だ。これらひと固まりでプレイヤとする。

f:id:ore2wakaru:20180613091055p:plain

[1]

Camera」は、

f:id:ore2wakaru:20180613092446p:plain

  1. なんかFovがデフォの"70"だとキューブが近くに来た時、伸びきった感じに見えるので、"60"に変更。
  2. そんなに遠くの音符キューブが見えなくてもいいだろう。むしろ邪魔だし。1ビードが2mで、1小節4ビート。2小節先まで見えればいいから、"16"でよさそうなんだけど、下のトランスレィションで4m下げてるから、これ足して"20"かな。
  3. 中心("Spatial_player")より、"4"メートルz方向にずらしている。

とした。

[2]

Area」ノードにはそれぞれ「Collision」はもちろんだが、エリア位置確認用の「MeshInstance」ノードも付けている。無いとエリア、見えないからね。大きさは、適当でいいと思うけど、配置したキューブと同じ1辺60cmにした。

で、配置位置は、キューブの配置位置、ゲーム画面のアスペクト(縦横比)、カメラの位置とFovなどと相談だ。一応、俺は上下"±1.5"m。左右"±3"mに配置してる。

f:id:ore2wakaru:20180613094601p:plain

[3]

肝心のプレイヤ中心、"Spatial_player""18"メートルz方向にずらしている。これカウントダウン分な。

f:id:ore2wakaru:20180613103636p:plain

カウントダウンは2小節、つまり16m。カウントダウンが始まるまでに1ビートあるから、これを足すと"18"。多分あってる。

こんな感じか。


進むスクリプト

メチャクチャ簡単タン。(スクリプト全文は最後)

[1]

f:id:ore2wakaru:20180613095719p:plain

  • 変数追加。プレイヤノード操作用と、プレイヤ前進スピード。スピードの出し方さえわかってしまえば、特に問題ない感じだな。のりまき。

[2]

f:id:ore2wakaru:20180613100454p:plain

  • _ready()関数内でプレイヤノードセット。

[3]

f:id:ore2wakaru:20180613100733p:plain

  • _process(delta)関数内。お決まり、「my_speed * delta」や~(GDScriptの13)。進行方向は-zだからね、引いてる。

もちろん短くやりたければ、

nPlayer.translation.z -= playerSpeed * delta

だけど、なんでイコール"="の前にマイナス"-"? やっぱ意味わかんない。 "-="?


動くぜ

見た目、これで合ってるように見えるが、どうなんだろな。曲の長さだけキューブを配置するのはメンドクサイので、とりあえず最初の4小節分だけやってみた。

で、重いけど、GIF。

f:id:ore2wakaru:20180613105124g:plain

なんか、音が無いからあれだな。エリアに入ったら、キューブの色でも変えるかなー。

・・・いや、ここまで来てふと疑問に思った。

『「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()