반응형

UE4 에서의 대미지


https://www.unrealengine.com/ko/blog/damage-in-ue4


누군가에게 상처를 입혀야 할 경우에는 상대방의 복수를 두려워할 필요가 없을 정도로 철저하게 짓밟아야 한다."
-니콜로 마키아벨리

"Damage" (대미지)란 게임에서 자주 쓰이는 개념으로, UE4 게임 프레임워크에 포함시킨 대미지 함수성에 대해 간단한 입문서를 제공해 드리고자 합니다.

대미지는 베이스 Actor 클래스에 지원되는 기능이므로, 폭넓게 사용 가능합니다. 이 시스템은 자주 쓰이는 함수성을 쉽게 접근할 수 있도록 해 주어 빠른 결과 확인이 가능하면서도, 확장이 가능하여 필요에 따른 대미지 모델 커스터마이징이 가능합니다. 또한 대미지에 어떻게 반응할지 가정을 해야 하는 상황을 피할 수 있도록 노력을 기울였습니다. 즉 엔진에서 'hit point' (생명력)이나 'death' (사망)같은 개념을 찾을 수 없게 되었습니다. 이는 특정 게임에 국한된 개념이기에, 일반화시키려 해 봐야 결국 득보다 실이 많았기 때문입니다.

기본적인 대미지 관련 개념

대미지에 대해 이야기할 때 자주 사용되는 개념을 몇 가지 간단히 다루고자 합니다.

DAMAGETYPE

이름에서 알 수 있듯이, DamageType (대미지 타입)은 대미지의 근원지와 무관하게 "유형"을 설명하는 데 사용되는 오브젝트입니다. 대미지 근원지가 많고 그 사이에 공통된 함수성이 있었으면 하는 경우 매우 유용한 개념입니다.

이를 쉽게 설명하는 예로 화염 대미지를 들 수 있습니다. 화염 대미지를 입을 때마다 "앗뜨거" 라 외치면서 근처의 물가로 달려가도록 한다고 칩시다. 이러한 행위에 대한 코드를 플레이어를 태울 수 있는 모든 액터( 혹은 탈 수 있는 모든 액터 유형)에 복제하기 보다는, 화염에 대한 대미지 유형(UDamageTypeFire)을 정의한 다음, 거기에 일정 유형의HandleDamagedCharacter() 함수를 주고, TakeDamage() 호출 체인에서 적절히 호출해 주면 됩니다.

INSTIGATOR

Instigator (인스티게이터)는 누가 대미지를 입혔는가, 전형적으로 PlayerController 또는 AIController 가 됩니다. 화염 대미지의 경우, 플레이어 또는 불을 지른 AI 가 될 것입니다.

DAMAGECAUSER

"causer" (유발자)는 보통 무엇이 대미지를 입혔는가, 이를테면 방금 걸어지나간 ACampFire (캠프 파이어) 액터같은 것입니다.

C++ 에서의 대미지

먼저 네이티브 코드에서의 대미지 지원을 살펴봅시다.

이 경우, 액터에 대미지를 입히는 것은 간단합니다. 그냥 거기서 TakeDamage() 를 호출해 주면 됩니다.

virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, class AActor* DamageCauser);

마찬가지로 대미지에 반응하기 위해, 받는 액터에서 TakeDamage() 를 덮어써서 별도의 처리 코드를 삽입해 주기만 하면 됩니다. 쉽지요!

TakeDamage() 호출시 DamageEvent 를 파라미터로 받는 것이 보일 것입니다. 이 FDamageEvent 데이터 구조체에는 반응 코드가 적절히 대응할 수 있도록 대미지를 입히는 이벤트의 구체적인 상황에 대한 데이터가 들어갑니다. UE4 에는 세 가지 형태의 대미지 이벤트가 내장되어 있습니다.

FPOINTDAMAGEEVENT

"요 방향에서 맞았더니 얼굴 딱 이 부분이 따갑네요."

점 대미지 이벤트는 총알이나 펀치처럼 피해자의 특정 지점에 가해진 대미지를 모델링하는 것입니다. 맞은 방향, 표면 충격을 나타내는 FHitResult 도 들어있습니다.

FRADIALDAMAGEEVENT

"저쪽의 대폭발때문에 온몸 왼쪽이 쑤시네요."

