블래스터 동작 구현은 첫 번째 인솔 샷 경험에서 폭발 메카닉을 프로그래밍하는 과정입니다. 플레이어는 단일 클릭으로 폭발하거나 버튼을 누르면 폭발을 수행할 수 있지만, 만족스러운 정확한 폭발 동작을 생성하는 것이 중요하므로 게임 플레이즐거움을
참조용으로 사용하는 레이저 태그 경험 을 사용하여 이 튜토리얼의 이 섹션에서는 두 가지 유형의 블래스터에 대한 블래스터 동작 구현의 스크립트에 대해 설명합니다. 여기에는 다음이 포함됩니다.
- 플레이어가 폭발 버튼을 누르는 시간을 감지합니다.
- 최근에 폭발 버튼을 누른 경우 플레이어가 블래스터를 사용할 수 있는지 확인하십시오.
- 서버가 폭발을 시작한 위치, 폭발의 원본 위치 및 각 레이저 빔의 최종 목적지를 나타내는 폭발 데이터를 생성합니다.
- 폭발 데이터가 다른 플레이어와 충돌하면 적절한 작업을 수행할 수 있도록 서버에 알리십시오.
- 폭발 사이에 블래스터를 재설정하여 폭발 후 충분한 시간이 지난 후 폭발할 수 있습니다.
이 섹션을 완료하면 플레이어와 충돌할 때 블래스터가 감지할 수 있는 스크립트를 배우고 각 블래스터 입력따라 해당 블래스터의 건강을 결정합니다.
플레이어 입력 감지
블래스터 동작을 구현하는 첫 번째 단계는 플레이어가 폭발 버튼을 누르는 시간을 들어주는 것입니다. 플레이어가 폭발 버튼을 누르는 데 사용하는 입력 유형은 경험에 액세스하는 제어따라 다릅니다. 예를 들어, 샘플 레이
이 클라이언트 스크립트는 ContextActionService 를 사용하여 MouseButton1 및 ButtonR2 를 폭발 액션바인딩합니다. 즉, 플레이어가 왼쪽 마우스 버튼을 누르거나
사용자 입력 처리기
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
또 다른 중요한 점은 Enum.UserInputState.Begin 정의에서 onBlasterActivated() 을 사용하는 것입니다. 많은 사용자 인터페이스 상호 작용, 예를 들어 이 예에서 선택하는 블래스터,은 En
시연하려면 Enum.UserInputState.Begin 를 Enum.UserInputState.End 로 변경한 다음 플레이테스트를 수행하여 폭발이 경험의 게임플레이에 어떤 영향을 미치는지 확인하십시오. 예를 들어, 플레이어가 버튼을 누르지 않고 폭발에 대응하는 경우,
사용자 입력 처리기
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- 업데이트된 라인, 뒤로변경하세요
attemptBlastClient()
end
end
플레이어가 폭발할 수 있는지 확인
After UserInputHandler 버튼 누름이나 화면 누르다감지하면 ReplicatedStorage >
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
If you
이 간단한 중지는 클릭할 때마다 폭발할 수 있는 속도를 방지합니다. 예를 들어, 함수를 항상 true로 변경하면 레이저 태그 게임 플레이대해 실제와 같지 않은 레이저 폭발을 빠르게 수행할 수 있습니다.
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return true -- 업데이트된 라인, 뒤로변경하세요
end
폭발 데이터 생성
플레이어의 블래스터가 Ready 상태에 있음을 확인한 후, attemptBlastClient 는 ReplicatedStorage > 2> blastClient2> > 5> blastClient5>
다음 단계는 폭발 데이터를 생성하는 것입니다. ReplicatedStorage > Blaster > BlastData 를 검토하면 각 폭발에 대해 세 가지 정보가 포함되어 있음을 알 수 있습니다.
- 폭발을 시작한 플레이어.
- 폭발의 원점을 나타내는 DataType.CFrame입니다.
- 레이저 빔의 최종 목적지와 타격 플레이어가 있는 RayResult 테이블.
이 데이터를 생성하려면, blastClient 는 ReplicatedStorage > attemptBlastClient > 2>blastClient2> > 5>gradeBlastData5>를 호출하며, 이는 아래에서 검토할 수 있습니다.
폭발 데이터 생성
local function generateBlastData(): BlastData.Type
local blasterConfig = getBlasterConfig()
local rayDirections = getDirectionsForBlast(
currentCamera.CFrame, blasterConfig)
local rayResults = castLaserRay(
localPlayer, currentCamera.CFrame.Position, rayDirections)
local blastData: BlastData.Type = {
player = localPlayer,
originCFrame = currentCamera.CFrame,
rayResults = rayResults,
}
return blastData
end
이 함수는 getBlasterConfig 를 사용하여 플레이어의 블래스터 입력검색하여 시작합니다. 샘플은 넓은 가로 전파를 생성하는 하나의 블래스터 유형과 하나의 블래스터 유형을 생성하는 다른 유형의 블래스터를 제공합니다. 구성
이제 함수는 currentCamera.CFrame 을 폭발의 시작 지점으로 사용하고, 다음으로 getDirectionsForBlast 로 전달합니다. 이
서버 알림
blastClient 가 폭발에 대한 완전한 데이터를 가지고 있으면, 두 이벤트가 발생합니다.
클라이언트 폭발
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
Class.BindableEvent는 다른 클라이언트 스크립트에 대해 폭발을 알립니다. 예를 들어, ReplicatedStorage > FirstPersonBlasterVisuals 는 이 이벤트를 사용하여 시각적 효과,
레이저 폭발 처리기
local function onLaserBlastedEvent(playerBlasted: Player, blastData: BlastData.Type)
local validatedBlastData = getValidatedBlastData(playerBlasted, blastData)
if not validatedBlastData then
return
end
if not canPlayerBlast(playerBlasted) then
return
end
blastServer(playerBlasted)
processTaggedPlayers(playerBlasted, blastData)
for _, replicateToPlayer in Players:GetPlayers() do
if playerBlasted == replicateToPlayer then
continue
end
replicateBlastEvent:FireClient(replicateToPlayer, playerBlasted, blastData)
end
end
부정 행위를 방지하기 위해 서버는 각 클라이언트가 보내는 모든 데이터를 확인해야 합니다. 이 검사에는 다음이 포함됩니다.
- BlastData 테이블은 테이블입니까? Class.CFrame 및 rayResults라는 이름의 다른 테이블이 포함되어 있습니까?
- 플레이어가 블래스터를 장착하고 있습니까?
- 플레이어가 세계 내에 캐릭터와 위치가 있습니까?
- 폭발 데이터를 보낸 후 플레이어가 레이저 빔을 폭발한 위치에서 과도한 거리를 이동했습니까?
이 마지막 검사는 판단 콜을 포함하며, 서버 대기 시간 및 플레이어 이동 속도에 따라 다른 값이 자신의 경험에 대해 과도하다고 결정할 수 있습니다. 이 판단 콜을 시연하려면 getValidatedBlastData에 프린트 문을 추가하고 경험을 플레이테스트하십시오.
getValidatedBlastData 를 가져옵니다.
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- 업데이트된 줄, 제거하세요if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
이동하고 폭발하면서 출력을 기록하십시오. 다음과 같이 보일 수 있습니다.
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
플레이어 이동 속도를 ReplicatedStorage > PlayerStateHandler > togglePlayerMovement 에 증가시키면 플레이테스트를 다시 수행해야 할 가능성이 높습니다. 잦은 이동으로 인해 많은 오류가 발생할 가능성이 높기 때문입니다.
플레이어 이동 활성화
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
서버는 팔로잉수행합니다.
- 유효한 레이 결과 rayResults .
- 플레이어가 폭발할 수 있는지 여부를 확인합니다.
- 블래스터 상태를 초기화합니다.
- 모든 태그된 플레이어의 건강을 줄여줍니다.
- 다른 플레이어가 제3자 시점 뷰를 볼 수 있도록 폭발을 다시 플레이합니다.
이 서버 작업에 대한 자세한 내용은 타격 감지 센서 섹션의 튜토리얼을 참조하십시오.
블래스터 초기화
샘플 레이저 태그 경험에서 블래스터는 열 메카닉을 사용합니다. 일정 수의 폭발 후 재장전하는 대신 시간을 필요로 합니다 "쿨다운" 사이에 각 폭발 사이에. 이 같은 쿨다운 지연은 클라이언트 ( blastClient ) 및 서버 (
blast서버
local blasterConfig = getBlasterConfig(player)
local secondsBetweenBlasts = blasterConfig:GetAttribute("secondsBetweenBlasts")
task.delay(secondsBetweenBlasts, function()
local currentState = player:GetAttribute(PlayerAttribute.blasterStateServer)
if currentState == BlasterState.Blasting then
player:SetAttribute(PlayerAttribute.blasterStateServer, BlasterState.Ready)
end
end)
secondsBetweenBlasts 특성은 ReplicatedStorage > Instances > 1>LaserBlastersFolder1> 에 있는 블래스터 구성의 일부입니다. 플레이어가 4>secondsBetweenBlasts4> 지연 후 폭발할 수 있으며, 전
이제 플레이어는 생성 및 리스폰, 조준 및 폭발, 하지만 경험은 여전히 각 폭발의 결과를 결정해야 합니다. 튜토리얼의 다음 섹션에서 플레이어가 블래스트를 다른 플레이어에게 적중시키면 블래스터가 적절한 수의 플레이어 건강을 감소시킬 수 있도록 프로그래��