「ゲームの中に、話しかけると喋るキャラクターを置きたい」「NPCを歩かせたい」
ロブロックス(Roblox)スタジオでNPCを作る方法を、実際の画像付きで誰でも簡単に分かるように解説します。ここでは、Eキーで話しかけると頭の上に吹き出しでセリフを喋る「案内人」と、2つの地点を行ったり来たりする「歩く人」を作ります。NPCは、プレイヤーが動かさないキャラクターのことです。
中級ステップ9/28 前の記事:ロブロックス(Roblox)スタジオのTweenの使い方 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、マウス、キーボード。スクリプトの入れ方はオビーの作り方で画像付きで解説しています。
今回の完成状態:下の画像のように、案内人の前でEキーを押すたびに、吹き出しのセリフが増えていけば成功です。

NPCは何でできている?
NPCは、プレイヤーのアバターと同じ形の「モデル」です。中には、頭(Head)、体の中心の見えない部品(HumanoidRootPart)、体力や歩く速さを持つ「Humanoid(ヒューマノイド)」などが入っています。
| 部品 | 役目 | この記事でさわること |
|---|---|---|
| Humanoid | 体力、歩く速さ、頭の上に出る名前 | 名前(DisplayName)、歩く速さ |
| HumanoidRootPart | 体の中心。ここを固定すると、NPCが動かなくなる | 案内人は固定、歩く人は固定しない |
| Head | 頭 | 話しかける部品(ProximityPrompt)を入れる |
1. キャラクターボタンでNPCの体を置く
新しいBaseplateを開き、3D画面上部メニューの「ホーム」タブにある「キャラクター」(「地形」ボタンの右、赤い枠)を押します。

「リグを生成」の窓が開きます。リグタイプの「R15」(画像の1)を選んだまま、「ブロック型アバター(2012年)」(画像の2)を押してください。

R15とR6は、体の部品の分け方の違いです。Robloxの公式の説明によると、重ね着できる3Dの服やアクセサリーを着せられるのはR15だけです。迷ったらR15を選びます。
3D画面に灰色のキャラクターが置かれました(赤い枠)。頭の上には「Rig」と名前が出ています。

2. 名前を変える
エクスプローラで「Rig」を選んだ状態でF2キーを押し、名前を「Guide」に変えます(赤い枠)。

続けて、スポーン地点の前に動かします。エクスプローラでGuideを選んだまま、プロパティの検索欄に「Origin」と入力し、Originの下のPositionを「0, 3, -14」にしてEnterキーを押します。
続けてGuideを選んだまま、Originの下のOrientationを「0, 180, 0」にしてEnterキーを押します(赤い枠)。Orientationの真ん中の数を180にすると、スポーン地点のほうを向きます。画面では「-0, 180, -0」のように出ることがありますが、0と同じです。

エクスプローラでGuideの左の三角を押して開くと、中に「Humanoid」(画像の1)や「Head」(画像の2)が入っています。

エクスプローラで「Humanoid」を選び、プロパティの検索欄に「DisplayName」と入れて、「案内人」と入れます(画像の1)。頭の上の名前が「案内人」に変わります(画像の2)。

エクスプローラの名前(Guide)は、スクリプトで探すための名前です。遊ぶ人に見せる名前はDisplayNameで決めます。
3. 倒れないように固定する
置いたばかりのキャラクターは固定されていません。話しかける案内人は動かなくてよいので、固定します。エクスプローラでGuideの中の「HumanoidRootPart」を選び(画像の1)、プロパティの検索欄に「Anchored」と入力して、Anchoredの欄にチェックを入れます(画像の2)。

4. 話しかける部品(ProximityPrompt)を入れる
エクスプローラの「Head」にマウスを乗せて、右に出る「+」(赤い枠)を押します。

検索欄に「ProximityPrompt」と入れて、「ProximityPrompt」(赤い枠)を押します。ProximityPrompt(プロキシミティプロンプト)は、近づくと「Eを押して○○する」という案内が出る部品です。

エクスプローラでHeadの中に入った「ProximityPrompt」を選んだ状態で、プロパティの検索欄に「Text」と入れます。ActionTextの欄を「話しかける」にしてEnterキーを押し、ObjectTextの欄を「案内人」にしてEnterキーを押します(赤い枠)。

プロパティの検索欄に「MaxActivationDistance」と入れます。「MaxActivationDistance」は、案内が出る距離です。初期値は10スタッドでした(赤い枠)。

続けてプロパティの検索欄に「KeyboardKeyCode」と入れると、押すキー(KeyboardKeyCode)の初期値が「E」だと分かります(赤い枠)。

