ロブロックススタジオで体力(HP)を設定・変更する方法【完全ガイド】
コラム自分のRobloxゲームに体力(HP)の仕組みを入れたいのに、どのプロパティを触ればいいのか、どこにスクリプトを置けばいいのか分からず手が止まっていませんか。
調べてみると、体力の最大値変更だけを扱った記事、ダメージの与え方だけを扱った記事、HPバーの表示だけを扱った記事がバラバラに存在していて、必要な情報を集めるだけで時間がかかった人も多いはずです。
この記事では、Roblox Studioの体力システムの基本から、最大値の変更やダメージ実装、回復速度の調整、HPバー表示までを1本で完結できるように解説します。連続ダメージでキャラクターが一瞬で倒れてしまう不具合の防ぎ方など、実際につまずきやすいポイントも合わせて紹介します。
Roblox公式のCreator Hub(create.roblox.com/docs)が公開しているHumanoidクラスのリファレンスをもとにしているので、手順どおりに進めれば初めてでも実装できます。
目次
体力(Health)の基本概念
Roblox Studioで体力を扱うときの土台になるのが、キャラクターに標準で入っている「Humanoid」というオブジェクトです。ここを理解しておくと、このあとのスクリプトの意味がつかみやすくなります。
Humanoidオブジェクトとは
Humanoidは、キャラクターの移動・ジャンプ・体力といった基本的な状態をまとめて管理するオブジェクトです。Explorerでキャラクターモデル(Player.Character)を開くと、Humanoidという名前で必ず入っています。
体力に関係する主なプロパティは次の2つです。
- Health:現在の体力値
- MaxHealth:体力の上限値
この2つのプロパティを操作することが、体力システム実装の基本になります。
HealthとMaxHealthプロパティの違い
HealthとMaxHealthは名前が似ていますが、役割はまったく別です。
- Health:今そのキャラクターがどれだけ体力を持っているか。0になると死亡する
- MaxHealth:Healthが取れる上限の値。デフォルトは100
たとえば「体力を200にしたい」という場合、MaxHealthを200に変更したうえで、Healthも200に合わせる必要があります。MaxHealthだけを変更してもHealthは自動では増えないため、次の章で紹介するスクリプトの中で両方を扱います。
体力の初期値・最大値を変更する
デフォルトのMaxHealthは100ですが、ボス戦のあるゲームや育成要素のあるゲームでは、この上限値を変更したい場面が多くあります。
MaxHealthを変更するスクリプト
キャラクターが出現するたびに体力を変更したい場合は、StarterCharacterScriptsにScriptを配置します。このフォルダに置いたスクリプトは、プレイヤーがリスポーンするたびに自動でキャラクターへコピーされます。
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
humanoid.MaxHealth = 200
humanoid.Health = humanoid.MaxHealth
humanoid.Health = humanoid.MaxHealthを最後に入れているのは、MaxHealthを変更しただけではHealthが自動で追従しないためです。この1行を忘れると、上限は200なのに実際の体力は100からスタートしてしまいます。
体力を全回復させる方法
チェックポイント通過時やアイテム取得時など、任意のタイミングで体力を全回復させたい場合は、次の1行を該当箇所に呼び出すだけで済みます。
humanoid.Health = humanoid.MaxHealth
回復処理はこの1行だけで完結するため、後述のダメージ処理やイベント発火のタイミングに合わせて呼び出す場所を決めれば十分です。

