俺にもできた Godot 4.x

Godot 4 でゲームを作る試み

【Godot 4.3 Character Controller】Third Person Character Controller 作成中(1/X)

Godot は恐ろしく簡単に「Third Person Character Controller(キャラコン)」が作れますね。俺にもできたのでメモしときます。Godot 4 からでしょうか? なんだか便利な関数が増えたような気がします(単に私が知らなかっただけなのかも)。そんな便利関数を使ってGDScript でキャラコン作っていきます。

0. 最終的な[FileSystem] 周り

最終的には以下のようにフォルダを作って、ファイルをまとめてます。が、、、完全にお好みです。ちょっとづつ説明していきます。(アニメファイルが入ってないな・・・)

1. 簡単なレベル(ワールド、ステージ、マップ、何と呼んでもOK)を作る

[main scene] を作ります。Godot が最初に読み込むシーンの事です。[FileSystem] では「level」フォルダの「level_a.tscn」です。

❶ ルートノードはNode でその下に追加していくのも基本Node ノードです。フォルダ代わりです

❷ DirectionalLight3D とWorldEnvironment を入れるフォルダ

❸ キャラが実際に動き回るシーン(床、壁、坂などで出来たステージ)を入れるフォルダ

❹ 操作キャラのシーンを入れるフォルダ

こんな感じに作ります。これを「level_a.tscn」としてセーブします。私はこのようにキャラも地面も何でも含んでいるものをレベルと呼びます。地面だけのヤツをマップと呼びます。

2. DirectionalLight3D とWorldEnvironment

❶ ここをクリックしてそれぞれ入れればいいだけです

3. マップ

❶ ルートはNode3D で作って、あとはCSG で好きなように作ればいいだけです。壁やら坂道やら好きに追加していきましょう

❷ 坂道はCSGPolygon3D で作るのが楽だと思います。編集点をいじって形を変えられるから

思ったように出来たら「map_a.tscn」で保存です。

◆

ただCSG で忘れがちなのが[Use Collision]。ON にするのを忘れずに。

4. プレイヤー

今回もMixamo の「X Bot」さんにお越しいただきます。完成したら「player.tscn」で保存。

❶ ルートはCharacterBody3D

❷ それにCollisionShape3D を付ける。もちろん[Shape] は[CapsuleShape3D] で大きさはお好み調整(位置ももちろんやっといて)

❸ fbx のinstance は直付けしないでNode3D を挟みます(Godot の-z 対策です)

❹ Camera3D は直付けしないで、

❺ この「y 軸回転専用ノード(Node3D)」、y position +1.70 と、

❻ この「x 軸回転専用ノード(Node3D)」、x position +0.4 と、

❼ このSpringArm3D の後に付けます。SpringArm3D の[Shape] には半径10cm 程度の[SphereShape3D] を入れて壁透け・床透け対策をします。カメラ距離は3m くらいがちょうどいいかな。お好みで

◆

❸のfbx(T-Pose モデル)の持って来方は前回の記事を参照。

ore2mo-dekita.hatenablog.jp

それと❹のカメラですが、[FOV] を60° に[Far] を100m にしました。[FOV] は広すぎると小さく映るし魚眼レンズみたくなるし[Far] も4km 先まで見ないしで、PC に負担の無いようにしておきます。❺と❻はいわゆるカメラピボット(camera_pivot)で私は使い勝手のいいダブル・カメラピボット・システムを採用しました。❺はキャラの目の高さくらいに上げ、❻は右肩ショルダーカメラ風になるよう、右に40cm ずらします。ただし、❷の[CapsuleShape3D] 内に収まっていることが大事です。❷の半径はあんまり小さくしないで。

5. [Input Map]

[Project] > [Project Settings...] > [Input Map] は以下の通り作っておきます。スクリプトで使います。

6. [Autoload]

将来的にオプション画面から変更できるようにしたいので、マウスセンシの数値をオートロード(グローバル)にしています。登録しておいてください。これが嫌な場合は、キャラコン用のスクリプトに書けばいいです、全然それでOKなので、ご心配なく。

以下を「auto_load.gd」で保存して、

extends Node

var mouse_sens_yoko: float = -0.004
var mouse_sens_tate: float = -0.004

[Project] > [Project Settings...] > [Globals] > [Autoload] で登録してね。

◆

ちょっと前置きが長くなりましたので、本編(CharacterBody3D に付けるスクリプトの内容とアニメーション関係の話)は次回とします。