Godotでホラーゲーム開発チュートリアル Part 2: ダッシュを実装する


Godot Engine バージョン4.3

このパートでは、ホラーゲームにダッシュ機能を追加します。プレイヤーはShiftキーを押すことで走ることができ、走っている間にスタミナゲージが減少します。スタミナがなくなると走れなくなりますが、時間とともにスタミナが回復します。




こちらから試しにプレイしてください!



必要なノード

以下のノード構成を作成してください:
Player (CharacterBody3D)
PlayerUI (Control)
StaminaBar (ProgressBar)


  • StaminaBarShow Percentageを非表示にして、Stepにします。また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")


このパートでは、ダッシュとスタミナの基本的な仕組みを実装しました!

次はアイテムを拾うチュートリアルを作成します!
最終更新日: 2025/01/22 08:43

コメント