| プロパティ | 今回の値 | 意味 |
|---|---|---|
| ActionText | 話しかける | 案内に出る、何をするかの言葉 |
| ObjectText | 案内人 | 案内に出る、相手の名前 |
| MaxActivationDistance | 10(初期値) | この距離まで近づくと案内が出る |
| KeyboardKeyCode | E(初期値) | 押すキー |
Robloxの公式の説明によると、スマホやタブレットで遊ぶ人は、案内を直接タップして話しかけられます。
押して動かす部品は2種類ある
押すと何かが起きる部品には、ProximityPromptのほかに「ClickDetector」があります。
| 部品 | 動かし方 | 向いている場面 |
|---|---|---|
| ProximityPrompt | 近づくと「E 話しかける」のような案内が出て、キーかタップで動く | NPCに話しかける、ドアを開ける。何ができるかが案内で分かる |
| ClickDetector | 部品をマウスでクリックするか、タップすると動く。案内は出ない(初期値では32スタッドまで届く) | ボタンや看板など、押せることが見た目で分かる物 |
この記事のように、近づいた人に「話しかけられる」と知らせたいときは、ProximityPromptが向いています。
5. 吹き出しでセリフを喋らせる
エクスプローラのStarterPlayerの左の三角を押して開き、中のStarterPlayerScriptsにマウスを乗せて「+」を押します(赤い枠)。

検索欄に「LocalScript」と入れ、一覧の「LocalScript」を押します(赤い枠)。

エクスプローラでStarterPlayerScriptsの中に入った「LocalScript」を選んだ状態でF2キーを押し、名前を「GuideTalk」に変えます。
GuideTalkの画面で、中身を全部消して、次のコードを貼り付けます。
-- 案内人に話しかけると、頭の上に吹き出しでセリフを出す
-- 吹き出し(DisplayBubble)はクライアントでしか動かないので LocalScript にする
local TextChatService = game:GetService("TextChatService")
local guide = workspace:WaitForChild("Guide")
local head = guide:WaitForChild("Head")
local prompt = head:WaitForChild("ProximityPrompt")
-- 順番に喋るセリフ
local lines = {
"こんにちは!ようこそ!",
"奥にいる人は、ずっと歩き回っているよ。",
"また話しかけてね!",
}
local index = 0
prompt.Triggered:Connect(function()
-- 次のセリフへ進む(最後まで行ったら最初に戻る)
index = index % #lines + 1
TextChatService:DisplayBubble(head, lines[index])
end)

| コードの部分 | していること |
|---|---|
| prompt.Triggered | Eキーを押したり、案内をタップしたりしたときに動く |
| lines | 喋るセリフの一覧。行を足せばセリフが増える |
| index % #lines + 1 | 1、2、3、1、2…と、セリフの番号を順番に進める |
| DisplayBubble | 指定した部品(ここでは頭)の上に、吹き出しを出す |
吹き出しを出すDisplayBubbleは、遊ぶ人のパソコンで動くスクリプト(クライアント側)でしか動きません。この記事では、StarterPlayerScriptsのLocalScriptを使います(Robloxの公式の説明では、RunContextを「Client」にしたScriptでも動くとされています)。
6. テストで話しかける
3D画面の上の作品のタブ「Place8」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。案内人に近づくと、「E 案内人 話しかける」の案内が出ます(赤い枠)。

Eキーを押すと、案内人の頭の上に「こんにちは!ようこそ!」の吹き出しが出ます(画像の1)。案内(画像の2)は出たままなので、続けて話しかけられます。

もう一度Eキーを押すと、2つめのセリフ「奥にいる人は、ずっと歩き回っているよ。」が下に増えます(赤い枠)。

Shift + F5キーでテストを停止します。
7. 歩くNPCを作る
次は、行ったり来たりする「歩く人」です。3D画面上部メニューの「ホーム」タブにある「キャラクター」を押します。
「リグを生成」の窓が開きます。リグタイプの「R15」を選んだまま、「ブロック型アバター(2012年)」を押します。エクスプローラのWorkspaceの中に、2体目の「Rig」が入ります。
エクスプローラで新しく入った「Rig」を選んだ状態でF2キーを押し、名前を「Walker」に変えます(赤い枠)。

エクスプローラでWalkerの左の三角を押して開き、中の「Humanoid」を選びます。続けてHumanoidを選んだまま、プロパティの検索欄に「DisplayName」と入力し、DisplayNameを「歩く人」にします(赤い枠)。

歩かせるNPCは、HumanoidRootPartを固定しません。エクスプローラでWalkerの中の「HumanoidRootPart」を選んだ状態で、プロパティの検索欄に「Anchored」と入力すると、最初からチェックが外れています(画像の2)。そのままにします。3D画面には「歩く人」が置かれています(画像の1)。

