2020/11/18(水) [n年前の日記]
#1 [godot] Godot Engineで3Dモデルデータをインポート
Godot Engine 3.2.3 x64 を使って3D表示の簡単なシューティングゲームっぽいものを作る。
今回は、3DCGソフト blender 2.83.9 x64 LTS で作成した飛行機(自機)や敵のモデルデータをインポートしたい。
今回は、3DCGソフト blender 2.83.9 x64 LTS で作成した飛行機(自機)や敵のモデルデータをインポートしたい。
◎ 自機のモデルデータをblenderからエクスポート。 :
blender で飛行機っぽいモデルデータを作ってみた。CC0 / Public Domain ってことで。中には blender用のファイル airplane_type_b.blend やテクスチャ画像が入っている。
_airplane_type_b_20201108.zip
Godot Engine はいくつかの3Dモデルデータフォーマットに対応しているけれど、アニメーションを含まない形状データだけなら glTF 2.0 でやり取りするのが良さそうな気がする。glTF 2.0 なら、他のフォーマットと違ってテクスチャもそのまま反映されるので。
blenderから glTF 2.0形式でエクスポートする。ファイル → エクスポート → glTF 2.0 (.glb/.gltf)を選択。
フォーマットは「glTFバイナリ (.glb)」にした。その他の設定はスクリーンショットを参考に。airplane_type_b.glb としてエクスポート。
_airplane_type_b_20201108.zip
Godot Engine はいくつかの3Dモデルデータフォーマットに対応しているけれど、アニメーションを含まない形状データだけなら glTF 2.0 でやり取りするのが良さそうな気がする。glTF 2.0 なら、他のフォーマットと違ってテクスチャもそのまま反映されるので。
blenderから glTF 2.0形式でエクスポートする。ファイル → エクスポート → glTF 2.0 (.glb/.gltf)を選択。
フォーマットは「glTFバイナリ (.glb)」にした。その他の設定はスクリーンショットを参考に。airplane_type_b.glb としてエクスポート。
◎ Godot Engineにインポート。 :
◎ Godot Engine で開く。 :
インポートした .glb を右クリックして「シーンを開く」を選択。
確認ウインドウが開く。とりあえず「新規の継承」を選択。
Godot Engine のエディタ画面内にモデルデータが表示された。
Godot Engine のシーンとして保存しておく。res://assets/ の下に、airplane_type_b.tscn として保存した。
確認ウインドウが開く。とりあえず「新規の継承」を選択。
Godot Engine のエディタ画面内にモデルデータが表示された。
Godot Engine のシーンとして保存しておく。res://assets/ の下に、airplane_type_b.tscn として保存した。
◎ プレイヤーのモデルデータを差し替える。 :
今まで仮で表示していたプレイヤーキャラのモデルデータを差し替える。
プレイヤーのシーン、Player.tscn を開いて、新規インスタンスを読み込むボタンをクリック。airplane_type_b.tscn を開く。
Player の下に airplane_type_b ノードとして追加された。
PlayerModel の下にドラッグして移動して、向きや大きさを変更する。
今まで表示していた仮モデルは、目のアイコンをクリックして非表示にする。仮モデルを今後一切使わない予定なら、右クリックして「削除」してしまってもいい。
アタリ範囲を修正。CollisionShape を選択して大きさや位置を修正する。
シーンを保存して動作確認。Mainシーンを開いてF6キーを押す。
これで、プレイヤーキャラのモデルデータを、今回インポートしたモデルデータで差し替えることができた。
プレイヤーのシーン、Player.tscn を開いて、新規インスタンスを読み込むボタンをクリック。airplane_type_b.tscn を開く。
Player の下に airplane_type_b ノードとして追加された。
PlayerModel の下にドラッグして移動して、向きや大きさを変更する。
今まで表示していた仮モデルは、目のアイコンをクリックして非表示にする。仮モデルを今後一切使わない予定なら、右クリックして「削除」してしまってもいい。
アタリ範囲を修正。CollisionShape を選択して大きさや位置を修正する。
シーンを保存して動作確認。Mainシーンを開いてF6キーを押す。
これで、プレイヤーキャラのモデルデータを、今回インポートしたモデルデータで差し替えることができた。
◎ 敵のモデルデータをblenderからエクスポート。 :
敵のモデルデータをエクスポートする。これも blender で作成した。CC0 / Public Domain ってことで。
_enemy_type_b_20201108.zip
解凍すると、blender用のファイル、enemy_type_b_fix.blend が入っている。このモデルデータは、両手がくるくると回るアニメーションデータを含んでいる。
現時点では、こういった複数のアニメーションを持っているデータに関しては、ESCN (.escn) 形式で ―― Godot Engine にとってネイティブ(?)な形式でエクスポートしておくと、比較的真っ当にアニメーションのデータをエクスポート・インポートできるらしい。
blender から ESCN形式でエクスポートするためにはアドオンのインストールと有効化が必要になる。該当アドオンはgithub上で公開されてる。
_godotengine/godot-blender-exporter: Addon for Blender to directly export to a Godot Scene
blenderのユーザ設定フォルダは、Windows環境ならおそらく以下にあるはず。
io_scene_godotフォルダをコピーしたらアドオンを有効化する。
敵のモデルデータを blender からエクスポートする。ファイル → エクスポート → Godot Engine (.escn) を選択。
保存先フォルダは、Godot Engine のプロジェクトフォルダ\imports\ を指定しておく。その他の設定はスクリーンショットを参考に。enemy_type_b_fix.escn というファイル名で保存した。
_enemy_type_b_20201108.zip
解凍すると、blender用のファイル、enemy_type_b_fix.blend が入っている。このモデルデータは、両手がくるくると回るアニメーションデータを含んでいる。
現時点では、こういった複数のアニメーションを持っているデータに関しては、ESCN (.escn) 形式で ―― Godot Engine にとってネイティブ(?)な形式でエクスポートしておくと、比較的真っ当にアニメーションのデータをエクスポート・インポートできるらしい。
blender から ESCN形式でエクスポートするためにはアドオンのインストールと有効化が必要になる。該当アドオンはgithub上で公開されてる。
_godotengine/godot-blender-exporter: Addon for Blender to directly export to a Godot Scene
- 上記ページ内の、「Code」と書かれた緑色のボタンをクリック → 「Download ZIP」を選択。godot-blender-exporter-master.zip がダウンロードできる。
- 解凍して、io_scene_godot というフォルダを blender のユーザ設定フォルダにコピーすればインストールできる。
blenderのユーザ設定フォルダは、Windows環境ならおそらく以下にあるはず。
C:\Users\<ユーザアカウント名>\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\
io_scene_godotフォルダをコピーしたらアドオンを有効化する。
- blender を起動して、編集 → プリファレンス → アドオン。
- 検索欄に「godot」と打ち込めば「Import-Export: Godot Engine Exporter」がリストアップされる。
- チェックを入れて有効化。
敵のモデルデータを blender からエクスポートする。ファイル → エクスポート → Godot Engine (.escn) を選択。
保存先フォルダは、Godot Engine のプロジェクトフォルダ\imports\ を指定しておく。その他の設定はスクリーンショットを参考に。enemy_type_b_fix.escn というファイル名で保存した。
◎ Godot Engineで敵のモデルデータを開く。 :
Godot Engine で敵のモデルデータを開く。enemy_type_b_fix.escn をダブルクリック。
Godot Engine のエディタ画面内に、敵のモデルデータが表示された。
Godot Engine のシーンファイルとして保存しておく。res://assets/ の下に enemy_type_b_fix.tscn として保存した。
Godot Engine のエディタ画面内に、敵のモデルデータが表示された。
Godot Engine のシーンファイルとして保存しておく。res://assets/ の下に enemy_type_b_fix.tscn として保存した。
◎ アニメーション設定を修正。 :
この敵のモデルデータはアニメーションデータを持っているけど、発生と同時にアニメーションを再生したり、アニメーションをループさせたりしたい。そのために少しだけ設定をし直す。
設定を変更するために、継承をクリアしておく。enemy_type_b_fix を右クリックして「継承をクリア」。
アニメーションを管理しているノード、AnimationPlayer を選択して、自動再生とループ再生のアイコンをクリックして有効にしておく。
この状態で、enemy_type_b_fix.tscn を一旦保存。
設定を変更するために、継承をクリアしておく。enemy_type_b_fix を右クリックして「継承をクリア」。
アニメーションを管理しているノード、AnimationPlayer を選択して、自動再生とループ再生のアイコンをクリックして有効にしておく。
この状態で、enemy_type_b_fix.tscn を一旦保存。
◎ 敵のモデルデータを差し替える。 :
敵のモデルデータを差し替える。res://assets/EnemyZako.tscn を開く。インスタンス追加アイコンをクリック。enemy_type_b_fix.tscn を開く。
enemy_type_b_fix.tscn が表示された。
Mainシーンを開いて、F6キーを押して動作確認。
これで、敵のモデルデータも差し替えることができた。
位置や大きさについては、なんとなくイイ感じの見た目になるように、その都度修正のこと。
次回は、背景についてもモデルデータを差し替えたい。
enemy_type_b_fix.tscn が表示された。
- enemy_type_b_fix の位置、大きさ、向きを調整。
- enemy_type_b_fixノードを EnemyZakoModel の下に配置。
- 今まで表示していた仮モデルは非表示にする。
- CollisionShape を選択してアタリ範囲を修正。
Mainシーンを開いて、F6キーを押して動作確認。
これで、敵のモデルデータも差し替えることができた。
位置や大きさについては、なんとなくイイ感じの見た目になるように、その都度修正のこと。
次回は、背景についてもモデルデータを差し替えたい。
[ ツッコむ ]
#2 [godot] Godot Engineで背景の3Dモデルデータをインポート
Godot Engine 3.2.3 x64 を使って3D表示の簡単なシューティングゲームっぽいものを作る。
今回は、背景についてもモデルデータを差し替えてみる。
今回は、背景についてもモデルデータを差し替えてみる。
◎ モデルデータをエクスポート。 :
blender で背景モデルを作成して glTF 2.0 でエクスポート。モデルデータは以下。CC0 / Public Domain ってことで。
_bg_type_c_20201109.zip (スクリーンショット内で使ってた版)
_bg_type_c_take3_20201111.zip (再作成版。大きさや構成を変更してある)
アニメーションを含んでないモデルデータなので、glTF 2.0 でエクスポートすれば問題は起きにくいはず。
Godot Engine にインポートして開いてみる。表示された。bg_type_c.tscn というファイル名でシーンとして保存。
_bg_type_c_20201109.zip (スクリーンショット内で使ってた版)
_bg_type_c_take3_20201111.zip (再作成版。大きさや構成を変更してある)
アニメーションを含んでないモデルデータなので、glTF 2.0 でエクスポートすれば問題は起きにくいはず。
Godot Engine にインポートして開いてみる。表示された。bg_type_c.tscn というファイル名でシーンとして保存。
◎ Bgシーンに読み込んでみる。 :
Bgシーン、res://assets/Bg.tscn を開いて、インスタンスを追加。bg_type_c.tscn を開く。今まで使っていた仮モデルは非表示にするか削除する。
BgModel の下に配置して、右クリック → 複製で数を増やして、比較的広大な(?)シーンにした。
Mainシーンを開いてみる。反映されている。
BgModel の下に配置して、右クリック → 複製で数を増やして、比較的広大な(?)シーンにした。
Mainシーンを開いてみる。反映されている。
◎ Bgシーンの動かし方を変えてみる。 :
Bgシーンは BgModel を動かすことで背景がスクロール(?)しているように見せかけているけれど、z軸方向に動いてるだけで面白みがないような気がしてきた。x軸方向にもずらしたり、z軸で回転させたりして、動きに色気(?)をつけてみる。
res://scripts/Bg.gd を修正。内容は以下。
_Bg.gd
res://scripts/Bg.gd を修正。内容は以下。
_Bg.gd
extends Spatial export var scroll_speed = 120 export var limit_z = 80 export var add_z = -80 export var angle_add = 20 export var x_shift_range = 80 export var rotz_range = 10 var angle = 0 func _ready(): pass # Replace with function body. func _process(delta): angle += (angle_add * delta) if angle > 360.0: angle -= 360.0 var rz = rotz_range * sin(deg2rad(sin(deg2rad(-angle)))) $BgModel.rotation.z = rz $BgModel.translation.x = x_shift_range * sin(deg2rad(angle)) $BgModel.translation.z += scroll_speed * delta if $BgModel.translation.z >= limit_z: $BgModel.translation.z += add_z
◎ 敵が弾を撃つ処理も修正。 :
ついでに、敵が弾を撃つ際の処理も若干修正。res://scripts/EnemyZako.gd を修正。
_EnemyZako.gd
_EnemyZako.gd
# ... func _on_ShotTimer_timeout(): var angle_add = 12 var angle = 90 - angle_add * 3 var spd = 0.2 for i in range(7): _shot(translation, angle, spd) if hp <= hpmax * 0.7: _shot(translation, angle, spd * 0.8) if hp <= hpmax * 0.3: _shot(translation, angle, spd * 1.2) _shot(translation, angle, spd * 1.1) _shot(translation, angle, spd * 0.9) angle += angle_add # ...
- 敵のHPに応じて、発射する弾の数を変えている。
◎ 動作確認。 :
Mainシーンを開いてF6キーを押して動作確認。
それらしい画面になってきた。
次回はサウンドを追加してみる。
それらしい画面になってきた。
次回はサウンドを追加してみる。
[ ツッコむ ]
#3 [godot] Godot Engineでサウンドを追加
Godot Engine 3.2.3 x64 を使って3D表示の簡単なシューティングゲームっぽいものを作る。
今回はサウンドを追加してみる。
利用するサウンドファイルは以下。自作しました。CC0 / Public Domain ってことで。
_simpleshootemup_sounds.zip
解凍すると以下のファイルが入っている。
今回はサウンドを追加してみる。
利用するサウンドファイルは以下。自作しました。CC0 / Public Domain ってことで。
_simpleshootemup_sounds.zip
解凍すると以下のファイルが入っている。
- bgm.ogg ... BGMファイル
- enemy_damage_se.wav ... 敵がダメージを受けた時のSE
- enemy_shot_se.wav ... 敵が弾を撃った時のSE
- player_damage_se.wav ... プレイヤーがダメージを受けた時のSE
◎ プロジェクトフォルダにインポート。 :
.wav や .ogg をGodot Engineのプロジェクトフォルダ\imports\ にコピー。自動でインポートされる。
インポート設定を確認。bgm.ogg を選択して、インポートタブをクリック。BGMはループ再生してほしいので、Loop にチェックが入ってることを確認する。もしチェックが入ってなかったらチェックを入れて「再インポート」をクリック。
SEとして使う各wavについても確認。1回鳴らしたら再生終了してほしいので、Loopにチェックが入ってないことを確認する。
インポート設定を確認。bgm.ogg を選択して、インポートタブをクリック。BGMはループ再生してほしいので、Loop にチェックが入ってることを確認する。もしチェックが入ってなかったらチェックを入れて「再インポート」をクリック。
SEとして使う各wavについても確認。1回鳴らしたら再生終了してほしいので、Loopにチェックが入ってないことを確認する。
◎ BGMを追加。 :
BGMを追加する。Mainシーンを開いて、AudioStreamPlayerノードを追加する。
Bgm にリネーム。
Bgm を選択して、Stream に bgm.ogg を設定する。
スクリプトに、BGM再生開始を記述。res://scripts/Main.gd を開いて、初期化処理 _ready() の中に、$Bgm.play() を追記する。
ついでに一応、ゲームオーバー (die_player()) とステージクリア (die_enemy()) の中で、$Bgm.stop() を呼んでBGMを停止しておく。すぐにシーンが切り替わってBGMが消えるのでこの処理はしなくてもいいのかもしれないけれど、一応念のため。
Bgm にリネーム。
Bgm を選択して、Stream に bgm.ogg を設定する。
- ファイル一覧ウインドウから bgm.ogg をドラッグアンドドロップ。
- あるいは、Stream の横の「空」をクリックして「読込み」→ bgm.ogg を選択。
スクリプトに、BGM再生開始を記述。res://scripts/Main.gd を開いて、初期化処理 _ready() の中に、$Bgm.play() を追記する。
ついでに一応、ゲームオーバー (die_player()) とステージクリア (die_enemy()) の中で、$Bgm.stop() を呼んでBGMを停止しておく。すぐにシーンが切り替わってBGMが消えるのでこの処理はしなくてもいいのかもしれないけれど、一応念のため。
◎ プレイヤーのダメージSEを追加。 :
プレイヤーがダメージを受けた時にダメージSEを鳴らしたい。
プレイヤーのシーン、res://assets/Player.tscn を開いて、AudioStreamPlayerノードを追加。DamageSe にリネーム。
DamageSe を選択して、Stream に player_damage_se.wav を指定。
スクリプト、Player.gd を修正。SEの再生開始を指定する。ダメージ処理の開始部分に ―― emit_siginal("player_damaged") を呼んでる行の前後のあたりに、$DamageSe.play() を追記する。
これで、プレイヤーがダメージを受けたタイミングでダメージSEが鳴るようになった。
プレイヤーのシーン、res://assets/Player.tscn を開いて、AudioStreamPlayerノードを追加。DamageSe にリネーム。
DamageSe を選択して、Stream に player_damage_se.wav を指定。
スクリプト、Player.gd を修正。SEの再生開始を指定する。ダメージ処理の開始部分に ―― emit_siginal("player_damaged") を呼んでる行の前後のあたりに、$DamageSe.play() を追記する。
これで、プレイヤーがダメージを受けたタイミングでダメージSEが鳴るようになった。
◎ 敵のSEを追加。 :
敵にもSEを追加していく。ダメージを受けた時にダメージSEを鳴らして、弾を撃った時に発射SEを鳴らしたい。
EnemyZako.tscn を開いて、AudioStreamPlayerノードを2つ追加。DamageSe と ShotSe にリネーム。
Streamプロパティに wav ファイルを指定。
スクリプト内で各SEの再生を指定する。EnemyZako.gd を編集。
ダメージを受けるタイミングで ―― emit_siginal("enemy_damaged")を呼んでる行の前後で、$DamageSe.play() を呼ぶ。
弾を撃つタイミングで ―― _on_ShotTimer_timeout() の中で、$ShotSe.play() を呼ぶ。
これで、敵がダメージを受けた時と弾を撃った時にSEが鳴るようになった。
EnemyZako.tscn を開いて、AudioStreamPlayerノードを2つ追加。DamageSe と ShotSe にリネーム。
Streamプロパティに wav ファイルを指定。
- DamageSe の Stream に enemy_damage_se.wav を指定。
- ShotSe の Stream に enemy_shot_se.wav を指定。
スクリプト内で各SEの再生を指定する。EnemyZako.gd を編集。
ダメージを受けるタイミングで ―― emit_siginal("enemy_damaged")を呼んでる行の前後で、$DamageSe.play() を呼ぶ。
弾を撃つタイミングで ―― _on_ShotTimer_timeout() の中で、$ShotSe.play() を呼ぶ。
これで、敵がダメージを受けた時と弾を撃った時にSEが鳴るようになった。
◎ 動作確認。 :
動作確認をしてみる。Mainシーンを開いてF6キーを押す。
ちゃんと音が鳴ってくれた。
次回はプロジェクトをエクスポートして、Windows上で動くexeファイルや、Webブラウザ上で動くHTML5版を出力してみる。
ちゃんと音が鳴ってくれた。
次回はプロジェクトをエクスポートして、Windows上で動くexeファイルや、Webブラウザ上で動くHTML5版を出力してみる。
[ ツッコむ ]
#4 [windows] 「今すぐ会議を開始する」って何だろう
Windows10 x64 2004 を使っていたら、タスクトレイに「今すぐ会議を開始する」というアイコンが表示されていることに気付いた。なんじゃこりゃ。
ググってみたら、Skype がそういう表示を出しているという話を見かけた。なるほど。鬱陶しいな…。Skype をアンインストールすれば消えるのだろうか。でも自分の環境には Skype がインストールされてないっぽいのだけど…。
右クリックして「非表示」を選べば表示を無効化できるらしい。
_今すぐ会議を開始するを非表示にする方法 | とは
とりあえず非表示にしておいた。でも Microsoft のことだから、どうせまた何かの拍子にこのアイコンが出てくる状態に戻ったりするのだろうなあ…。実に鬱陶しい…。
ググってみたら、Skype がそういう表示を出しているという話を見かけた。なるほど。鬱陶しいな…。Skype をアンインストールすれば消えるのだろうか。でも自分の環境には Skype がインストールされてないっぽいのだけど…。
右クリックして「非表示」を選べば表示を無効化できるらしい。
_今すぐ会議を開始するを非表示にする方法 | とは
とりあえず非表示にしておいた。でも Microsoft のことだから、どうせまた何かの拍子にこのアイコンが出てくる状態に戻ったりするのだろうなあ…。実に鬱陶しい…。
[ ツッコむ ]
以上、1 日分です。