一番近くにいるプレイヤーを追いかけるNPCのプログラムです。

  1. ツールボックスからNPCを見つけて挿入します。
    プログラムが入っているNPCは正常に動作しなくなる可能性が高いので注意してください。
  2. 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 を使用すれば、迷路の中でさえもプレイヤーを追いかけることができるようになります。さらに歩くアニメーションを付けようと思いますので、自身のプレイヤーキャラを使ってみます。

  1. Baseplateのみのテンプレートを使って新規作成します。
  2. プレイします。
  3. Workspaceに自身のキャラクターモデルが入っていると思いますので、それを右クリックしてコピーします。
  4. 停止します。
  5. Workspcaeにペーストします。これで自身のキャラクターモデルが取得できます。
  6. キャラクターモデルの名称を「NPC」に変更します。
  7. 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

By schilverberch

ROBLOXでゲームを作ろう! 一緒にプログラミングを学びましょう。

コメントを残す