【Godot 4 】ホラーゲームを作ろう!Part 2

2024/08/20
おはこんばんにちは!ギルガメです!

ついに!ついにGodot Engine 4.3が正式にリリースされましたね!結構いろんな機能も充実しています、その中でFBXのインポートもそのままできるようになったとか、これはありがたい!

このパート2では下記を追加していきます!
  • プレイヤーのダッシュ
  • ライト(スイッチで切り替え実装)
  • Blenderで作ったマップの設置



動画で見たい方はこちらです!

早速プレイヤーのダッシュを実装をしていきましょう!
FPSのゲームではダッシュはSHIFTキーで走るゲームが多いので同じように設定していきます。今回は無限に走れます、スタミナ要素もあるといいですがもっと後で実装したいと思います!
では下記の画像のようにアクション名を登録してSHIFTキーに設定します。



アクション名の登録が終わりましたら、プレイヤーのスクリプトを触っていきます!

  • 歩く速度は、SPEED変数を@exportvarに変更します
  • 走る速度は、DASH_SPEED変数を追加して同じように@exportvarにします
  • アクションキーでの速度の管理は、MOVE_SPEED変数を追加して@onreadyvarにします

コードは下記のようになります!
extends CharacterBody3D


@export var SPEED = 5.0 #歩く速度
@export var DASH_SPEED = 10.0 #走る速度

const JUMP_VELOCITY = 4.5

@onready var MOVE_SPEED = SPEED #速度管理、デフォルトで歩く速度を設定

var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


func _physics_process(delta):
# Add the gravity.
if not is_on_floor():
velocity.y -= gravity * delta

# Handle jump.
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = JUMP_VELOCITY

# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var input_dir = Input.get_vector("left", "right", "up", "down")
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * MOVE_SPEED #SPEEDからMOVE_SPEEDに変更
velocity.z = direction.z * MOVE_SPEED #SPEEDからMOVE_SPEEDに変更

# --------------- 追加 ---------------
if Input.is_action_just_pressed("dash"): #SHIFTキーを押した時にMOVE_SPEEDを走る速度にする
MOVE_SPEED = DASH_SPEED
if Input.is_action_just_released("dash"): #SHIFTキーを離した時にMOVE_SPEEDを歩く速度にする
MOVE_SPEED = SPEED # -----------------------------------

else:
velocity.x = move_toward(velocity.x, 0, MOVE_SPEED) #SPEEDからMOVE_SPEEDに変更
velocity.z = move_toward(velocity.z, 0, MOVE_SPEED) #SPEEDからMOVE_SPEEDに変更

move_and_slide()

プレイヤーが走れるようにする実装は以上です。思ったより簡単に実装できました!
歩く速度と走る速度は@exportに設定したので、ちょっと速度を調整したい時は毎回スクリプトで変更する必要がなく、「Inspector」に値を変更できるようになっています。これも使いやすくなるのでぜひ活用してください!


次はライトの実装です!

ダッシュと同じようにライトをスイッチのアクション名を「flashlight」で登録してFキーに設定します。

プレイヤーシーンのHeadSpotLight3Dを追加します
  • InspectorSpot内にあるRange15に変更します、これは明かりを照らす距離になります
  • また同じInspectorSpot内にあるAngle30に変更します、これは明かりを照らす範囲になります
下記のようになっていれば大丈夫です!



次にライトをつけたり消したりするスクリプトを作ります!
SpotLight3Dにスクリプトを追加して、下記のコードにします。
extends SpotLight3D

func _process(delta): if Input.is_action_just_pressed("flashlight"): visible = !visible

これでFキーを押してライトをつけたり消したりできるようになりました!
テストするときはフィールドが明るいので暗くする必要があります。





これでライトがついている時はてきにバレたりとかいろんな実装ができそうですね!

せっかくここまでできたけど、テスト用のマップだと殺風景ですね..
Blenderで作ったマップがあるので、それを設置して探索できるようにしたいです。
作ったマップをGLBでエクスポートしています。

簡単に作ったマップは下記からダウンロードしてください!
フィールド: https://shorturl.at/TRwyI

こちらをassets → fieldのフォルダーを作って先ほどダウンロードしたファイルをドラッグ&ドロップします。
ドロップしたhorror.glbファイルをダブルクリックすると下記のウィンドウが開きます。



次に左側にFloorとある赤い四角のアイコンをクリックして右の設定の「Physics」をチェックして、「Shape type」を「Simple Convex」にします。
こうすることで物理判定ができ、プレイヤーがすり抜けれなくなります。シンプルな形をしたオブジェクトは「Simple Convex」でいいですが、L字型の壁などは「Trimesh」にします。
マップの構成は下記のようになります
  • Floorは床、「Shape type」を「Simple Convex」です
  • Ceilingは天井、「Shape type」を「Simple Convex」です
  • Wallは外側の壁、「Shape type」を「Simple Convex」です
  • Blockは柱、「Shape type」を「Simple Convex」です
  • Roomは色んな形をした壁、「Shape type」を「Trimesh」です

たくさんオブジェクトがあるので大変ですが、全部終わりましたら「reimport」をクリックして反映さえます。
すると全てに物理判定ができました!

上記が完了したら、horror.glbファイルをメインシーンにドラッグ&ドロップします。位置がズレることがあるので、transformpositionを(x, y, xの値をにする)リセットします。
プレイヤーを好きな位置に設定して、ついにフィールドを探索できるようになりました!



パート2はここまでです!お疲れ様でした!
パート3は物を配置したり、拾ったりできるようにしたいです!

引き続きギルガメを応援してください!よろしくお願いいたします!

↓ギルガメのプロフィール↓ ギルガメ公式サイト: https://www.yosapps.com ギルガメ公式X: https://x.com/yosapps ギルガメゲーム: https://www.yosapps.com/games ギルガメモバイルゲーム: https://play.google.com/store/apps/dev?id=8077712662120291705

ギルガメのファンイラストをいただけるとすごく喜びます!
© Copyright 2024 YOSAPPS. Powered with by YOSAPPS