이 섹션에서는 움직이지 않은 사물의 위치를 알리는 커스텀 심장 박동 VFX(시각 효과)를 게임플레이에 추가하는 방법을 설명합니다.
사물 팀의 플레이어가 너무 오랫동안 유휴 상태이면, 심장 박동 시각 효과가 해당 플레이어에 재생되어 헌터 팀에 알립니다. 이 시각 효과는 사물 팀의 각 플레이어가 게임에서 생성될 때 등록됩니다.
VFX 생성 장치를 Verse와 함께 사용하여 심장 박동 함수 기능을 구현해 보겠습니다. 여기에는 다음이 포함됩니다.
-
시각 효과를 활성화합니다.
-
VFX 생성 장치를 플레이어에게로 순간이동합니다.
-
심장 박동이 일어나기 전에 이동해야 하는 시점까지 남은 시간을 사물 팀 팀원들에게 보여주는 UI를 제작합니다.
이 튜토리얼에는 이 게임에 필요한 게임플레이 메커니즘의 실행법을 보여주는 Verse 스니펫이 포함되어 있습니다. 아래 단계를 따라 이 튜토리얼의 6단계에 있는 전체 스크립트를 복사합니다.
시작하기 전에
에셋과 장치를 찾기 쉽게 폴더에 정리해 두는 것이 좋습니다. 용도, 위치, 타입 또는 다른 선호 기준에 따라 장치를 그룹화할 수 있습니다.
배치된 에셋을 생성한 폴더 및 액터로 이동할 수 있습니다.
위의 gif 이미지는 정리 목적으로 VFX 생성 장치를 사물 팀의 HeartBeatVFX 폴더로 드래그하는 모습입니다. 또한 우클릭하고 다음으로 이동(Move To) 을 선택하여 에셋을 이동하고자 하는 폴더를 선택할 수 있습니다.
사용한 장치:
- ~16 x VFX 생성 장치
VFX 생성 장치
각 플레이어의 VFX 생성 장치를 만듭니다. 플레이어에게 VFX가 필요하면, 장치가 플레이어의 위치로 순간이동해야 합니다. VFX가 더 이상 필요하지 않으면 다시 필요해질 때까지 숨겨집니다.
이 템플릿의 VFX 생성 장치는 나이아가라 VFX를 사용하여 게임플레이 중에 표시되는 커스텀 에셋을 제작합니다. 이 튜토리얼에서 사용되는 VFX 에셋은 심장 박동을 표시하도록 설정되어 사물 팀에서 이동하지 않는 플레이어를 드러냅니다. 이 VFX는 최소 15초 동안 정지한 사물에 표시됩니다.
문서의 시각 효과 섹션에서 심장 박동 VFX를 제작하는 방법에 대한 다양한 튜토리얼을 살펴보세요. 그런 다음 생성한 커스텀 심장 박동을 VFX 생성 장치와 함께 사용합니다.
VFX 생성 장치를 배치하면 이를 시도할 수 있습니다. 디테일(Details) 패널의 커스텀 시각 효과(Custom Visual Effect) 드롭다운 메뉴에서 커스텀 이펙트를 선택합니다. 선택한 VFX가 뷰포트에 표시되도록 하려면 커스텀 시각 효과 오버라이드(Custom Visual Effect Override) 를 활성화해야 합니다.
이 시점에서, 디테일 패널에서 색상을 추가하고 VFX 재생 시점 및 표시 대상을 결정하여 이펙트를 한층 커스터마이징할 수 있습니다.
이 장치를 플레이어에게 보이지 않는 위치에 배치하고 사용자 옵션(User Options) 을 아래 표와 일치하도록 환경설정합니다. 그런 다음 이 장치를 게임플레이에서 허용되는 플레이어 수만큼 복사하여 붙여넣습니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 커스텀 시각 효과(Custom Visual Effect) | HeartBeatVFX | 프리셋 목록의 파티클이 아닌 커스텀 파티클을 정의하여 사용합니다. |
| 커스텀 시각 효과 오버라이드(Custom Visual Effect Override) | True | 개발자 FX를 사용할지 여부를 결정합니다. |
| 사용 단계(Enabled on Phase) | 게임플레이만(Gameplay Only) | 장치가 활성화되는 게임 단계를 결정합니다. 활성화된 VFX 생성 장치는 정의된 파티클 이펙트를 재생합니다. |
위치에서 심장 박동 이펙트 재생
Verse에서 VFX 생성 장치를 이동하여 사물 팀 플레이어의 심장 박동 이펙트를 재생 및 중지하려면 다음 단계를 따릅니다.
-
heartbeat.verse 라는 프로젝트에서 새 Verse 파일을 생성합니다. 이 파일은 Verse 장치가 되지 않으므로 빈 Verse 파일로 생성해도 됩니다.
-
생성한 Verse 파일을 더블클릭하여 임포트할 Verse 경로를 다음과 같이 추가합니다.
using { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/UI } using { /Verse.org/Colors } using { /Verse.org/Simulation } -
이 코드는 heartbeat.verse 에서
heartbeat_vfx로 명명된 클래스를 생성합니다.heartbeat_vfx클래스에는 플레이어별vfx_spawner_device오브젝트를 추적하는 데이터 구조체와 VFX를 어떤 위치로 설정하거나 리셋하는 함수가 포함되어 있습니다.log_heart_beat := class(log_channel){} # 이러한 메시지는 심장 박동이 표시되지 않도록 이동해야 하는 사물 에이전트에게 메시지로 알리거나 사물 에이전트를 숨기는 데 사용됩니다. HeartBeatWarningMessage<localizes>(Time:int):message = "Heart Beat in {Time} Seconds. Move!" HeartBeatWarningClear<localizes>:message = "" # 이 클래스는 prop_hunt Verse 장치에 심장 박동의 편집 가능 프로퍼티를 노출합니다. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable # 심장 박동으로 인해 위치가 발각되기 전에 사물 에이전트가 반드시 이동해야 하기까지 남은 시간(초)입니다. MoveTime:float = 15.0 @editable # 심장 박동 경고가 표시되기 전 남은 시간(초)입니다. HeartBeatTimer보다 클 수 없습니다. WarningTime:float = 5.0 @editable # 심장 박동 VFX 장치의 배열입니다. 플레이어당 하나씩 있습니다. AgentVFX:[]heartbeat_vfx = array{} @editable # 심장 박동 사운드 이펙트(SFX) 재생에 사용되는 라디오 플레이어 장치입니다. SFXPlayer:radio_device = radio_device{} # 이 맵은 각 사물 에이전트에게 심장 박동 경고를 표시하는 UI와 연관되어 있습니다. var WarningUI:[agent]heartbeat_warning_ui = map{} # SFX 장치를 관리할 수 있도록 심장 박동이 활성화된 플레이어 수를 추적합니다. var NumberOfHeartBeats:int = 0 # 에이전트의 심장 박동 UI를 구성합니다. SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} # 지정된 플레이어의 심장 박동 VFX 및 SFX를 활성화합니다. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # 씬에서 사물 에이전트의 위치를 찾는 데 사용되는 캐릭터를 얻습니다. Character := PropAgent.GetFortCharacter[] then: # 심장 박동 VFX의 위치를 사물 에이전트의 위치로 설정합니다. HeartBeatVFXData.Activate(Character.GetTransform()) # 심장 박동 수를 증가시키며, 처음 재생되는 심장 박동인 경우 오디오가 시작되도록 재생해야 합니다. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # 오디오 플레이어 장치에 사물 에이전트를 등록하여 심장 박동 오디오가 해당 위치에서 재생되도록 합니다. SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, or HeartBeatVFXData not found. Cannot start the heartbeat") # 지정된 사물 에이전트의 심장 박동 VFX 및 SFX를 지웁니다. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabling heart beat.") # VFX 비주얼을 비활성화합니다. HeartBeatVFXData.Deactivate() # 오디오 플레이어 장치에서 사물 에이전트를 등록 취소하여 심장 박동 오디오가 중지되도록 합니다. SFXPlayer.Unregister(PropAgent) # 심장 박동 카운터를 감소시킵니다. 이 카운터는 0 미만으로 내려갈 수 없습니다. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # 모든 사물 에이전트의 모든 심장 박동 VFX 및 SFX를 지웁니다. DisableAll():void = Logger.Print("Disabling all heart beats.") # 모든 VFX에서 반복작업하여 0,0,0으로 이동합니다. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # 심장 박동 오디오에서 모든 플레이어를 등록 취소합니다. SFXPlayer.UnregisterAll() # 심장 박동 카운터를 0으로 재초기화합니다. set NumberOfHeartBeats = 0 # heartbeat_warning_ui 클래스에는 플레이어별 UI 캔버스 및 text_block을 추적하는 데이터 구조체와 새 심장 박동 경고 UI 캔버스를 생성하는 함수가 포함되어 있습니다. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # 경고 메시지를 위한 UI 캔버스를 생성합니다. CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text -
이 코드는 트랜스폼 실행인자를 받고 해당
transform으로 VFX 생성 장치를 이동하는heartbeat_vfx클래스에서Activate()메서드를 생성합니다.# heartbeat_vfx 클래스에는 플레이어별 VFX의 루트 및 vfx_spawner_device 오브젝트를 추적하는 데이터 구조체와 VFX를 어떤 위치로 설정하거나 리셋하는 함수가 포함되어 있습니다. heartbeat_vfx := class<concrete>: @editable # 각 심장 박동의 VFX 장치입니다. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # 이 오프셋은 사물 에이전트의 머리 위에 심장 박동을 배치하는 데 사용됩니다. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # 심장 박동 VFX의 위치를 설정한 다음 VFX를 활성화합니다. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() -
이 코드는 VFX 생성 장치를 비활성화하여 심장 박동 비주얼을 숨기는
heartbeat_vfx클래스에서Deactivate()메서드를 생성합니다.# heartbeat_vfx 클래스에는 플레이어별 VFX의 루트 및 vfx_spawner_device 오브젝트를 추적하는 데이터 구조체와 VFX를 어떤 위치로 설정하거나 리셋하는 함수가 포함되어 있습니다. heartbeat_vfx := class<concrete>: @editable # 각 심장 박동의 VFX 장치입니다. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # 이 오프셋은 사물 에이전트의 머리 위에 심장 박동을 배치하는 데 사용됩니다. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # 심장 박동 VFX의 위치를 설정한 다음 VFX를 활성화합니다. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() # VFX를 비활성화하여 심장 박동 비주얼을 숨깁니다. Deactivate():void = VFXDevice.Disable()
플레이어에게 심장 박동 경고 표시
심장 박동 경고 메시지를 표시하는 텍스트 블록이 포함된 커스텀 UI를 구성하려면 다음 단계를 따릅니다. 커스텀 UI 및 기타 Verse UI 컴포넌트 제작에 대해 자세히 알아보려면 인게임 유저 인터페이스를 참조하세요.
-
아래의 두 상수는 게임 내에서 다양한 시간대에 사물 팀 플레이어들에게 표시될 텍스트를 제어합니다.
-
상수
HeartBeatWarningMessage는int를 받아message타입을 반환하는 함수입니다. 이 타입은 현지화할 수 있으므로 UI 엘리먼트에 사용됩니다. 이 텍스트는 플레이어가 심장 박동 이펙트로 인해 위치가 발각되지 않도록 이동해야 할 때 플레이어에게 표시됩니다. -
상수
HeartBeatWarningClear는 플레이어에게 더 이상 경고 메시지가 보이지 않도록 표시되는 빈message입니다.
# 이러한 메시지는 심장 박동이 표시되지 않도록 이동해야 하는 사물 에이전트에게 메시지로 알리거나 사물 에이전트를 숨기는 데 사용됩니다. HeartBeatWarningMessage<localizes>(Time:int):message = "Heart Beat in {Time} Seconds. Move!" HeartBeatWarningClear<localizes>:message = "" -
-
heartbeat.verse 에서
heartbeat_warning_ui로 명명된 새 클래스를 생성합니다. heartbeat_warning_ui 클래스에는 플레이어별 UI 캔버스 및 text_block을 추적하는 데이터 구조체와 새 심장 박동 경고 UI 캔버스를 생성하는 함수가 포함되어 있습니다.# heartbeat_warning_ui 클래스에는 플레이어별 UI 캔버스 및 text_block을 추적하는 데이터 구조체와 새 심장 박동 경고 UI 캔버스를 생성하는 함수가 포함되어 있습니다. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # 경고 메시지를 위한 UI 캔버스를 생성합니다. CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text
심장 박동 이펙트 관리
심장 박동 매니저를 생성하려면 다음 단계를 따릅니다.
-
아래 코드는 heartbeat.verse 에서
heart_beat로 명명된 클래스를 생성합니다. 이 클래스는 prop_hunt 장치에 심장 박동의 편집 가능 프로퍼티를 노출하고 심장 박동 이펙트를 관리합니다.log_heart_beat := class(log_channel){} # 이 클래스는 prop_hunt 장치에 심장 박동의 편집 가능 프로퍼티를 노출합니다. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable MoveTime:float = 15.0 - 이 코드는
heart_beat클래스에 다음과 같은 편집 가능 프로퍼티를 추가합니다.-
이 코드는 심장 박동 이펙트로 인해 위치가 발각되기 전에 사물 에이전트가 반드시 이동해야 하기까지 남은 시간(초)을 제어합니다.
@editable MoveTime:float = 15.0-
이 코드는 화면에 메시지가 표시되어 사물 팀 팀원에게 심장 박동이 일어나기 전에 이동하라고 경고하기까지 남은 시간(초)을 제어합니다.
@editable WarningTime:float = 5.0 -
이 코드는 심장 박동 VFX 장치의 배열입니다. 플레이어당 하나씩 있습니다.
@editable AgentVFX:[]heartbeat_vfx = array{} -
이 코드에서는 라디오 플레이어 장치가 심장 박동 사운드 이펙트(SFX) 재생에 사용됩니다.
@editable SFXPlayer:radio_device = radio_device{}
-
-
-
이 코드 맵은 각 사물 에이전트에게 심장 박동 경고를 표시하는 UI와 연관되어 있습니다.
# 이 맵은 각 사물 에이전트에게 심장 박동 경고를 표시하는 UI와 연관되어 있습니다. var WarningUI:[agent]heartbeat_warning_ui = map{} -
이 코드는 SFX 장치를 관리할 수 있도록 심장 박동이 활성화된 플레이어 수를 추적합니다.
# SFX 장치를 관리할 수 있도록 심장 박동이 활성화된 플레이어 수를 추적합니다. var NumberOfHeartBeats:int = 0 -
이 코드는 플레이어에게 경고 UI를 표시합니다.
# 에이전트의 심장 박동 UI를 구성합니다. SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} -
이 코드는 지정된 플레이어의 시각 효과(VFX) 및 사운드 이펙트(SFX)를 활성화합니다.
# 지정된 플레이어의 심장 박동 VFX 및 SFX를 활성화합니다. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # 씬에서 사물 에이전트의 위치를 찾는 데 사용되는 캐릭터를 얻습니다. Character := PropAgent.GetFortCharacter[] then: # 심장 박동 VFX의 위치를 사물 에이전트의 위치로 설정합니다. HeartBeatVFXData.Activate(Character.GetTransform()) # 심장 박동 수를 증가시키며, 처음 재생되는 심장 박동인 경우 오디오가 시작되도록 재생해야 합니다. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # 오디오 플레이어 장치에 사물 에이전트를 등록하여 심장 박동 오디오가 해당 위치에서 재생되도록 합니다. SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, or HeartBeatVFXData not found. Cannot start the heartbeat") -
이 코드는 플레이어 한 명의 VFX 및 SFX를 비활성화하는 메서드 하나와 모든 플레이어의 VFX 및 SFX를 비활성화하는 또 다른 메서드 하나를 생성합니다.
# 지정된 사물 에이전트의 심장 박동 VFX 및 SFX를 지웁니다. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabling heart beat.") # VFX 비주얼을 비활성화합니다. HeartBeatVFXData.Deactivate() # 오디오 플레이어 장치에서 사물 에이전트를 등록 취소하여 심장 박동 오디오가 중지되도록 합니다. SFXPlayer.Unregister(PropAgent) # 심장 박동 카운터를 감소시킵니다. 이 카운터는 0 미만으로 내려갈 수 없습니다. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # 모든 사물 에이전트의 모든 심장 박동 VFX 및 SFX를 지웁니다. DisableAll():void = Logger.Print("Disabling all heart beats.") # 모든 VFX에서 반복작업하여 0,0,0으로 이동합니다. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # 심장 박동 오디오에서 모든 플레이어를 등록 취소합니다. SFXPlayer.UnregisterAll() # 심장 박동 카운터를 0으로 재초기화합니다. set NumberOfHeartBeats = 0