ゲームエンジンGodot4.0で3Dスマホゲームを作りたいと思いますが、その前にお勉強しています。
2023/3/1にstable版がリリースされました。
Godot_v4.0-stable_win64.exe.zipを使用しています。
目的・方法
左右に動く縦長のバーを作って、Bullet/EnemyBulletを押して邪魔をします。
StaticBody3Dは衝突によって動かされることはなく、逆にStaticBody3Dが移動すると移動先にいるCharacterBody3Dを押すことができますので、障害物に最適です。
ベースプロジェクト
下記で作成したプロジェクトをベースに機能追加をします。
【Godot 4.0】スマホ3Dゲームを作るための勉強 その25 Bulletが増殖するエリアをつくる
https://qiita.com/FootInGlow/items/3471795db18e4480cd3d
github(Godotのプロジェクトマネージャーからインポートして利用できます)
https://github.com/footinglow/Godot4/tree/main/02_study/S25StageItemMultiplicationArea
左右に動く縦長のバーをつくります。
縦長のバーを作って、一定距離の間を左右に往復するようにします。
新規シーンをStaticBody3Dで作成します。
シーンメニューから新規シーンを実行します。
「その他ノード」ボタンを押下して、StaticBody3Dを選択します。
「MovingWall」と名称を変更します。
保存します。保存先はStageItems配下にします。
新規MeshInstance3Dを追加して新規BoxMeshを設定
MovingWallを右クリックして、子ノードを追加からMeshInstance3Dを追加します。
MeshInstance3Dを選択した状態で、インスペクターのMeshInstance3D/Meshの<空>をクリックして、新規BoxMeshを選択します。
Meshの設定された正方形のアイコンをクリックして詳細設定を開きます。
Sizeのxを0.3mにします。
またNode3D/Transform/Positionのyに0.5mを設定します。
MeshInstance3Dと同じ大きさ・位置のCollisionShape3Dを追加
MovingWallを右クリックして、子ノードを追加からMeshInstance3Dを追加します。
CollisionShape3Dを選択した状態で、インスペクタのCollisionShape3D/Shapeに新規BoxShapeを設定します。
設定されたShapeの右のBoxMesh3Dをクリックして詳細設定を開き、Sizeのxを0.3mに設定します。
またNode3D/Transform/Positionのyに0.5mを設定します。
左右に移動するスクリプトを実装します。
MovingWallを右クリックして、「スクリプトをアタッチ」を実行します。
res://StageItems/moving_wall.gdとして追加されました。
下記のように実装します。
-
パラメータの追加
パラメータを追加します。
左右に往復する移動距離と移動速度を@exportで宣言します。
extends StaticBody3D
@export var m_d_x_extents_m = 2.0 # 初期設置位置からX方向の最大移動距離
@export var m_d_speed_mps = 1.0 # 移動速度
m_d_x_extents_m が2.0の場合は初期設置位置からx軸方向(左右)に2mの範囲で往復するという意味にします。
パラメータm_d_speed_mpsが1.0の場合、1秒間に1m移動するという意味です。
-
メンバ変数の追加
初期設置位置を記憶するためm_v3_init_posを用意します。
また現在の移動方向を示すm_d_directionを用意します。+1もしくは-1を設定します。
var m_v3_init_pos
var m_d_direction = 1
-
初期化処理
初期化処理の_ready()メソッドの中で現在の位置を初期位置として保存します。
func _ready():
m_v3_init_pos = transform.origin
-
_physics_process
「m_d_speed_mps * m_d_direction」で移動方向への速度に変換しています。+1で右に、-1で左に移動します。deltaを掛け算して移動量に変換します。deltaが0.1秒の場合、1m/s×0.1秒=10cm移動します。
func _physics_process(delta):
transform.origin.x += m_d_speed_mps * m_d_direction * delta
absf(transform.origin.x - m_v3_init_pos.x)で初期位置のxから現在位置のxまでの移動量を計算してm_d_extentsを超えた場合、m_d_directionの符号を反転することで移動方向を逆にします。
if absf(transform.origin.x - m_v3_init_pos.x) >= m_d_x_extents_m:
m_d_direction = -m_d_direction
res://StageItems/moving_wall.gd全体としては下記のようなスクリプトになります。
extends StaticBody3D
@export var m_d_x_extents_m = 2.0 # 初期設置位置からX方向の最大移動距離
@export var m_d_speed_mps = 1.0 # 移動速度
var m_v3_init_pos
var m_d_direction = 1
func _ready():
m_v3_init_pos = transform.origin
func _physics_process(delta):
transform.origin.x += m_d_speed_mps * m_d_direction * delta
if absf(transform.origin.x - m_v3_init_pos.x) >= m_d_x_extents_m:
m_d_direction = -m_d_direction
MovingWallをステージに配置する
res://Stages/stage001.tscnを開きます。
Stageを右クリックして、Instantiate Child Sceneを実行します。
「StageItems/moving_wall.tscn」を選択します。
「MovingWall」が追加されました。
MovingWallを選択した状態で、インスペクタのNode3D/Transform/Positionのzに-4を設定します。
少しZ方向に長くしたいですね。Scaleで調整してみます。
MovingWallを選択した状態で、インスペクタのNode3D/Transform/Scaleの右の鎖をクリックしてはずしてのzに3を設定します。(鎖がつながったままの場合、zを3にすると、xとyも3になります)
以上