一番近くにいるプレイヤーを追いかけるNPCのプログラムです。
- ツールボックスからNPCを見つけて挿入します。
プログラムが入っているNPCは正常に動作しなくなる可能性が高いので注意してください。 - NPCにScriptを追加し、以下のプログラムを入力します。
local Players = game:GetService("Players")
local noob = script.Parent
local function findPlayer()
local position = nil
local distance = math.huge -- 最大値を設定しておく
for _,pl in pairs(Players:GetPlayers()) do
local character = pl.Character
if character then
local d = pl:DistanceFromCharacter(noob.PrimaryPart.Position) -- プレイヤーとNPCの距離を取得
if d < distance then -- より近いプレイヤーをターゲットにする
distance = d
position = character.PrimaryPart.Position -- プレイヤーの位置
end
end
end
return position
end
while wait(0.5) do -- waitの値で
local position = findPlayer()
if position then
noob.Humanoid:MoveTo(position) -- NPCの移動
end
end
プレイヤーを追うNPC(Pathfinding)
PathfindingService を使用すれば、迷路の中でさえもプレイヤーを追いかけることができるようになります。さらに歩くアニメーションを付けようと思いますので、自身のプレイヤーキャラを使ってみます。
- Baseplateのみのテンプレートを使って新規作成します。
- プレイします。
- Workspaceに自身のキャラクターモデルが入っていると思いますので、それを右クリックしてコピーします。
- 停止します。
- Workspcaeにペーストします。これで自身のキャラクターモデルが取得できます。
- キャラクターモデルの名称を「NPC」に変更します。
- NPCの中にScriptを追加して以下のプログラムを入力します。
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local npc = script.Parent
local animator = npc.Humanoid.Animator
local animation = npc.Animate.walk.WalkAnim
local animationTrack = animator:LoadAnimation(animation)
-- パスの生成
local path = PathfindingService:CreatePath()
local breakCount = 10 -- この数字を小さくすると再探査が早まる
-- 最も近いプレイヤーを探す
local function searchTarget()
local players = Players:GetPlayers()
local targetPlayer = nil
local targetDistance = math.huge
for i,player in pairs(players) do
local character = player.Character
if character and character:FindFirstChild("Humanoid") then
local distance = player:DistanceFromCharacter(npc.PrimaryPart.Position)
if distance < targetDistance then
targetPlayer = player
targetDistance = distance
end
end
end
return targetPlayer -- ターゲットになるプレイヤーを返す
end
animationTrack:Play() -- 歩くアニメーションの再生
while wait() do
local player = searchTarget()
if not player then
continue
end
local character = player.Character
local humanoid = character and character:FindFirstChild("Humanoid")
if humanoid then
local position = character.PrimaryPart.Position
path:ComputeAsync(npc.PrimaryPart.Position,humanoid.RootPart.Position)
if path.Status == Enum.PathStatus.Success then
local waypoints = path:GetWaypoints()
for i,waypoint in pairs(waypoints) do
npc.Humanoid:MoveTo(waypoint.Position)
npc.Humanoid.MoveToFinished:Wait()
if i % breakCount == 0 and position ~= character.PrimaryPart.Position then
break
end
end
end
end
end