mieki256's diary



2020/11/18(水) [n年前の日記]

#1 [godot] Godot Engineで3Dモデルデータをインポート

Godot Engine 3.2.3 x64 を使って3D表示の簡単なシューティングゲームっぽいものを作る。

今回は、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)を選択。

3d_tuto15_import_3dmodel_ss01.jpg


フォーマットは「glTFバイナリ (.glb)」にした。その他の設定はスクリーンショットを参考に。airplane_type_b.glb としてエクスポート。

3d_tuto15_import_3dmodel_ss02.png

Godot Engineにインポート。 :

blenderからエクスポートした .glb を、Godot Engine のエディタ画面にドラッグアンドドロップしてインポートする。

3d_tuto15_import_3dmodel_ss03.jpg


res://imports/ の下に移動した。

3d_tuto15_import_3dmodel_ss04.png

Godot Engine で開く。 :

インポートした .glb を右クリックして「シーンを開く」を選択。

3d_tuto15_import_3dmodel_ss05.png


確認ウインドウが開く。とりあえず「新規の継承」を選択。

3d_tuto15_import_3dmodel_ss06.png


Godot Engine のエディタ画面内にモデルデータが表示された。

3d_tuto15_import_3dmodel_ss07.jpg


Godot Engine のシーンとして保存しておく。res://assets/ の下に、airplane_type_b.tscn として保存した。

3d_tuto15_import_3dmodel_ss08.png

プレイヤーのモデルデータを差し替える。 :

今まで仮で表示していたプレイヤーキャラのモデルデータを差し替える。

プレイヤーのシーン、Player.tscn を開いて、新規インスタンスを読み込むボタンをクリック。airplane_type_b.tscn を開く。

3d_tuto15_import_3dmodel_ss09.png


Player の下に airplane_type_b ノードとして追加された。

3d_tuto15_import_3dmodel_ss10.jpg


PlayerModel の下にドラッグして移動して、向きや大きさを変更する。

3d_tuto15_import_3dmodel_ss11.jpg


今まで表示していた仮モデルは、目のアイコンをクリックして非表示にする。仮モデルを今後一切使わない予定なら、右クリックして「削除」してしまってもいい。

3d_tuto15_import_3dmodel_ss12.jpg


アタリ範囲を修正。CollisionShape を選択して大きさや位置を修正する。

3d_tuto15_import_3dmodel_ss13.png


シーンを保存して動作確認。Mainシーンを開いてF6キーを押す。

3d_tuto15_import_3dmodel_ss14.png

これで、プレイヤーキャラのモデルデータを、今回インポートしたモデルデータで差し替えることができた。

敵のモデルデータを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

  • 上記ページ内の、「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) を選択。

3d_tuto15_import_3dmodel_ss15.jpg


保存先フォルダは、Godot Engine のプロジェクトフォルダ\imports\ を指定しておく。その他の設定はスクリーンショットを参考に。enemy_type_b_fix.escn というファイル名で保存した。

3d_tuto15_import_3dmodel_ss16.jpg

Godot Engineで敵のモデルデータを開く。 :

Godot Engine で敵のモデルデータを開く。enemy_type_b_fix.escn をダブルクリック。

3d_tuto15_import_3dmodel_ss17.png


Godot Engine のエディタ画面内に、敵のモデルデータが表示された。

3d_tuto15_import_3dmodel_ss18.png


Godot Engine のシーンファイルとして保存しておく。res://assets/ の下に enemy_type_b_fix.tscn として保存した。

3d_tuto15_import_3dmodel_ss19.png

アニメーション設定を修正。 :

この敵のモデルデータはアニメーションデータを持っているけど、発生と同時にアニメーションを再生したり、アニメーションをループさせたりしたい。そのために少しだけ設定をし直す。

設定を変更するために、継承をクリアしておく。enemy_type_b_fix を右クリックして「継承をクリア」。

3d_tuto15_import_3dmodel_ss20.png


アニメーションを管理しているノード、AnimationPlayer を選択して、自動再生とループ再生のアイコンをクリックして有効にしておく。

3d_tuto15_import_3dmodel_ss21.png


この状態で、enemy_type_b_fix.tscn を一旦保存。

敵のモデルデータを差し替える。 :

敵のモデルデータを差し替える。res://assets/EnemyZako.tscn を開く。インスタンス追加アイコンをクリック。enemy_type_b_fix.tscn を開く。

3d_tuto15_import_3dmodel_ss22.png


enemy_type_b_fix.tscn が表示された。

3d_tuto15_import_3dmodel_ss23.png


  • enemy_type_b_fix の位置、大きさ、向きを調整。
  • enemy_type_b_fixノードを EnemyZakoModel の下に配置。
  • 今まで表示していた仮モデルは非表示にする。
  • CollisionShape を選択してアタリ範囲を修正。

3d_tuto15_import_3dmodel_ss24.png


Mainシーンを開いて、F6キーを押して動作確認。

3d_tuto15_import_3dmodel_ss25.png

これで、敵のモデルデータも差し替えることができた。

位置や大きさについては、なんとなくイイ感じの見た目になるように、その都度修正のこと。

次回は、背景についてもモデルデータを差し替えたい。

#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 というファイル名でシーンとして保存。

3d_tuto16_import_bgmodel_ss01.jpg

Bgシーンに読み込んでみる。 :

Bgシーン、res://assets/Bg.tscn を開いて、インスタンスを追加。bg_type_c.tscn を開く。今まで使っていた仮モデルは非表示にするか削除する。