방사상 대미지 이벤트는 한 근원지에서의 방사상 대미지를 모델링한 것으로, 폭발이 명확한 예제가 됩니다. 폭발의 진원지, 공간을 통한 대미지 감쇠를 나타내는 데이터, 영향받은 컴포넌트 목록이 들어있습니다.

FDAMAGEEVENT

"아야."

가장 일반적인 대미지 모델로, DamageTypeClass 옵션만 들어있습니다.

내장된 이벤트 유형 중 필요한 것이 없는 경우, FDamageEvent 에서 구조체를 파생시킨 다음 필요한 데이터를 저장하면 됩니다.

블루프린트에서의 대미지

블루프린트에서의 대미지 처리도, 대미지 적용과 반응이 미이 이벤트 유형으로 나뉘어 있다는 점만 빼고는 비슷합니다.ApplyDamageApplyPointDamageApplyRadialDamage 와 같이 대미지를 입히기 위해 전역에서 접근 가능한 노드가 있습니다. 대미지 이벤트에 대한 반응으로는, 액터 클래스와 레벨 내 액터 인스턴스 양쪽에 대한 유사 "took damage" 이벤트 시리즈가 있습니다.

프로젝트에 커스텀 대미지 이벤트를 정의한 경우, 블루프린트에 사용할 비슷한 함수와 델리게이트 세트를 노출시키는 것이 좋을 것입니다.

즐거운 대미지 작업 되시길! 대미지 관련 요청이나 일화가 있으신 분들께서는 포럼(영문)에, 한글 사용자 분들은 네이버 카페에  왕림해 주시기 바랍니다!




 일시: May 22, 2014 | 




https://docs.unrealengine.com/latest/KOR/Engine/Blueprints/UserGuide/Events/index.html



vent Any Damage

이 블루프린트 이벤트 노드는 서버에서만 실행됩니다. 싱글 플레이어 게임의 경우 로컬 클라이언트가 서버로 간주됩니다.

AnyDamage.png

일반적인 대미지가 전해지면 전달되는 이벤트입니다. 잠수나 환경으로 인한 대미지처럼, 꼭 포인트 또는 래디얼 대미지일 필요는 없습니다.

항목설명

출력 핀

DamageFloat - 액터에 전달되는 대미지 양입니다.
Damage TypeObject 'DamageType' - 입히는 대미지에 대한 부가 데이터가 들어있는 오브젝트입니다.
Instigated ByActor - 대미지를 입힌 액터입니다. 총을 발사했거나 수류탄을 던져 대미지를 입힌 액터가 됩니다.
Damage CauserActor - 피해를 유발한 액터입니다. 총알 또는 폭발 같은 것이 됩니다.

여기서, 액터에 전해지는 대미지는 물에서 오고 있으며, 생명력을 깎으면서 화면에 경고를 출력합니다.


반응형
반응형


안녕하세요. 


카페에는 익숙하지 않아서 눈팅만 하다가 드디어 글을 제대로 써보네요.
언리얼 엔진 C++ 프로그래밍에 대한 자료가 너무 없어서 한번 가볍게 만들어보았습니다.
사실 저도 공부할 게 많은 사람인데, 언리얼 엔진을 만족할때까지 공부하다가는 지구가 멸망할 것 같아,
안되겠다 싶어 처음 입문하는 분들을 위해 부족한 능력임에도 한번 정리해보았습니다. 
이 자료는 제가 운영하는 페이스북 언리얼4 개발자 커뮤니티에 올릴 용도로 만들다보니 이미지로만 되어 있습니다.
검색이 안되도 양해해주시고요, 
대상은 C++ 개념을 어느정도 아는 분들에게 언리얼 엔진 C++의 특이한 점들만 정리해보았습니다.
모든 것을 다 깊게 들어가 주절 주절 다 설명하면 처음 시작하는 분들 대상으로 흥미를 잃어버릴 수 있다는 생각에, 주관적으로 판단해 간략한 핵심만 정리했습니다. 
능력자분들은 한번 살펴보시고, 틀린점이나 개선점을 제안주시면 감사하겠습니다.
자료는 3-4일에 한 번씩 업데이트할 계획입니다. 














출처 : 

http://cafe.naver.com/unrealenginekr/7633



반응형
반응형

액터를 인게임 에서 보이게 할것인지 안보이게 할것인지를 bool 변수로 제어


AActor::SetActorHiddenInGame

Syntax

UFUNCTION(BlueprintCallable, Category="Rendering",
          Meta=(DisplayName="Set Actor Hidden In Game", Keywords="Visible Hidden Show Hide"))
