2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Robloxで追いかけてくる警察をつくる

Posted at

概要

image.png
image.png

全体のフォルダ構成

  • workspace下にFolderを追加。名前はTeleportとか適当につけておきましょう。
  • その中に、Toolboxから持ってきたNPCを配置
  • 捕まったときに飛ばされる先のテレポートブロックStartPointを配置

image.png

NPCのフォルダ構成

  • Toolboxの中のNPCは、誰かがつくったスクリプトがくっついている可能性が高いので、あれば消しちゃいましょう
  • HealthとかSoundとかAnimateとか、NPCの行動に関係なさそうなスクリプトは残しておいていいです
  • 消した上で、今回つかう「Catch」という名前のスクリプトを作りましょう

image.png

プログラミング

  • テレポートについて復習したい人はこちらを参考にどうぞ

https://blog.mitsuruog.info/2019/04/roblox-teleport-block

  • こちらが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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?