エクスプローラの「ServerScriptService」にマウスを乗せて「+」を押し、検索欄に「Script」と入力して、一覧の「Script」を押します。
エクスプローラでServerScriptServiceの中に入った「Script」を選んだ状態でF2キーを押し、名前を「WalkerPatrol」に変えます。
WalkerPatrolを選んだまま、プロパティの検索欄に「RunContext」と入力し、「▼動作」の欄にあるRunContextの一覧から「Server」を選びます(赤い枠)。RunContextは、スクリプトをどこで動かすかを決める設定で、「Server」はゲームのサーバー側で動かす設定です。

WalkerPatrolの画面で、中身を全部消して、次のコードを貼り付けます。
-- Walker を2つの地点の間で往復させる
-- Walker は固定(Anchored)しないこと。固定すると歩かない
local walker = workspace:WaitForChild("Walker")
local humanoid = walker:WaitForChild("Humanoid")
humanoid.WalkSpeed = 8 -- ゆっくり歩かせる(初期値は16)
-- 往復する地点(Baseplate の上、スポーン地点の横)
local points = {
Vector3.new(-15, 0, -20),
Vector3.new(15, 0, -20),
}
while true do
for _, point in points do
humanoid:MoveTo(point)
-- 着くか、8秒たつまで待つ(8秒で止まるのは Roblox の決まり)
local reached = humanoid.MoveToFinished:Wait()
if not reached then
-- 着かなかったときは、もう一度だけ同じ場所へ向かわせる
humanoid:MoveTo(point)
humanoid.MoveToFinished:Wait()
end
task.wait(1)
end
end

| コードの部分 | していること |
|---|---|
| WalkSpeed | 歩く速さ。初期値は1秒に16スタッド。8にしてゆっくり歩かせる |
| MoveTo | 指定した場所へ歩かせる |
| MoveToFinished:Wait() | 着くまで待つ。8秒たっても着かないと、止まって「着かなかった」と返す |
MoveToで歩かせたNPCは、8秒たっても行き先に着かないと、そこで止まります。これはRobloxの公式の説明に書かれている決まりです。遠くまで歩かせるときは、着かなかったときにもう一度MoveToを呼びます。
3D画面の上の作品のタブ「Place8」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。以下は、アソビシフト編集部が確かめた結果です。歩く人(画像の1)はスポーン地点の奥を左右に行ったり来たりしました。同じように左右に行ったり来たりしていれば成功です。

Shift + F5キーでテストを停止します。
NPCが倒れる・動かない・喋らないときの確かめ方
| 症状 | 見るところ | 直し方 |
|---|---|---|
| 案内人が倒れる・ずれる | HumanoidRootPartのAnchored | チェックを入れて固定する |
| 歩く人が歩かない | HumanoidRootPartのAnchored | 歩かせるNPCは固定しない |
| 歩く人が途中で止まる | MoveToFinished | 8秒で止まる決まりがある。もう一度MoveToを呼ぶ |
| Eの案内が出ない | ProximityPromptの場所 | Headなどのパーツの中に入っているか |
| Eの案内が出ない | 距離 | MaxActivationDistanceより近づいているか |
| Eを押しても吹き出しが出ない | スクリプトの種類と場所 | StarterPlayerScriptsのLocalScriptか |
| 頭の上の名前が変わらない | DisplayName | HumanoidのDisplayNameを変えたか |
スクリプトが動いているか分からないときは、スクリプトが動かないときの確認手順で出力の見方を確かめてください。
AIに相談するときの伝え方
Roblox Studioで、Workspace/Guide というNPCに話しかけると、頭の上に吹き出しでセリフを順番に出したいです。
Head の中の ProximityPrompt の Triggered を使い、吹き出しは TextChatService の DisplayBubble で出してください。
DisplayBubble はクライアントでしか動かないので、StarterPlayerScripts の LocalScript にしてください。
古い Chat サービスの Chat:Chat は使わないでください。
よくある質問
ツールボックスのNPCを使ってもいい?
使えます。ただし、中にスクリプトが入っているモデルもあるので、使う前に中身を確かめます。確かめ方はツールボックスは安全?で解説しています。
次は、追いかけてくる敵を作ります。次のステップ(中級 10/28)
次に知りたいことを選ぶ
- 次のステップ:追いかけてくる敵を作ります → ロブロックス(Roblox)で追いかけてくる敵の作り方
- NPCの横に看板を立てたい → ロブロックス(Roblox)スタジオで文字を出す方法
- 話しかけた結果を全員に見せたい → ロブロックス(Roblox)のRemoteEventの使い方
- ツールボックスのNPCを安全に使いたい → ロブロックス(Roblox)スタジオのツールボックスは安全?