ダメージを実装する方法
体力の上限を決めたら、次はダメージを与える仕組みです。Roblox Studioでは、HumanoidのTakeDamageメソッドを使うのが基本になります。
パーツ接触でダメージを与える基本コード
トゲや溶岩のような「触れるとダメージを受けるパーツ」は、Touchedイベントと組み合わせて実装します。
local DAMAGE_AMOUNT = 10
local damagePart = workspace:WaitForChild("DamagePart")
damagePart.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character and character:FindFirstChild("Humanoid")
if humanoid then
humanoid:TakeDamage(DAMAGE_AMOUNT)
end
end)
hit.Parentがキャラクター本体とは限らない(アクセサリや持ち物の場合もある)ため、FindFirstChild("Humanoid")で見つかったときだけダメージを与えるようにしています。
連続ダメージのバグを防ぐdebounce処理
上記のコードをそのまま使うと、キャラクターがダメージパーツに触れ続けている間、1フレームごとにTouchedイベントが発火し、一瞬で体力が0になってしまいます。これを防ぐのが「debounce(連続発火の抑制)」処理です。
local DAMAGE_AMOUNT = 10
local DAMAGE_COOLDOWN = 1
local Players = game:GetService("Players")
local damagePart = workspace:WaitForChild("DamagePart")
local lastDamageTime = {}
damagePart.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character and character:FindFirstChild("Humanoid")
if not humanoid then
return
end
local player = Players:GetPlayerFromCharacter(character)
local key = player or character
local now = os.clock()
if not lastDamageTime[key] or now - lastDamageTime[key] >= DAMAGE_COOLDOWN then
lastDamageTime[key] = now
humanoid:TakeDamage(DAMAGE_AMOUNT)
end
end)
プレイヤーごとに最後にダメージを与えた時刻をlastDamageTimeで記録し、DAMAGE_COOLDOWN(ここでは1秒)以内の再ダメージを無視しています。これだけで「触れた瞬間に即死する」という初心者が最もつまずきやすいバグを防げます。
体力の回復速度を変更する
Robloxのキャラクターは、既定でも時間経過とともに体力が少しずつ回復する動きを持っています。ゲームの難易度調整として、この回復スピードを変えたい場合の方法を紹介します。
デフォルトの回復設定
Robloxのキャラクターには「1秒ごとにMaxHealthの1%を回復する」という既定の挙動が組み込まれています。放置していると体力が少しずつ戻っていくのは、この仕組みによるものです。
この回復スピードを直接変更できる公開プロパティは用意されていないため、次のようなStarterCharacterScriptsに独自の回復ループを追加して既定の動きを上書きする方法がよく使われます。
回復速度を変更するスクリプト
local REGEN_RATE = 0.02 -- 1秒あたりの回復割合(MaxHealthに対する比率)
local REGEN_INTERVAL = 1
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
while humanoid.Health > 0 do
task.wait(REGEN_INTERVAL)
if humanoid.Health < humanoid.MaxHealth then
humanoid.Health = math.min(humanoid.MaxHealth, humanoid.Health + humanoid.MaxHealth * REGEN_RATE)
end
end
REGEN_RATEの数値を大きくするほど回復が速く、小さくするほど回復が遅くなります。回復を完全に止めたいシビアなゲームでは、REGEN_RATEを0にすれば実質的に無効化できます。
HPバーをゲーム画面に表示する
体力の数値をそのまま表示するより、視覚的なバーで見せたほうが、プレイヤーは自分の状況を一目で把握できます。
StarterGuiでHPバーフレームを作成
StarterGuiに次の階層でUIを作成します。
- ScreenGuiを作成する
- その中にFrame(名前:「Track」)を作成し、体力バーの背景枠にする
- Trackの中にさらにFrame(名前:「Fill」)を作成し、体力に応じて伸び縮みする部分にする
FillのSizeをUDim2.new(1, 0, 1, 0)(Trackいっぱい)にしておくと、体力満タンの状態が初期表示になります。
LocalScriptでリアルタイム更新
Fillの親であるScreenGui直下にLocalScriptを配置し、HumanoidのHealthChangedイベントでバーの幅を更新します。
local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local fill = script.Parent:WaitForChild("Track"):WaitForChild("Fill")
local function updateHealthBar()
local ratio = humanoid.Health / humanoid.MaxHealth
fill.Size = UDim2.new(ratio, 0, 1, 0)
end
humanoid.HealthChanged:Connect(updateHealthBar)
updateHealthBar()
HealthChangedはHealthの値が変わるたびに発火するイベントなので、ダメージを受けたときも回復したときも、このスクリプト1つでバーが自動更新されます。最後のupdateHealthBar()は、ゲーム開始直後の見た目を最新の体力に合わせるための初期化呼び出しです。

よくある失敗と解決法
体力システムを実装した人からよく聞く症状と、その原因・対処法をまとめました。
| 症状 | 原因 | 対処法 |
|---|---|---|
| MaxHealthを変更したのに体力バーの見た目が変わらない | HealthChangedイベントに接続していない、または初期化呼び出しを忘れている | LocalScriptでHealthChanged:Connectのあとに一度手動でupdateHealthBar()を呼ぶ |
| ダメージパーツに触れた瞬間に即死する | Touchedイベントが連続発火し、TakeDamageが何度も実行されている | debounce処理(クールダウン管理)を追加する |
TakeDamageを呼んでもエラーは出ないのに体力が減らない |
hit.Parentがキャラクター本体ではなく、アクセサリなど別のインスタンスを指している |
FindFirstChild("Humanoid")の結果がnilでないか確認し、取得元を見直す |
| HPバーがStudioのテストでは動くのに公開後に動かない | HPバー更新用スクリプトがLocalScriptではなくScriptになっている | StarterGui配下に置くUI更新スクリプトは必ずLocalScriptにする |
HPバー更新はLocalScript、ダメージやMaxHealthの変更はServerScript(Script)という役割分担を意識すると、この手のミスは大きく減らせます。
体力(HP)に関するFAQ
Q1. デフォルトの体力は何ポイントですか?
MaxHealth = 100、Health = 100がデフォルト値です。
Q2. 体力がすぐに0になってしまいます。原因は何ですか?
ダメージパーツに触れている間、Touchedイベントが連続発火しているのが主な原因です。debounce処理でダメージ間隔を制御してください。
Q3. スクリプトを書いたのに体力が変わりません。
MaxHealthやHealthを変更するスクリプトの配置場所を確認してください。キャラクターごとに反映させたい場合は、StarterCharacterScriptsに置く必要があります。
Q4. 体力回復を完全に無効にするには?
回復スクリプトのREGEN_RATEを0に設定すれば、実質的に自動回復を無効化できます。
Q5. HPバーが正しく動かないときは何を確認すればいいですか?
まずUI更新スクリプトがLocalScriptになっているかを確認してください。次に、Fillへのパス(TrackとFillの名前)がスクリプト内の記述と一致しているかを見直してください。
まとめ
この記事では、Roblox Studioで体力(HP)システムを設定・変更する方法を解説しました。
重要なポイント:
- 体力はHumanoidのHealth・MaxHealthプロパティで管理する
- MaxHealthを変更したら、Healthも合わせて変更する
- ダメージ実装は`TakeDamage`を使い、debounce処理で連続ダメージを防ぐ
- 回復速度は既定の挙動を独自ループで上書きして調整する
- HPバーはHealthChangedイベントで更新し、UI更新はLocalScriptで行う
体力システムは、最大値の変更やダメージ、回復、表示と工程が多く見えますが、1つずつ切り分けて実装すれば決して難しくありません。まずは最大値の変更とシンプルなダメージ実装から試して、動く感覚をつかんでみてください。
TETRA UPのRobloxコースでは、こうしたHumanoidの扱い方やLuauの基礎を、プロのインストラクターと一緒に一つずつ手を動かしながら学べます。自分のゲームに本格的な体力システムを組み込んでみませんか。
あわせて読みたい

吉田先生やよっしー、たまによしぞーって呼ばれたりしています。よろしくお願いします。