virtual void SetActorHiddenInGame
(
    bool bNewHidden
)

Remarks

Sets the actor to be hidden in the game

Parameters

Parameter

Description

bNewHidden

Whether or not to hide the actor and all its components

References

Module

Engine

Header

Runtime/Engine/Classes/GameFramework/Actor.h

Source

Runtime/Engine/Private/Actor.cpp





printstring 은 해당 리턴 값을 문자로 화면에 출력한다


반응형
반응형

1.3 - 노멀 임포트

CE_1_3_001.png

언리얼 엔진 4 는 FBX 파일에서 노멀만 받을 수도, 노멀과 탄젠트를 받을 수도 있고, 그냥 노멀과 탄젠트를 자체적으로 재계산할 수도 있습니다. 위 그림은 왼쪽 에서 계산된 노멀 의 차이점을, 오른쪽 에서 임포트된 노멀과 탄젠트 의 차이점을 나타내 줍니다:

FBX 파일 임포트시, 이 기능은 임포트 대화창 상단 부근 메시 아래에서 찾을 수 있습니다. 이 풀다운에는 세 가지 옵션이 있습니다: ImportPulldown.png

옵션설명
Compute Normals노멀 계산 - 엔진에서 노멀과 탄젠트를 계산합니다. 그무딩 그룹과 노멀 정보는 FBX 정보에서 버립니다.
Import Normals노멀 임포트 - FBX 파일에서 노멀을 임포트하며, 탄젠트는 엔진에서 계산합니다.
Import Normals and Tangents노멀과 탄젠트 임포트 - 노멀과 탄젠트를 FBX 파일에서 임포트하며, 엔진에서는 아무것도 계산하지 않습니다.


https://docs.unrealengine.com/latest/KOR/Resources/ContentExamples/ImportOptions/1_3/index.html


반응형
반응형

https://docs.unrealengine.com/latest/KOR/Engine/Content/Browser/UserGuide/Migrate/index.html

애셋 이주하기

콘텐츠 브라우저에는 Migrate Tool (이주 툴)이라는 것이 있어, 의존된 애셋을 포함해서 애셋들을 한 프로젝트에서 다른 프로젝트로 복사할 수 있습니다. 예를 들어 머티리얼을 하나 이주시킨다면, 해당 머티리얼을 정의하는 텍스처 애셋들도 자동으로 같이 복사됩니다. 프로젝트를 합치거나 나눠야 할 필요가 있을 때, 테스트 환경에서 제작 프로젝트로 전환할 때 유용한 툴입니다.

사용법

이주 툴을 사용하려면:

  1. 콘텐츠 브라우저에서 이주시키고자 하는 애셋을 선택합니다.

    SelectedAssetsForMigration.png

  2. 선택된 애셋에 우클릭하여 뜨는 맥락 메뉴에서 애셋 액션 - 이주... 를 선택합니다.

    MigrateContextMenu.pngMigrateContextMenu2.png

  3. 애셋 보고 대화창이 떠, 이주되는 애셋과 종속성이 전부 표시됩니다. 확인하고 Ok 를 클릭합니다.

    AssetReport.png

  4. 다른 언리얼 엔진 프로젝트에 적당한 콘텐츠 폴더를 선택합니다. 이주 대상 위치가 됩니다.

    ChooseFolderForMigration.png

  5. 이주가 성공하면 확인창을 통해 대상 폴더에 어떠한 애셋들이 복사되었는지 알 수 있습니다.

    AssetsMigrated.png

게임 콘텐츠 폴더 이외의 곳에 이주를 시도하면, 다음과 같은 메시지가 뜹니다:

assetMigrationWarning.png

이 경우, 그냥 위치를 확인한 다음  또는 아니오 를 클릭하면 됩니다.


반응형
반응형

Lerp (linearInterpolate)

A 와 B 두개에 노드를 연결 하는데 alpha 가 0 이면 A 색상을 alpha 가 1 이면 B색상을 보간하여 리턴한다, alpha 에 alpha 이미지를 연결 할수도 있음







https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Float/Lerp/index.html

Lerp

Linearly interpolates between A and B based on Alpha (100% of A when Alpha=0 and 100% of B when Alpha=1)

Target is Kismet Math Library

Lerp
A
0.0
B
0.0
Alpha
0.0
Return Value

Inputs

A
Float
B
Float
Alpha
Float

Outputs

Return Value
Float


반응형

+ Recent posts