Godotでホラーゲーム開発チュートリアル Part 2: ダッシュを実装する
Godot Engine バージョン4.3
このパートでは、ホラーゲームにダッシュ機能を追加します。プレイヤーはShiftキーを押すことで走ることができ、走っている間にスタミナゲージが減少します。スタミナがなくなると走れなくなりますが、時間とともにスタミナが回復します。
必要なノード
以下のノード構成を作成してください:
Player
(CharacterBody3D)PlayerUI
(Control)StaminaBar
(ProgressBar)
StaminaBar
はShow Percentage
を非表示にして、Step
は1
にします。またValue
はデフォルトで100
に設定します。
StaminaBar
の位置を画面の下に設定します。
- キーアクションを
dash
で登録して、SHIFT
キーに設定します。
スクリプト
Player
ノードに以下のスクリプトをアタッチします。
- ダッシュの処理はコメントに追加しています。
extends CharacterBody3D
@export var joystick_touch_pad:Control # モバイルデバイスでのジョイスティック入力を管理するコントロール
# キャラクターの移動速度const SPEED = 5.0 # 通常の移動速度@export var DASH_SPEED = 10.0 # ダッシュ時の移動速度const JUMP_VELOCITY = 4.5 # ジャンプ時の上昇速度var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") # デフォルトの重力を取得
# マウス感度の設定var SENS = 0.002 # 視点移動の感度(小さいほど遅く、大きいほど速くなる)var LOOKS_SENS = 3.00 # 視点移動の追加感度(タッチ入力用)
# 移動速度の設定、デフォルトは歩く速度@onready var MOVE_SPEED = SPEED
@onready var head = $Head # プレイヤーの頭部(視点)を管理するノード
# 毎フレームの物理処理func _physics_process(delta): # タッチパッドの入力を使って視点を移動 look(-joystick_touch_pad.get_touchpad_delta()) # キャラクターが地面にいない場合、重力を適用 if not is_on_floor(): velocity.y -= gravity * delta
# ジャンプボタンが押され、地面にいる場合にジャンプを実行 if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_VELOCITY
# 入力から移動方向を取得 var input_dir if Global.is_mobile_web: # モバイル環境の場合、タッチパッドから入力を取得 input_dir = joystick_touch_pad.get_joystick() else: # PC環境の場合、キーボード入力を取得 input_dir = Input.get_vector("left", "right", "up", "down") # 入力方向を3D空間に変換し、正規化して方向を計算 var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() # ダッシュ時のスタミナ消費処理 if MOVE_SPEED == DASH_SPEED: %StaminaBar.value = %StaminaBar.value - 40 * delta # スタミナ減少 if %StaminaBar.value == 0: # スタミナがゼロになったら歩行速度に戻す MOVE_SPEED = SPEED # 非ダッシュ時のスタミナ回復処理 if MOVE_SPEED != DASH_SPEED: %StaminaBar.value = %StaminaBar.value + 30 * delta # スタミナ回復 if %StaminaBar.value == 100: # スタミナが満タンになったらバーを非表示 %StaminaBar.hide() # 移動入力がある場合の処理 if direction: velocity.x = direction.x * MOVE_SPEED velocity.z = direction.z * MOVE_SPEED # ダッシュボタンが押された場合 if Input.is_action_just_pressed("dash") && %StaminaBar.value != 0: MOVE_SPEED = DASH_SPEED # ダッシュ速度に変更 %StaminaBar.show() # スタミナバーを表示 # ダッシュボタンが離された場合 if Input.is_action_just_released("dash"): MOVE_SPEED = SPEED # 歩行速度に戻す else: # 入力がない場合、徐々に速度を減少 velocity.x = move_toward(velocity.x, 0, MOVE_SPEED) velocity.z = move_toward(velocity.z, 0, MOVE_SPEED) # キャラクターを移動 move_and_slide()
# 入力イベントの処理func _input(event): # マウスが動いた場合 if event is InputEventMouseMotion && !Global.is_mobile_web: # マウスの横方向の動きに応じてカメラを水平回転 head.get_parent().rotate_y(-event.relative.x * SENS) # マウスの縦方向の動きに応じてカメラを垂直回転 head.rotate_x(-event.relative.y * SENS) # 垂直回転角度を-90度から90度の範囲内に制限 head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(90)) # 懐中電灯の切り替え if event.is_action_pressed("flashlight"): %flashlight.visible = !%flashlight.visible # 懐中電灯の表示/非表示を切り替え
# タッチパッドの視点操作func look(look_vector): # タッチ入力を画面サイズに基づいて調整 look_vector = look_vector / get_viewport().content_scale_size.y look_vector = look_vector * LOOKS_SENS # 視点の回転を適用 rotate_y(look_vector.x) # 水平方向の回転 head.rotate_x(look_vector.y) # 垂直方向の回転 # 垂直回転角度を制限 head.rotation.x = clamp(head.rotation.x, deg_to_rad(-89), deg_to_rad(89))
# ジャンプボタンが押された場合の処理func _on_jump_pressed(): # ジャンプアクションをトリガー Input.action_press("jump") Input.action_release("jump")
このパートでは、ダッシュとスタミナの基本的な仕組みを実装しました!
次はアイテムを拾うチュートリアルを作成します!