BgModel の下に配置して、右クリック → 複製で数を増やして、比較的広大な(?)シーンにした。

3d_tuto16_import_bgmodel_ss02.jpg


Mainシーンを開いてみる。反映されている。

3d_tuto16_import_bgmodel_ss03.jpg

Bgシーンの動かし方を変えてみる。 :

Bgシーンは BgModel を動かすことで背景がスクロール(?)しているように見せかけているけれど、z軸方向に動いてるだけで面白みがないような気がしてきた。x軸方向にもずらしたり、z軸で回転させたりして、動きに色気(?)をつけてみる。

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
# ...
            
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

解凍すると以下のファイルが入っている。

プロジェクトフォルダにインポート。 :

.wav や .ogg をGodot Engineのプロジェクトフォルダ\imports\ にコピー。自動でインポートされる。

3d_tuto17_add_sounds_ss01.png


インポート設定を確認。bgm.ogg を選択して、インポートタブをクリック。BGMはループ再生してほしいので、Loop にチェックが入ってることを確認する。もしチェックが入ってなかったらチェックを入れて「再インポート」をクリック。

3d_tuto17_add_sounds_ss02.png


SEとして使う各wavについても確認。1回鳴らしたら再生終了してほしいので、Loopにチェックが入ってないことを確認する。

3d_tuto17_add_sounds_ss03.png

BGMを追加。 :

BGMを追加する。Mainシーンを開いて、AudioStreamPlayerノードを追加する。

3d_tuto17_add_sounds_ss04.png


Bgm にリネーム。

3d_tuto17_add_sounds_ss05.png


Bgm を選択して、Stream に bgm.ogg を設定する。
  • ファイル一覧ウインドウから bgm.ogg をドラッグアンドドロップ。
  • あるいは、Stream の横の「空」をクリックして「読込み」→ bgm.ogg を選択。

3d_tuto17_add_sounds_ss06.png


スクリプトに、BGM再生開始を記述。res://scripts/Main.gd を開いて、初期化処理 _ready() の中に、$Bgm.play() を追記する。

3d_tuto17_add_sounds_ss07.png


ついでに一応、ゲームオーバー (die_player()) とステージクリア (die_enemy()) の中で、$Bgm.stop() を呼んでBGMを停止しておく。すぐにシーンが切り替わってBGMが消えるのでこの処理はしなくてもいいのかもしれないけれど、一応念のため。

3d_tuto17_add_sounds_ss08.png

プレイヤーのダメージSEを追加。 :

プレイヤーがダメージを受けた時にダメージSEを鳴らしたい。

プレイヤーのシーン、res://assets/Player.tscn を開いて、AudioStreamPlayerノードを追加。DamageSe にリネーム。

3d_tuto17_add_sounds_ss09.png


DamageSe を選択して、Stream に player_damage_se.wav を指定。

3d_tuto17_add_sounds_ss10.png


スクリプト、Player.gd を修正。SEの再生開始を指定する。ダメージ処理の開始部分に ―― emit_siginal("player_damaged") を呼んでる行の前後のあたりに、$DamageSe.play() を追記する。

3d_tuto17_add_sounds_ss11.png

これで、プレイヤーがダメージを受けたタイミングでダメージSEが鳴るようになった。

敵のSEを追加。 :

敵にもSEを追加していく。ダメージを受けた時にダメージSEを鳴らして、弾を撃った時に発射SEを鳴らしたい。

EnemyZako.tscn を開いて、AudioStreamPlayerノードを2つ追加。DamageSe と ShotSe にリネーム。

3d_tuto17_add_sounds_ss12.png


Streamプロパティに wav ファイルを指定。
  • DamageSe の Stream に enemy_damage_se.wav を指定。
  • ShotSe の Stream に enemy_shot_se.wav を指定。

スクリプト内で各SEの再生を指定する。EnemyZako.gd を編集。

ダメージを受けるタイミングで ―― emit_siginal("enemy_damaged")を呼んでる行の前後で、$DamageSe.play() を呼ぶ。

3d_tuto17_add_sounds_ss14.png


弾を撃つタイミングで ―― _on_ShotTimer_timeout() の中で、$ShotSe.play() を呼ぶ。

3d_tuto17_add_sounds_ss13.png


これで、敵がダメージを受けた時と弾を撃った時にSEが鳴るようになった。

動作確認。 :

動作確認をしてみる。Mainシーンを開いてF6キーを押す。



ちゃんと音が鳴ってくれた。

次回はプロジェクトをエクスポートして、Windows上で動くexeファイルや、Webブラウザ上で動くHTML5版を出力してみる。

#4 [windows] 「今すぐ会議を開始する」って何だろう

Windows10 x64 2004 を使っていたら、タスクトレイに「今すぐ会議を開始する」というアイコンが表示されていることに気付いた。なんじゃこりゃ。

ググってみたら、Skype がそういう表示を出しているという話を見かけた。なるほど。鬱陶しいな…。Skype をアンインストールすれば消えるのだろうか。でも自分の環境には Skype がインストールされてないっぽいのだけど…。

右クリックして「非表示」を選べば表示を無効化できるらしい。

_今すぐ会議を開始するを非表示にする方法 | とは

とりあえず非表示にしておいた。でも Microsoft のことだから、どうせまた何かの拍子にこのアイコンが出てくる状態に戻ったりするのだろうなあ…。実に鬱陶しい…。

以上、1 日分です。

過去ログ表示

Prev - 2020/11 -
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project