Menu
CoddyTech

Q 키로 대시하기

Coddy의 Roblox 게임: 배틀그라운드 코스 레슨. 20개 중 6번째.

능력은 플레이어의 기기에서 시작됩니다. BattleClient는 HUD 안에 있는 LocalScript이며, ContextActionService는 동작을 키에 연결합니다. 세 번째 인수로 true를 지정하면 휴대폰 화면에 해당 동작을 위한 버튼도 표시됩니다:

ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q)

함수는 동작의 이름과 입력 상태를 받으며, 키를 누르면 Begin 상태가 됩니다. 게임 규칙은 서버가 관리하므로 클라이언트가 독자적으로 대시하지 않습니다. 이름으로 RemoteEvent Remotes.Ability를 통해 서버에 요청합니다. 서버는 이름별 능력 테이블을 보유하며, 대시는 밀어내기 동작입니다. 루트의 속도를 설정하면 캐릭터가 앞으로 튕겨 나갑니다.

function abilities.Dash(player, character, root)
	root.AssemblyLinearVelocity = root.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0)
end
challenge icon

챌린지

중급

BattleClient에서 ContextActionService와 Remotes 폴더를 가져오고, Begin일 때 이름을 사용해 remotes.Ability를 실행하는 use(name, state)를 작성한 다음, 터치 버튼과 함께 Q에 "Dash"를 바인딩하세요.

BattleServer에서 local remotes = game.ReplicatedStorage.Remotes와 Dash가 포함된 abilities 테이블을 추가하고, remotes.Ability.OnServerEvent(player, name)를 연결해 플레이어, 해당 플레이어의 캐릭터와 캐릭터의 루트를 인수로 지정된 능력을 실행하세요.

Play를 누르고 Q를 누르세요. 그런 다음 Check를 누르세요.

직접 해보기

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local lastSwing = {} -- player -> 마지막으로 휘두른 시각

-- Roblox 자체 검 애니메이션
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- 검을 휘두르면 애니메이션이 재생된 뒤 앞쪽 상자 범위 안의 모두가 공격받음
local function swing(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or character.Humanoid.Health <= 0 then
		return
	end
	local now = time()
	if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
		return
	end
	lastSwing[player] = now
	character.Humanoid.Animator:LoadAnimation(slash):Play()
	-- 앞쪽 상자 범위, 자신의 몸은 절대 포함하지 않음
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- 한 번 휘두를 때 각 humanoid는 한 번만 공격받음
	for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
		local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
		if humanoid and not hit[humanoid] then
			hit[humanoid] = true
			humanoid:TakeDamage(Settings.SwordDamage)
		end
	end
end

-- 모든 플레이어는 리더보드에 Kills를 받고, 생명마다 검을 하나씩 받음
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local sword = ServerStorage.Sword:Clone()
		sword.Parent = player.Backpack
		sword.Activated:Connect(function()
			swing(player)
		end)
	end)
end)

-- 훈련용 허수아비: 체력 바는 체력을 따라 변하고, 쓰러진
-- 허수아비는 잠시 후 같은 자리에 새로운 복제본으로 되돌아옴
local function setupDummy(dummy)
	local humanoid = dummy.Humanoid
	humanoid.HealthChanged:Connect(function(health)
		dummy.HealthBar.Back.Fill.Size = UDim2.fromScale(health / humanoid.MaxHealth, 1)
	end)
	humanoid.Died:Connect(function()
		local spot = dummy:GetPivot()
		task.wait(0.5)
		dummy:Destroy()
		task.wait(Settings.DummyRespawn)
		local fresh = ServerStorage.Dummy:Clone()
		fresh:PivotTo(spot)
		fresh.Parent = workspace
		setupDummy(fresh)
	end)
end
setupDummy(workspace.Dummy)
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Roblox 게임: 배틀그라운드의 모든 레슨