기본 플로우

  1. add plugin : python editor script plugin
  2. project setting : Plugins - Python - Additional Paths
    1. 실행할 py파일 넣을 곳
  3. edittor setting - python - devmode = true
  4. import
    1. console창
    2. tab = python ( ctrl + tab )
    3. import [filename] as [별칭]
    4. reload
      1. from importlib import reload
      2. reload(별칭)
  5. run
    1. 그냥 함수 or 메서드 실행

 

API 리스트

  • 문서 : https://docs.unrealengine.com/4.27/en-US/PythonAPI/
  • AssetToolsHelpers ( editor의 AssetTools object에 접근하기 위한 클래스 )
    • get_asset_tools()
      • return : <AssetTools> AssetToolsImpl ( editor에 implement된 객체? )
        • import_asset_tasks(arg)
          • arg1 : <class> AssetImportTask ( cpp의 setup용 struct 처럼, unreal.AssetImportTask()로 하나 만들고 set해서 사용
  • <class> AssetImportTask
    • set_editor_property(arg1, arg2)
      • arg1 : <str> 입력할 프로퍼티 종류
      • arg2 : <t> 입력할 프로퍼티 값
      •  arg1 - arg2 리스팅
        • automated - bool ( 자동화 )
        • destination_name - string ( 저장할 신규 폴더 이름 )
        • destination_path - string ( 저장할 폴더 경로 /Game/...)
        • filename - string ( 저장할 파일 이름 )
        • replace_existing - bool ( 덮어쓰기 여부 )
    • get_editor_property(arg)
      • arg : <str> 출력할 프로퍼티
      • return : <t> 출력된 프로퍼티 값

Noise

material -> texture 베이크 하기

  • Mat
    • shading model : unlit
    • input = float3 ( uv coord, 0 )
  • BP
    • Draw Material to Render Target
    • Render Target Create Static Texture Editor Only
  펄린 보로노이 클라우드 마블 마블(distortion)
scale 8 4 8 8 4
quality   4 4 4  
function gradient voronoi voronoi voronoi gradient
turbulence x x x x x
level 5 1 3 2 6
min/max output 0 ~ 1
level scale 2 2 2 2 2
tiling o o o o o
repeat size 8 4 8 8 4
additional     one minus, squared    

 

 

Slerp

  • LocationA * ( sin(theta*alpha) / sin(theta) ) + LocationB * ( sin(theta*(1-alpha) / sin(theta) )

Ease pattern

  • Quad
  • Sine
  • Cubic
  • Quart
  • Quint
  • Expo
  • Logic
    • Bounce
    • Back
    • Elastic

Elo Rating

  • 레이팅 컨트롤에 편한 형태로 param이 빠진 로지스틱함수

 

Quaternion

쿼터니안

ijk = -1;

ij = k, ji = -k;

xi + yj + zk + w = (x, y, z, w) = (v, w)

p = (px, py, pz, pw) ( = pxi + pyj + pzk + pw )

q = (qx, qy, qz, qw)

pq =

    (pxqw + pyqz - pzqy + pwqx)i

+ (-pxqz + pyqw + pzqx + pwqy)j

+ (pxqy - pyqx + pzqw + pwqz)k

+ (-pxqx - pyqy - pzqz + pwqw)

 

(pq)* = q*p* ( 켤레복소수 )

||magnitude|| = x^2 + y^2 + z^2 + w^2

 

p ( 기존 rot vector )

theta ( 기준축 u에 대한 회전각 )

u ( 회전기준축의 단위벡터 )

q = (sin ( u*theta/2 ), cos ( theta/2 ) )

회전 후 벡터 = qpq*

 

quaternion 2 matrix ( 변환을 위해 )

 

 

'Unreal > Material' 카테고리의 다른 글

테스트 레퍼런스  (0) 2024.05.20

Server - Client Model

Server ( authority )

  • check request
  • replicate to client

Client ( clone )

  • function ( input, logic, etc.. ) → request for server
  • Init
    • bReplicates
    • SetIsReplicated(bool)

Request Function to Server ( RPCs remote procedure calls )

header

header

UFUNCTION ( server, reliable, validation )

type funcName(var);

 

cpp

cpp

.AddBind( param, object, funcName );

 

type funcName_Implementation(var)

{ 실행문 ( 서버에서 ) }

 

bool funcName_Validation(var)

{ return 유효성 } // false일 경우, cheating 규칙 적용

 

Actor Roles ( Unreal Doc. _ Actor Roles )

  • Unreal network model에서 권한의 단위는 Actor
    • Simulated Proxy Actor ( in client )
      • 서버로 부터 받는 정보에 전적으로 의존
      • 정보들을 종합하여 지역적(시간축) 상태에 대해 시뮬레이션 → 적용
      • 이후 리플리케이트를 적용할 때, 시뮬레이션된 값과 서버로부터 새로 받은 정보를 기반으로 비교, 검정, 보간
    • Autonomous Proxy
      • Simulated Proxy에 더해, 유저의 입력을 포함하고 있으며, 역으로 server에게의 request를 포함

  • Role / RemoteRole
    • 체크하는 당사자 ( server or client 등 ) 입장에서, 자신의 정보 - Role / 비교대상의 정보 - Remote Role
    • Actor.Role property를 통해 접근가능

  • Autonomous Proxy는, 자기자신에 대한 결정권은 자신이 지니므로
    • Local에서 수행 후
    • Server 에서 UFUNCTION(server)로 할당된 로직을 수행하는 형태로 구현되어야 함
    • 동기화를 고려하면, local 수행용 함수와, server 수행용 implementation 함수는 동일한 로직이어야 함

 

Replicate Property

  • Object 단위
  • bReplicates = true; ( Object ) ( constructor )
  • UPROPERTY(Replicated) [property]
    •  
    • void AActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const // header에서 선언할 필요 없음 ( property의 속성에 replicated를 통해 선언 ) { DOREPLIFETIME(AActor, [property]); }
    • ( ReplicatedUsing = [함수명] )
      • 해당 함수를 통해 replicate 진행
      • 같은 class 내의 UFUNCTION 항목?
      • [함수명](OnRep_Func)은 property 값이 변경될마다, client ( has authority = false )에서만 이루어짐

      • header

        UPROPERTY(ReplicatedUsing = OnRep_ReplicatedTransform)
        FTransform ReplicatedTransform;
        cpp
        void AMyKart::OnRep_ReplicatedTransform()
        {
           SetActorTransform(ReplicatedTransform);
        }
  • Actor::NetUpdateFrequency ( sec, beginPlay )
  •  
  •  
    •  

 

    • owner player controller와 현재 접속한 instance에게 할당된 player controller를 비교해서 IsLocallyControlled 체크하는듯?
    • hasAuthority는 "해당 액터"의 속성에 관한 것 ( 호출자하고는 별개인듯? )
  • HasAuthority() 체크시, 함수를 포함하는 actor instance가 아니라 함수를 호출하는 actor instance의 authority를 체크하는듯?
  • IsLocallyControlled() 체크시, 함수를 포함하는 actor instance == 함수를 호출하는 actor instance 체크하는듯?
  • canonical state ( 표준 상태 ) - 프로토콜
     -> 서버-클라 유효성검정을 위한 데이터들의 모듈화된 군집 ( serialize? or structure? )APawn::IsLocallyControlled()
    { return APawn::Controller(allocated) && Controller->IsLocalController() }
    Actor::Role
  • AActor::HasAuthority()
    { return GetLocalRole }

 

보간 패턴

보간 패턴

  • Location - Linear interp.
  • Revolutionary - Location Slerp ( spherical linrea interpolation )
  • Velocity
    • exponential 합성하여 사용
    • sigmoid interp.
    • bezier ( hermite ) interp. - FMath::CubicInterp ( p0, t0, p1, t1, a ) - position, tangent(velocity or pos.derivation), alpha
  • Acceleration

 

 

 

Editor에서 소켓 접속 방법

  • 서버
    • "${언리얼 엔진 경로}\Engine\Binaries\Win64\UnrealEditor.exe" "${프로젝트 경로}\${프로젝트이름}.uproject" /Game/{맵 경로}?listen -server -log
    • 로그 확인 필요사항
      • 포트번호 확인 ( listening on port로 검색 )
      • created socket for bind adress : 0.0.0.0 이라면, 모든 ip의 접근에 대해 허가된 상태

 

  • 클라이언트
    • "${언리얼 엔진 경로}\Engine\Binaries\Win64\UnrealEditor.exe" "${프로젝트 경로}\${프로젝트이름}.uproject" 서버ip:포트번호 -game -log

'Unreal > Network' 카테고리의 다른 글

레퍼런스  (0) 2024.05.21
기본 구조  (0) 2024.05.21

Krazy Kart Sample

  • UGoKartMovementComponent : UActorComponent
    • Tick → !HasAuthority? LastMove = CreateMove() → SimulateMove(LastMove) :
    • Create Move(DeltaTime) ( → 현재 값을 FGoKartMove instance에 넣음 )
    • SimulateMove(FGoKartMove&)
      • Throttle, MaxDrivingForce, ActorForwardVector, AirResistance, RollingResistance, Mass, DeltaTime으로 → ApplyRotation, UpdateLocationFromVelocity // 실제 로컬에 적용하는 물리값
    • GetAirResistance() // 속도기반 공기저항 계산
    • GetRollingResistance() // 속도/중량기반 구르기 마찰저항 계산
    • ApplyRotation() ( ← 서버가 아닐떄 ) ( → Velocity 및 Rotation actor에 적용 )
    • UpdateLocationFromVelocity(DeltaTime) ( ← 서버가 아닐때 ) ( → Velocity로 Translation 적용 )

 

  • AGokart : APawn
    • SetupPlayerInputComponent(arg) ( → bind 앞,옆 이동 )
    • MoveForward(value) ( ← 키바인딩 ) ( → Throttle 값 변경 )
    • MoveRight(value) ( ← 키바인딩 ) ( → SteeringThrow값 변경 )

 

  • UGoKartMovementReplicator : UActorComponent
    • Constructor ( → bCanEverTick = true, SetIsReplicated(true) )
    • Tick
      • 자율프록시
        • MovementComponent로부터 LastMove를 얻어서, UnacknowledgedMoves에 추가
        • LastMove를 서버로 보냄
      • remote role = 시뮬프록시 ( → UpdateServerState() )
      • 시뮬프록시 ( → ClientTick() )
    • UpdateServerState(FGoKartMove) ( ← remote role이 시뮬프록시일떄 ) ( → FServerState instance를 받은 move와 // 현재 actor state값 복사 )
    • ClientTick(DeltaTime) ( ← 시뮬프록시 ) ( → 시작Loc(클라위치), 타겟Loc(서버위치), 시작속도(클라속도), 타겟속도(서버속도), 속도Derivative 5개param으로 HermiteCubicSpline 써서 보간 )
      • FMath::CubicInterp ( loc )
      • FMath::CubicInterpDerivative ( vel )
    • GetLifetimeReplicatedProps ( ← 프로퍼티 복제 ) ( → FServerState )
    • OnRep_ServeState() ( → 복제 받을시 호출 RPC )
      • 자율프록시() ( → serverstate의 트랜스폼, 벨로시티적용 / acknowledgeMove 갱신 ( ClearAcknowledgeMoves )
        • ClearAcknowledgeMoves = 각 FMove의 적용시간 비교해서, last무브 이후것만 남김 
        • MoveComponent.Simulate ( 남은 FMove 적용, 시뮬레이션 해서 위치 덮어쓰기 )

 

Puzzle Platform Sample

FileTree ( ← 사용처 / → 내용 / 없는거 arg )

  • MenuSystem
    • UMenuWidget : UUserWidget // 메뉴리스트 프레임
      • Setup() ( → 기본변수 셋업, SetInputMode(FInputModeUIOnly), bShowMouseCursor = true )
      • Teardown() ( → remove from viewport || remove from parent, SetInputMode, bShowMouseCursor ) // 자가붕괴
      • SetMenuInterface() ( → 참조변수_MenuInterface 지정 )
    • UInGameMenu : UMenuWidget // level에서 esc 메뉴
      • Init() ( → 버튼에 함수 바인딩 )
      • QuitPressed() ( → teardown 및 LoadMainMenu() ( main menu level로 이동 ) )
      •  Inherit
        • Teardown() // 자가붕괴
        • LodaMainMenu()
    • UMainMenu : UMenuWidget // 로비 메뉴
      • Constructor ( → BP클래스객체 = ConstructorHelpers::FClassFind<UUserWidget> BPClass(TEXT).Class )
      • Init ( → 버튼 바인딩 )
      • OpenMainMenu() ( → menuswitcher(U위젯스위처).SetActiveWidget(타겟자식위젯 or 인덱스)
      • HostServer() ( → MenuInterface ( UEditableTextBlock위젯.Text.Tostring )
      • SelectIndex ( int ) ( → int 번호 var에 저장 후, UpdateChildren() )
      • UpdateChildren() ( → var에 저장된 int번호기준, 선택된거 "선택상태", 나머지 "비선택상태"로 변경 bool UServerRow.Selected)
      • OpenJoinMenu() ( → 위젯스위처에서 join메뉴 활성, RefreshServerList() )
      • OpenMainMenu() (→ 위젯스위처에서 MainMenu 활성 )
      • QuitPressed() ( → ConsoleCommand("quit") )
      • Inherit (MenuWidget)
        • MenuInterface ( 만들서버이름 )
    • IMenuInterface : UInterface
      • Host(FString)
      • Join(uint)
      • LoadMainMenu()
      • RefreshServerList()
    • UServerRow : UUserWidget // 메뉴리스트 컴포넌트
      • Setup ( 부모ref, 자기 번호(부모안에서) ) ( ← 부모에서 생성 후 호출 ) ( → ref들 내부변수로 할당 및 Rowbutton 바인딩 )
      • OnClciekd() ( → 부모의 선택됨인덱스에 자기한테 부여된 번호 주입 )
  • LobbyGameMode :: AGameModeBase
    • StartGame() ( → GameInstance.StartSession // World.ServerTravel ) 
    • inherit ( game mode )
      • PostLogin ( APlayerController ) ( → 인원수 체크 / 다모이면 StartGame() )
      • Logout ( APlayerController ) ( → 인원수 감소 )
  • PP.GameInstance : UGameInstance, IMenuInterface
    • Function
      • Init()
      • LoadMenuWidget() ( Menu ← MenuClass // Menu.Setup // Menu.SetMenuInterface(this) ) // 인터페이스를 통함
      • InGameLoadMenu() ( InGameLoadMenu ← InGameLoadMenuClass // InGameLoadMenu.Setup // InGameLoadMenu.SetMenuInterface(this) ) // 인터페이스를 통함
      • StartSession() ( → SessionInterface.StartSession(세션이름) )
      • CreateSession() ( → SessionInterface.CreateSession( 호스팅플레이어num, 원하는세션이름, FOnlineSessionSettings )
      • OnCreateSessionComplete(FName SessionName, bool Success) ( ← SessionInterface.OncreateSessionCompleteDelegates.Add ) when Init ( → Menu.Teardown() // World.ServerTravel(레벨파일경로?listen) )
      • OnDestroySessionComplete(FName SessionName, bool Success) ( ← SessionInterface.OnDestoySessionCompleteDelegates.Add ) when Init
      • OnFindSessionsComplete(bool Success) ( ← SessionInterface.OnFindSessionsCompleteDelegates.Add ) when Init
      • OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) ( ← OnJoinSessionCompleteDelegates ) when Init ( → GetFirstLocalPlayerController로 자기 PC 얻고 // PC.ClientTravel(ip주소, ETravelType )
      • OnNetworkFailure ( UWorld* World, UNetDriver* NetDriver, ENetworkFailure::Type FailureType, const FString& ErrorString ) ( ← GEngine.OnNetworkFailure().Add )
      • Inherit ( Interface )
        • Host(FString) ( → 원하는 세션이름 받고(arg) // 세션있으면 기존세션 제거 // 없으면 CreateSession() )
        • Join(uint) ( → Menu 끄고 // SessionInterface.JoinSession(유저번호, 세션이름, FOnlineSessionSearchResult ( session search시 참조로 받아올 수 있는 structure )
        • LoadMainMenu() ( → PC.ClientTravel() )
        • RefreshServerList() ( → SessionInterface.FindSession(탐색플레이어num, TSharedRef<FOnlineSessionSearch>)
    • Property
      • TSubclassOf<UUserWidget> MenuClass ( ← ContructorHelpers::FClassFinde<UUserWidget> MenuBPClass(TEXT(경로)) + MenuBPClass.class ) when Construct
      • TSubclassOf<UUserWidget> InGameMenuClass ( ← ContructorHelpers::FClassFinde<UUserWidget> InGameMenuBPClass(TEXT(경로)) + InGameMenuBPClass.class ) when Construct
      • MainMenu* Menu
      • IOnlinSessionPtr SessionInterface
      • TSharedPtr<FOnlineSessionSearch> SessionSearch
      • FString DesiredServerName
  • PP.GameMode
    • Construct()
      • DefaultPawnClass = BP;

외부파일

 

  • DefaultEngine.ini
    • [/Script/EngineSettings.GameMapsSettings]
      •  TransitionMap=/Game/PuzzlePlatforms/Maps/Transiton.Transiton ( seamless travel을 위한 map 설정 )
    • [/Script/Engine.GameEngine]
      • +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
    • [OnlineSubsystem]
      • DefaultPlatformService=Steam
    • [OnlineSubsystemSteam]
      • bEnabled=true
      • SteamDevAppId=480
    • [/Script/OnlineSubsystemSteam.SteamNetDriver]
      • NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
  • Projectname.uproject
    • "Plugins": [ { "Name": "OnlineSubsystemSteam", "Enabled": true } ]
  • Projectname.Build.cs
    • PublicDependencyModuleNames.AddRange( "OnlineSubsystemStea" )

 

 

'Unreal > Network' 카테고리의 다른 글

구조 & 개념  (0) 2024.05.21
기본 구조  (0) 2024.05.21

'Unreal > Network' 카테고리의 다른 글

구조 & 개념  (0) 2024.05.21
레퍼런스  (0) 2024.05.21

DynamicMaterial - 충돌반응

 

  1. 언리얼 기본설정
    1. [Hit] event시, 대상오브젝트의 hit UV값 받아오는 설정 체크
  2. Material 구성
    1. 충돌지점, 충돌시간 받을 parameter 포함
  3. 충돌받을 Object의 material에 Dynamic Material instance로 생성
  4. 충돌 이벤트 관리
    1. [1.]에서 설정한 UV는 "Line Trace ( ray tracing )"을 통한 hit에만 해당하는것으로 보임
    2. 그래서 hit event 발생 시, hit location과 normal을 통해 line trace를 다시 쏴줘야 함
       
        1.  

 

FXS_tip of weapon 궤적

M_panner / FXS_ribborn
NM_parameter 전달

  1. M _ panner
    1. panner 효과 ( textrue 제작시 tiling 고려 _ 포토샵 offset )
  2. FXS _ ribbon
    1. ribbon(niagara)의 경우, spawn rate와 연동되는것으로 보임
    2. particle velocity값을 기반으로 length update
  3. BP _ parameter 전달
    1. Inherit [TimedNiagaraEffect] class
    2. Override Recieved Notify Tick
    3. Get [Socket] as name in mesh(skt), set [Param] as name in FXS
    4. Location (flaot3) 전달
  4. AM _ notifier
    1. Add [notify state] in montage ( 3. BP _ parameter )
    2. Set select 2. FXS _ ribbon

 

Mesh Distance Field

기능개요

  • https://velog.io/@cey_adda/Unreal-Engine-Distance-Field
  • 공간 샘플링 하여 인접유닛까지의 거리를 베이킹 혹은 캐싱하는 기법
    • 기본적으로는 섀도잉 표면 블러 및 오클루젼 용도?
    • SDF(signed distance field)는 사전에 베이킹
    • Global Distance Field는 runtime에 캐싱, 각 update에 수정된 부분의 값만 변경

 

사전작업

  • project setting - generate mesh distance field

 

작업

  • shader에서 distance 키워드의 object들 사용 ( nearest to distance 등 )
  • object에 적용 후, 해당 object의 affect distance field lighting 체크 해제

 

 

ref

 

젖은 머티리얼

Lerp MA

  • Base Color = Saturate( Desaurate ( DefaultColor, -0.5 ) ) * 0.5
  • Specular = 0.3
  • Roughness = 0.07

'Unreal > Material' 카테고리의 다른 글

노드  (0) 2024.05.21

기본 개념

 

AnimBP 링크 시스템 ( Anim Layer )

  • ref : https://docs.unrealengine.com/5.0/ko/animation-blueprint-linking-in-unreal-engine/

추상 애님BP를 만들고, 클래스처럼 활용하기 ( in[] → out ) ( 무기별 모션 구현 등 )

  1. 추상용 ABP를 만들고, Input들을 Input Pose로 만든다. ( 변수도 만든다. )
  2. 목표 ABP에서 Linked Anim Graph를 통해 Input을 넣고 Output을 받는다.

 

AnimLayerInterface를 통해 anim 내 method 구성을 모듈화 하기

  1. AnimLayerInterface 에셋을 만든다.
    1. Interface들을 만들고, 그 안에 input parameter들을 추가한다.
  2. 목표 ABP에서 class setting - interface에 implement한다.
    1. 해당 interface들을 사용하여 비어있는 구조를 설계한다.
  3. 케이스별 ABP에서 class setting - interface에 implement한다.
    1. 파라미터 하이어라키의 animation layers에서 드래그해서 쓴다
    2. 목표 ABP에서 animation layers(Interface)의 기능을 정의한다.
  4. BP에서 mesh - link anim class layers 함수를 통해, 오버라이드 한다. ( target anim class에서 정의되어있는 interface method만 override되는듯. out에 연결된 애님이 없으면 아얘 override 하지 않는듯 )
  5. ex)
    1. ABP_총잡이를 만들고 AnimInterface_파지 ( 지향사격, 조준사격 interface )를 바인딩, 두개의 인터페이스를 로직 중간에 껴넣는다
    2. ABP_샷건을 만들고 AnimInterface_파지를 바인딩, 두 interface 내부 로직을 구현한다.
    3. ABP_총잡이를 기본 animbp로 가지고있는 character BP에서 샷건장착 시, Link Anim Class Layer - ABP_샷건을 통해 interface들을 override한다.

 

EventGraph에서 Link Anim Class Layer를 통해 BP 로직 오버라이드 ( 혹은 호출 )

 

기존 ABP를 상속받은 ABP는 anim graph logic은 수정하지 못함

  • BP로직은 super 및 추가 가능
  • Asset Override탭을 통해 Asset은 override 가능
  • function, variable등은 override, edit 가능

 

* 추상용 ABP에 Skeleton을 할당하는 대신 Template으로 만들면, 내부 anim sequence는 관리하기 어려워지지만 대신 할당 skeleton 상관없이 어느 ABP에서도 Link 가능

 

AnimSequence <-> Niagara 상호작용

BP_timedNiagaraEffect → (function)Override notify Tick → Get spawn effect → Set Param ( input data from anim bone or socket )

 

'Unreal > Animation' 카테고리의 다른 글

Skeletal Mesh 모듈화 기능 ( Set Leader Pose Component )  (0) 2024.05.16
Anim Asset 구조  (0) 2024.05.16

UE5 Guid Page : https://docs.unrealengine.com/4.27/ko/RenderingAndGraphics/Niagara/Overview/

기본 구성

  • 나이아가라 시스템 
    [1] Attribute(Parameter) → [5] Detail(argument) 직접 대응 가능 ( 드래그 ) 나
  • 나이아가라 그룹 모듈

 

기본 구조

Niagara System

  • Overview Node ( system manager )
  • Emitter ( include [Items] )
    • Properties
    • Render
    • Stages ( Emt Sapwn / Emt update / Ptc Spawn / Ptc Update )
      • Module 
        • Parameter
          • Owner : Engine / System / Emitter / Particles / Stage transient / module output
          • Type
            • Primitive : 일반 변수타입
            • Enum
            • Struct
            • Data Interface : 외부 데이터소스 ( api, datatable등 )
      • Additional Stage
        • Events ( → Event Handler )
        • Simulation Stage

 

Niagara Module Flow

  • GetMap(get Params value) → Adjust Action → SetMap(set Params value)
    • module node based on bool / basic math / trigonometric / etc

 

Event and Event Handler

  • Concept : interaction between [Niagara Emitters] ( UE _ 이벤트 및 이벤트 핸들러 개요 )
  • Note
    • 이벤트는 현재 GPU 시뮬레이션과는 함께 작동하지 않고 CPU 시뮬레이션과만 함께 작동합니다.
    • 이벤트를 사용하려면 해당 이미터의 Emitter Properties(이미터 프로퍼티)에서 Requires Persistent IDs(퍼시스턴트 ID 필요)를 활성화해줘야 합니다.
    • 우선 콜리전(Collision) 모듈을 이미터에 추가해야 콜리전 이벤트 생성(Generate Collision Event) 을 해당 이미터에 추가할 수 있습니다. 이렇게 하면 이미터의 파티클이 월드의 오브젝트와 충돌할 수 있게 됩니다.
  • Flow
    EventHandler

     

    • in receive emitter
    • select specific [generate module] in detail pannel
    EventHandler
    • same type with [generated event]
  • Event
    • Particle Spawn/Update에서 Event module 추가
      • input param
  • MechanismNiagara System
    • Overview Node ( system manager )
    • Emitter ( include [Items] )
      • Properties
      • Render
      • Stages ( Emt Sapwn / Emt update / Ptc Spawn / Ptc Update )
        • Module 
          • Parameter
            • Owner : Engine / System / Emitter / Particles / Stage transient / module output
            • Type
              • Primitive : 일반 변수타입
              • Enum
              • Struct
              • Data Interface : 외부 데이터소스 ( api, datatable등 )
        • Additional Stage
          • Events ( → Event Handler )
          • Simulation Stage

    • GetMap(get Params value) → Adjust Action → SetMap(set Params value)
      • module node based on bool / basic math / trigonometric / etc

    • Concept : interaction between [Niagara Emitters] ( UE _ 이벤트 및 이벤트 핸들러 개요 )
    • Note
      • 이벤트는 현재 GPU 시뮬레이션과는 함께 작동하지 않고 CPU 시뮬레이션과만 함께 작동합니다.
      • 이벤트를 사용하려면 해당 이미터의 Emitter Properties(이미터 프로퍼티)에서 Requires Persistent IDs(퍼시스턴트 ID 필요)를 활성화해줘야 합니다.
      • 우선 콜리전(Collision) 모듈을 이미터에 추가해야 콜리전 이벤트 생성(Generate Collision Event) 을 해당 이미터에 추가할 수 있습니다. 이렇게 하면 이미터의 파티클이 월드의 오브젝트와 충돌할 수 있게 됩니다.
    • Flow
      EventHandler
      • in receive emitter
      • select specific [generate module] in detail pannel
      EventHandler
      • same type with [generated event]
    • Event
      • Particle Spawn/Update에서 Event module 추가
        • input param
    • MechanismNiagara System
      • Overview Node ( system manager )
      • Emitter ( include [Items] )
        • Properties
        • Render
        • Stages ( Emt Sapwn / Emt update / Ptc Spawn / Ptc Update )
          • Module 
            • Parameter
              • Owner : Engine / System / Emitter / Particles / Stage transient / module output
              • Type
                • Primitive : 일반 변수타입
                • Enum
                • Struct
                • Data Interface : 외부 데이터소스 ( api, datatable등 )
          • Additional Stage
            • Events ( → Event Handler )
            • Simulation Stage

      • GetMap(get Params value) → Adjust Action → SetMap(set Params value)
        • module node based on bool / basic math / trigonometric / etc

      • Concept : interaction between [Niagara Emitters] ( UE _ 이벤트 및 이벤트 핸들러 개요 )
      • Note
        • 이벤트는 현재 GPU 시뮬레이션과는 함께 작동하지 않고 CPU 시뮬레이션과만 함께 작동합니다.
        • 이벤트를 사용하려면 해당 이미터의 Emitter Properties(이미터 프로퍼티)에서 Requires Persistent IDs(퍼시스턴트 ID 필요)를 활성화해줘야 합니다.
        • 우선 콜리전(Collision) 모듈을 이미터에 추가해야 콜리전 이벤트 생성(Generate Collision Event) 을 해당 이미터에 추가할 수 있습니다. 이렇게 하면 이미터의 파티클이 월드의 오브젝트와 충돌할 수 있게 됩니다.
      • Flow
        EventHandler
        • in receive emitter
        • select specific [generate module] in detail pannel
        EventHandler
        • same type with [generated event]
      • Event
        • Particle Spawn/Update에서 Event module 추가
          • input param
      • MechanismNiagara System
        • Overview Node ( system manager )
        • Emitter ( include [Items] )
          • Properties
          • Render
          • Stages ( Emt Sapwn / Emt update / Ptc Spawn / Ptc Update )
            • Module 
              • Parameter
                • Owner : Engine / System / Emitter / Particles / Stage transient / module output
                • Type
                  • Primitive : 일반 변수타입
                  • Enum
                  • Struct
                  • Data Interface : 외부 데이터소스 ( api, datatable등 )
            • Additional Stage
              • Events ( → Event Handler )
              • Simulation Stage

        • GetMap(get Params value) → Adjust Action → SetMap(set Params value)
          • module node based on bool / basic math / trigonometric / etc

        • Concept : interaction between [Niagara Emitters] ( UE _ 이벤트 및 이벤트 핸들러 개요 )
        • Note
          • 이벤트는 현재 GPU 시뮬레이션과는 함께 작동하지 않고 CPU 시뮬레이션과만 함께 작동합니다.
          • 이벤트를 사용하려면 해당 이미터의 Emitter Properties(이미터 프로퍼티)에서 Requires Persistent IDs(퍼시스턴트 ID 필요)를 활성화해줘야 합니다.
          • 우선 콜리전(Collision) 모듈을 이미터에 추가해야 콜리전 이벤트 생성(Generate Collision Event) 을 해당 이미터에 추가할 수 있습니다. 이렇게 하면 이미터의 파티클이 월드의 오브젝트와 충돌할 수 있게 됩니다.
        • Flow
          EventHandler
          • in receive emitter
          • select specific [generate module] in detail pannel
          EventHandler
          • same type with [generated event]
        • Event
          • Particle Spawn/Update에서 Event module 추가
            • input param
        • Mechanism
      • Event and Event Handler
      • Niagara Module Flow
    • Event and Event Handler
    • Niagara Module Flow
  • Event and Event Handler
  • Niagara Module Flow

 

나이아가라 파라미터

  • 시각화

 

  • 파라미터 리스트
    1. System Attributes
      1. System : 해당 [나이아가라 시스템]의 attribute ( set active시 초기화 )
        1. Age ( float ) : 생성 후 경과 시간
        2. bCompoleteOnInactive ( bool ) : ?
        3. CurrentLoopDuration ( float ) : 설정된 루프 길이
        4. ExecutionState ( enum )
          1. awaken
          2. sleep and let particles finish
          3. sleep and clear particles
          4. kill immediately
          5. kill after particles fisnish
        5. ExecutionStateSource ( enum )
        6. LoopCount ( int ) : 총 루프 횟수
        7. LoopedAge ( float ) : 이번루프 경과 시간
        8. NormalizedLoopAge ( float ) : 이번루프 경과시간 백분위
      2. Emitter
        1. Age ( float )
        2. CurrentLoopDelay ( float ) : 루프사이 딜레이
        3. CurrentLoopDuration ( float )
        4. DistanceTraveled ( float )
        5. ExecutionState ( enum )
        6. ExecutionStateSource ( enum )
        7. LocalSpace ( bool )
        8. LoopCount ( int )
        9. LoopedAge  ( float )
        10. NormalizedLoopAge  ( float )
        11. DistanceFraction  ( float )
        12. SpawnOutputInfo ( structure )
        13. SpawnRemainder ( float )
      3. Particle
        1. Particles.Age
        2. Color
        3. DistanceTraveled
        4. Initial Color

 

Niagara Fluid ( Grid )

  • Runtime에 BP에서 flaot4 array 받아서 render target에 그리는 플로우
  • https://www.youtube.com/watch?v=3fW5xjiDm-A
    • - Manager BP에서 VectorArray를 Niagara에 보냄
      - Niagara에서 받은 VectorArray를 RenderTarget에 Override ( 빈 에미터에서 GPU 계산으로 바꿀 것 )
      - NiagaraFluids 플러그인 활성화
      - 빈 Emitter에서 Grid2D하고 RenderTarget2D 파라미터를 생성, 받음
          -> Grid2D는 2차원 데이터배열
      - Emitter Spawn phase에서 Set grid, 
        <- RenderTarget(256x256 size, rendertarget user parameter에 user rendertargetparameter 넣기)
        - Grid 2D Set Resolution ( data format을 half float ), Emiiter의 grid 연결 256, 256Scratch에 들어가는 parameter는 접두에 In / Out이 붙어야 함
    • + stage ( generic simulation stage ) 3개, initialize / write to grid / write to texture
        - iteration source = data interface, execute = always, 


커스텀 모듈 : write to grid / write to texture

 

커스텀 HLSL

int Out_Num;
InLocationsAndSizes.Length(Out_Num);
 
float NewGridValue = 0;
 
for(int Index = 0; Index <= Out_Num; Index++)
{
    float4 Out_Value;
    InLocationsAndSizes.Get(Index, Out_Value);
    OutRGBA = Out_Value.z;
    const float Distance = length(Out_Value - InGridLocation);
 
    if(Distance < (Out_Value.w * InRadiusScale))
    {
        const float Falloff = (1 - (Distance/(Out_Value.w * InRadiusScale)));
        NewGridValue = NewGridValue + Falloff;
    }
}
 
 
OutRGBA = lerp(InRGBA, NewGridValue, InDeltaTime * 5);

'Unreal > UE Feature' 카테고리의 다른 글

Projectile & Spline  (0) 2024.05.17
AI  (0) 2024.05.17
Texture  (0) 2024.05.17
Modeling  (0) 2024.05.17
Physics  (0) 2024.05.16

+ Recent posts