Godotで体力とダメージシステムを実装する方法

体力とダメージシステムを使用すると、プレイヤーは障害物や敵に遭遇したときにダメージを受けて体力を失うことができます。また、パワーアップや回復パックなど、さまざまな手段で体力を回復することもできます。

オープンソースのゲームエンジンとして人気の高いGodotは、このようなシステムを実装するためのシンプルで柔軟な方法を提供しています。プレイヤーキャラクター、敵、プレイヤーの体力を視覚的に表す体力バーを備えた2Dゲームを簡単に作成できます。

Godotゲームの設定

まず、Godotゲームエンジンで基本的なプロジェクト構造を設定し、必要なノードを作成します。

この記事で使用されているコードは、このGitHubリポジトリで入手でき、MITライセンスに基づいて自由に使用できます。

プレイヤーキャラクターの新しいシーンを作成します。KinematicBody2Dノードを追加し、その中にプレイヤーの当たり判定を表す長方形の形状を持つCollisionShape2Dを追加します。プレイヤーのキャラクターを表示するために、KinematicBody2DSpriteノードをアタッチします。

# Player.gd
extends KinematicBody2D
const SPEED = 200
var velocity = Vector2.ZERO
var health = 100
func _physics_process(delta):
velocity.x = 0
velocity.y = 0
if Input.is_action_pressed("ui_right"):
velocity.x += SPEED
elif Input.is_action_pressed("ui_left"):
velocity.x -= SPEED
if Input.is_action_pressed("ui_down"):
velocity.y += SPEED
elif Input.is_action_pressed("ui_up"):
velocity.y -= SPEED
move_and_collide(velocity * delta)

これで、Godotプロジェクトに基本的なプレイヤーキャラクターが作成されました。矢印キーを使用してプレイヤーを移動できますが、まだ体力システムはありません。

体力バーのUI要素のデザイン

次に、プレイヤーの体力を視覚的に表すUI要素を追加します。Godotには、この目的に適したTextureProgressという組み込みコントロールが用意されています。

HUD(ヘッドアップディスプレイ)の新しいノードを作成します。CanvasLayerノードを追加し、その中にTextureProgressノードを追加します。ゲームのスタイルとテーマに合わせて、TextureProgressノードの外観をカスタマイズします。

HUDでTextureProgressを使用して体力バーを表示するには、テクスチャを割り当てる必要があります。TextureProgressは2つのテクスチャを使用します。1つは背景用、もう1つは塗りつぶされた部分(進行状況)用です。

インスペクターパネルで、Textureセクションを探します。Textureの下には、UnderOverというプロパティがあります。各プロパティのLoadボタンをクリックして、対応する画像を選択します。

プレイヤーの体力を基に体力バーを更新するために、HUDシーンにスクリプトをアタッチします。

# HUD.gd
extends CanvasLayer
onready var healthBar := $TextureProgress
func _ready():
update_health_bar()
func update_health_bar():
var hb = get_parent().get_node("KinematicBody2D")
healthBar.value = hb.health

プレイヤーの体力の処理

プレイヤーが画面の境界を越えたときに体力を減少させるには、if文を使用して条件分岐を追加します。プレイヤーが画面外に出た場合、体力を減少させることができます。方法は次のとおりです。

# player.gd
extends KinematicBody2D
const SPEED = 200
const DAMAGE_AMOUNT = 0.1
var velocity = Vector2.ZERO
var health = 100
# 画面の境界
var screen_size
var margin = 20
func _ready():
screen_size = get_viewport_rect().size
func _physics_process(delta):
# ... (既存の移動コード)
move_and_collide(velocity * delta)
var c1 = position.x < -margin
var c2 = position.x > screen_size.x + margin
var c3 = position.y < -margin
var c4 = position.y > screen_size.y + margin
# プレイヤーが画面の境界外にいるかどうかを確認
if c1 or c2 or c3 or c4:
take_damage_on_screen_exit()
func take_damage_on_screen_exit():
health -= DAMAGE_AMOUNT
if health <= 0:
health = 0
# ここでのゲームオーバーのロジック
update_health_ui()

player.gdスクリプトにupdate_health_ui()関数を追加して、HUDスクリプトを呼び出し、体力バーを更新します。

# Player.gd
extends KinematicBody2D
# ... (その他のコード)
func update_health_ui():
var hud = get_parent().get_node("HUD")
if hud:
hud.update_health_bar()

これらの変更により、プレイヤーは画面の境界を越えたときにダメージを受け、体力バーのUIがそれに応じて更新されます。

追加機能の追加

体力とダメージシステムは、さまざまな追加機能を備えて拡張し、ゲームプレイ体験を向上させることができます。アイデアには以下のようなものがあります。

体力の回復

プレイヤーが取得すると体力を回復できる体力の回復を実装します。体力の回復は、ゲームワールド全体に散らばっている収集可能なアイテムや、敵を倒したときの報酬にすることができます。

プレイヤーが体力の回復と相互作用すると、体力が最大値まで一定量増加します。体力の回復アイテムの新しいスクリプトを使用して、衝突と体力の回復のロジックを処理できます。

無敵パワーアップ

プレイヤーに一定時間無敵状態を付与するパワーアップを作成します。プレイヤーが無敵パワーアップを取得すると、敵やその他の危険からのダメージを受けなくなります。

タイマーを実装して無敵状態の残りの時間を追跡し、タイマーがなくなるとプレイヤーは脆弱な状態に戻ります。

さまざまな敵のタイプ

さまざまな攻撃パターン、ダメージ値、行動を持つさまざまな敵をデザインします。各敵のタイプはプレイヤーに独自の課題を提示し、倒すためにさまざまな戦略を必要とします。

たとえば、一部の敵はより速く移動したり、より多くのダメージを与えたり、プレイヤーが利用できる特定の弱点を持つ場合があります。敵の遭遇に多様性を持たせることで、ゲームプレイが魅力的で単調にならないようにします。

体力の回復

ダメージを避けたプレイヤーに報酬を与えるために、時間の経過とともに体力を回復させます。プレイヤーが一定時間ダメージを受けないと、体力が徐々に一定のしきい値まで回復します。

ただし、プレイヤーがチャレンジなしで体力が完全に回復するのを待つことができる状況を避けるために、回復速度がバランスが取れていることを確認してください。

オーディオとビジュアルのフィードバック

プレイヤーがダメージを受けたり、体力を回復したり、敵を倒したときに、説得力のあるオーディオとビジュアルのフィードバックを提供します。

著作権フリーの衝撃的な効果音、画面の揺れ、パーティクル効果、視覚的な手がかりは、プレイヤーの没入感を高め、体力とダメージシステムをより動的で魅力的に感じさせることができます。

導入する追加機能の全体的なバランスを考慮してください。ゲームプレイがゲーム全体を通してやりがいがあり、楽しく、テンポが良いことを確認するために、プレイテストを続け、フィードバックを収集します。

体力とダメージシステムでGodotゲームをより魅力的にする

Godotゲームに体力とダメージシステムを統合すると、ゲームプレイがプレイヤーにとってより魅力的になり、奥深さと課題が追加されます。プレイヤーはゲームを進めるために戦略を立てて、体力を効果的に管理する必要があるため、リスクと報酬の要素が導入されます。

さらに、体力バーの視覚的な表現により、プレイヤーは現在の状態に関する重要なフィードバックを得ることができ、没入感が高まります。