概要
全体のフォルダ構成
- workspace下にFolderを追加。名前はTeleportとか適当につけておきましょう。
- その中に、Toolboxから持ってきたNPCを配置
- 捕まったときに飛ばされる先のテレポートブロックStartPointを配置
NPCのフォルダ構成
- Toolboxの中のNPCは、誰かがつくったスクリプトがくっついている可能性が高いので、あれば消しちゃいましょう
- HealthとかSoundとかAnimateとか、NPCの行動に関係なさそうなスクリプトは残しておいていいです
- 消した上で、今回つかう「Catch」という名前のスクリプトを作りましょう
プログラミング
- テレポートについて復習したい人はこちらを参考にどうぞ
- こちらがNPCにつけるスクリプトになります
Catch.lua
-- 捕まったときにプレイヤーが戻される場所のオブジェクト
local StartPoint = script.Parent.Parent.StartPoint
-- 何かにぶつかったとき、それが人間だったら、その人間をStartPointへ飛ばす
function onTouched(hit)
local humanoid = hit.Parent:FindFirstChild("HumanoidRootPart")
if humanoid then
humanoid.CFrame = StartPoint.CFrame + Vector3.new(0, 5, 0)
end
end
-- ほかく者のオブジェクト
local Figure = script.Parent
-- ほかく者のHumanoidオブジェクト
local Humanoid = Figure:FindFirstChild("Humanoid")
-- ほかく者のHumanoidオブジェクトにふれたときに、onTouched関数が起動する
-- ほかく者のオブジェクト(Model)にはTouchedメソッドがついてない
-- なので、わざわざほかく者のHumanoidオブジェクトを上で準備している
Humanoid.Touched:connect(onTouched)
-- ずっと繰り返す
while true do
-- ちょっと待つ
wait(math.random(2, 6))
-- 追いかける相手を決めるためにつかう変数
local targetPlayer
-- オンラインプレイで複数プレイヤーがいる場合、その中からランダムに追いかける相手をえらぶ
-- しかし、GetService("Players")ではプレイヤーの名前やIDはわかっても、座標がわからない
-- なぜかというと、GetService("Players")で取得しているのは、Workspace内のプレイヤーオブジェクトではなく
-- workspaceと並んでいるPlyersというフォルダの中のプレイヤーオブジェクトのため。
-- このプレイヤーオブジェクトは名前やIDしか持っていない。
local targetPlayer_list = {}
local Players = game:GetService("Players")
for i, player in pairs(Players:GetPlayers()) do
targetPlayer_list[i] = player
end
targetPlayer = targetPlayer_list[math.random(1, #targetPlayer_list)]
-- GetService("Players")で取得したプレイヤーの名前をつかって
-- workspace内のプレイヤーオブジェクトを探している
local targetPlayer_obj = workspace:FindFirstChild(targetPlayer.Name)
-- workspace内のプレイヤーオブジェクトの場所へむかって動く
Humanoid:MoveTo(targetPlayer_obj.HumanoidRootPart.Position)
end