ゲームエンジンGodot4.0で3Dスマホゲームを作りたいと思いますが、その前にお勉強しています。
2023/4/4リリースのGodot_v4.0.2-stable_win64を使用しています。
目的
スマホゲームの入力としてジャイロセンサーを使ってみます。
3D空間に物体を浮かせて、Androidスマホの傾きをジャイロスコープで検出して立方体を回転します。
Godot4.0でジャイロセンサーを読みだす方法
Inputクラスにget_gyroscope()APIがあるので簡単に取得できます。
「スマホデバイス」のX,Y,Z座標系の軸毎の回転速度をrad/sの単位で取得します。
スマホを見て、左右がX軸、上下がY軸で奥行方向がZ軸のようです。
Vector3 get_gyroscope ( ) const
https://docs.godotengine.org/en/latest/classes/class_input.html#class-input-method-get-gyroscope
AndroidもしくはiOS上で実行する必要があります。本記事ではAndroidで実行確認をしました。
新規シーンを作成する
ジャイロスコープのテストをするためにシーンを作成します。カメラとライトと立方体が1個あるシーンです。
ノード名:ノードクラス名 | インスペクタ変更値 |
---|---|
World : Node3D | |
┝━Camera3D | Position : (0m, 5m, 0m) Rotation : (-90°, 0°, 0°) |
┝━DirectionalLight3D | Position : (-10m, 0m, 0m) Rotation : (-10°, 45°, 0°) shadow:オン |
┗━MeshInstance3D | 新規BoxMesh3D |
スクリプトの実装
シーン内のWorldを右クリックしてスクリプトにアタッチを実行します。
world.gdという名前で作成します。
下記のように修正します。
extends Node3D
func _physics_process(delta):
var v3_gyro_rad = Input.get_gyroscope()
$MeshInstance3D.rotate_y( -v3_gyro_rad.z * delta)
$MeshInstance3D.rotate_z( v3_gyro_rad.y * delta)
$MeshInstance3D.rotate_x( -v3_gyro_rad.x * delta)
スマホの座標系とGodotエンジンの座標系の違いで、ZとY軸を入れ替えて設定します。
符号も変換していますが、正直、実際の値を見て上記の実装をしました。
Input.get_gyroscope()で取得する値はrad/sなので、deltaを掛け算した値をrotate_x/y/zメソッドに渡しています。
Androidのセンサー座標系
https://developer.android.com/guide/topics/sensors/sensors_overview?hl=ja#sensors-coords
一旦Windowsで実行します。
一度Windows版で実行できるか確認します。
実行して中央に正方形が表示されればOKです。
Androidアプリとしてエクスポートします。
下記の記事を参考にしていただければ幸いです。
Androidスマホで実行します。
背景が映り込まないように、真っ暗な室内でスマホの実行画面を撮影しました。
起動直後。
スマホを左に傾けたとき。
立方体を回転しているので光の当たり方がかわるため、写真では起動直後に見えていた面がどこに移動したかわかりにくいですね。ライトも一緒に回転したほうよかったと思います。
スマホを右に傾けたとき。
スマホを奥に傾けたとき。
スマホを手前に傾けたとき。
github
以上