Animation은 오직 하나의 애니메이션만 담을 수 있다면, 

Montage는 여러 Animation을 하나의 애셋으로 합칠 수도 있고, Montage 앞에 선행 Animation을 붙일 수 있다.

 

또한 그 안에서 Notify를 이용해 사운드, 파티클, 루트모션 등의 추가 작업을 가할 수 있다.

그리고 이러한 작업들을 Replication 할 수 있다.

 

마지막으로 Animation은 C++이나 Blueprint에서 직접 조작이 불가능하지만, Montage는 직접 조작이 가능하다.

 

참고자료: https://docs.unrealengine.com/ko/Engine/Animation/AnimMontage/Overview/index.html

 

애니메이션 몽타주 개요

애니메이션 몽타주 애셋 작업 방식과 어디에 사용할 수 있는지에 대한 설명입니다.

docs.unrealengine.com

 

UE4에서 GC는 Object들의 Reference Graph를 만들어 참조되지 않은 Object들이 있는지 파악합니다.

Graph의 Root에는 Root Set으로 지정된 Object Set이 있고, 선언되는 모든 Object들은 이 Root Set 밑에 추가됩니다.

GC가 발동되면 Root Set부터 시작하여 Reference Tree를 순회합니다.

이 중 검색되지 않은 Object는 참조자가 없는 것으로 가정하고 제거합니다.

 

그리고 제거되지 않은 Object들은 UPROPERTY레퍼런스를 유지하거나,

포인터를 다른 언리얼 엔진 컨테이너 클래스에 저장합니다.

 

다만 Actor와 Component는 예외인데, 

Actor는 자신이 속한 Level처럼 Root Set로 다시 링크되는 Object에,

Component는 Actor 자체에 Reference가 있기 때문입니다.

Actor는 Destroy로, Component는 DestroyComponent로 삭제하거나 소유 Actor가 삭제될 때 같이 삭제됩니다.

 

그리고 이러한 GC는 프로젝트 세팅을 통해 몇가지 수정을 가할 수 있습니다.

 

참고자료: docs.unrealengine.com/ko/Programming/UnrealArchitecture/Objects/Optimizations/#%EA%B0%80%EB%B9%84%EC%A7%80%EC%BB%AC%EB%A0%89%EC%85%98

 

언리얼 오브젝트 처리

UObject 시스템의 기능에 대한 개요입니다.

docs.unrealengine.com

 

UPROPERTY는 C#의 매크로와 같이 멤버변수 앞에 선언하는 문법입니다.

이는 UE4에서 제공하는 각종 기능들의 대상이 되기 위해서는 반드시 선언되어야 합니다.

 

기본적인 역할은 URS(Unreal Reflection System)에 해당 Property가 있음을 알리는 것으로,

빌드 시 UHT(Unreal Header Tool)이 이 매크로를 감지하고 Reflection Type에 추가합니다.

 

URS에 추가된 UPROPERTY는 GC에 의해 관리가 되고,

Reflection을 통해 변수 이름이나 타입 등을 런타임 상에서 확인할 수 있습니다.

 

추가로 UPROPERTY에 지정자를 추가하여 다른 기능을 적용할 수 있습니다.

Blueprint에서 접근, 수정이 가능한다던가.

카테고리를 지정한다던가.

Replicate를 설정한다던가.

RefNotify를 지정한다던가.

 

참고자료: https://minusi.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC-UPROPERTY-Unreal-UPROPERTY

 

언리얼 UPROPERTY( Unreal UPROPERTY )

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 ) �

minusi.tistory.com

 

확실히 면접을 보고 있으니까 진행이 더딘 것 같습니다.

마음도 흔들리고 면접 준비 때문에 시간 자체를 얼마 투자 못하는 것 같습니다.

주말에 Propegate to child 옵션이 있어 이를 이용해 보았으나 여전히 Host에서 Character가 정상적이지 못했습니다.

 

다음에는 다시한번 Character의 생성자에 Initialize를 해보고,

이를 Spawn한 뒤 처음부터 다 밀고 다시 Build를 해보려 합니다.

 

솔직히 이 문제를 더 건드리고 싶지 않습니다.

결국에는 Dedicated Server로 전환할건데 Host에서 문제가 발생하는게 대수인가 싶다가도, 

앞으로 Dedicated Server만 개발한다는 보장도 없고, 이슈나 문제는 다 잡고 경험을 하는 것이 좋기도 하며,

무엇보다 Puzzle로 가면 이 문제가 다시 Trap에게 고스란히 적용될것이기에 이악물고 다시 잡고 있습니다.

 

빨리 정리가 되었으면 좋겠습니다.

문제 원인이라 파악된 것들을 거의 다 처리해봤는데 여전히 해결이 안되니 그 어떤 때보다 더 막막합니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.09.05 개발일지  (0) 2020.09.05
20.09.02 개발일지  (0) 2020.09.02
20.08.27 개발일지  (0) 2020.08.27
20.08.24 개발일지  (0) 2020.08.24
20.08.22 개발일지  (0) 2020.08.22

오늘은 자기소개서를 작성하고 저녁 약속을 갔다 와서 개발을 하지 못했습니다.

이번 주는 면접을 많이 보느라 거의 하지를 못한 것 같습니다.

어제 잠깐 될법한 것을 찾아보긴 했는데 이는 월요일에 시도해봐야 할 것 같습니다.

 

다음주도 꽤 바쁩니다.

화요일과 목요일은 면접이 있고, 수요일은 언리얼 서밋 중 게임 세션을 진행하기에 조금 집중을 못할 수도 있습니다.

그리고 면접 일정을 잡자는 연락을 회사측에서 받아서 연락을 기다리는 것이 1개 있습니다.

그 면접이 다음주 중으로 이루어진다면 6일 중 3일. 어쩌면 4일이 또 날라갈 것입니다.

 

게다가 9월부터는 다시 감량기를 가질 것이기에 운동 시간을 예전과 비슷한 수준으로 늘릴 예정입니다.

개발 시간을 내기 빠듯하지 않을까 싶습니다.

그나마 다행인건 요즘 게임을 하는데 시간을 많이 쏟지 않는다는 점인 것 같습니다.

 

지금 면접을 보고 있는 회사들이 모두 좋은 회사들인 것 같고, 또 느낌이 이 중 합격할 회사가 있을 것 같습니다.

왠지 느낌이 그럽니다.

그럼 기약 없는 깜깜이 생활과 부담감에서 벗어나 게임을 더 즐길 수 있는 상태로 되돌아가지 않을까 싶습니다.

 

좀 더 욕심을 내자면 언리얼 개발을 하는 팀으로 들어가 여가 시간에 다른 개발을 취미로 해보고 싶네요.

'개발일지' 카테고리의 다른 글

20.09.03 비개발일지  (0) 2020.09.03
20.09.01 비개발일지  (0) 2020.09.01
20.08.28 비개발일지  (0) 2020.08.28
20.08.26 비개발일지  (0) 2020.08.26
20.08.12 비개발일지  (0) 2020.08.12

면접을 보느라 코드를 보지 못했습니다.

다음주도 면접이라 어떻게 될지 모르겠습니다.

그래도 하루는 쉬는 날이 있지 않을까 싶습니다.

'개발일지' 카테고리의 다른 글

20.09.01 비개발일지  (0) 2020.09.01
20.08.29 비개발일지  (0) 2020.08.29
20.08.26 비개발일지  (0) 2020.08.26
20.08.12 비개발일지  (0) 2020.08.12
20.08.11 비개발일지  (0) 2020.08.11
malloc/free new/delete
메모리가 heap에 할당된다. 메모리가 Free Store에 할당된다.
결과가 타입 지정 없이 void*로 반환된다. 결과가 명확한 타입이 지정된다.
할당에 실패하면 NULL을 반환한다. 할당에 실패하면 error를 throw 한다.
메모리 할당 할 때 사이즈를 지정해 줘야 한다. 컴파일러가 메모리 크기를 계산해서 잡아준다.
더 큰 메모리로 재할당 하는 과정이 비교적 간단하다. 더 큰 메모리로 재할당 하는 과정이 비교적 귀찮다.
기본적으로 함수이다. 기본적으로 연산자이다.

 

malloc/free는 메모리를 할당하는 함수로, 할당 시 메모리가 heap 영역에 바로 할당이 된다.

또한 type과 관계 없이 반환하는 타입은 반드시 void*이며 실패 시 NULL을 반환한다.

메모리를 할당할 때에는 반드시 객체 크기를 Byte 단위로 지정을 해줘야 한다.

그리고 생성된 메모리 영역은 쓰레기값으로 차있기 때문에 초기화 과정이 따로 요구된다.

 

new/delete는 연산자이기 때문에 사용자가 overloading이 가능하다.

메모리를 할당 할 때 크기를 컴파일러가 계산해주기 때문에 따로 지정 할 필요가 없고,

연산 결과가 명확한 타입으로 반환되며 실패 시 Error를 throw 하기 때문에 에러 처리가 필요하다.

메모리를 할당할 때 free store에 할당이 되며, 할당 시 생성자를 호출하기 때문에 값이 초기화가 되어 있다.

 

new에서 생성자는 구현된 생성자에 따라 방법이 다르다.

아무것도 없다면 default 생성자를 호출한다던가, 

중괄호로 묶여 있다면 Initialize list를 호출한다던가.

 

대략적으로 짚어 보았는데 이렇게 대답을 하면 Free Store가 무엇인지 물어볼 것이다.

Free Store는 C에서의 Heap영역이라 보면 된다.

단 이는 개념적인 부분이고 실제로 메모리 영역이 나뉘어져 있는 것은 아니다.

다만 C++에서는 Heap보다는 Free Store라는 용어를 사용하는 것이 더 바람직하다는 얘기도 있다.

 

자료 출처

https://jacking75.github.io/Cpp_memory_region/

 

C++ - 메모리 영역 - jacking75

메모리 영역에 대해서 5 종류의 메모리 영역 C++ 에서는 다른 특성을 갖는 5 종류의 메모리 영역이 존재한다. (※ 단 c++ 규격에는 스택이나 힙은 명시 하지 않고 Free-Store는 명시 하고 있다) Const Data

jacking75.github.io

https://stackoverflow.com/questions/1350819/c-free-store-vs-heap

 

C++, Free-Store vs Heap

Dynamic allocations with new/delete are said to take place on the free-store,while malloc/free operations use the heap. I'd like to know if there is an actual difference, in practice. Do compilers...

stackoverflow.com

 

Virtual 키워드는 C++에서 Override 할 시 반드시 붙여줘야 하는 키워드다.

그리고 이를 붙여줘야 하는 이유를 묻는다면 입문자들은 "이걸 붙어야 Override가 되요"라고 답할 것이다.

 

여기서 C++을 좀 더 배운 사람이라면 이렇게 답할 것이다.

"C++의 virtual 키워드가 붙은 함수들은 vtable에서 함수의 주소값이 관리가 된다.

이후 하위 클래스에서 override를 하면 vtable의 주소값이 변경이 된다.

이를 통해 하위 클래스의 instance에서 override를 한 함수를 호출하면,

vtable에서 함수를 찾는 과정에서 상위 클래스의 함수가 아닌 하위 클래스의 함수를 받아오게 된다."

라고 답할 것이다.

 

하지만 virtual 키워드가 붙는 경우가 두가지가 더 있다.

하나는 생성자, 다른 하나는 소멸자이다.

그렇다면 생성자(Constructor)와 소멸자(Destructor)에서 virtual 키워드는 어떻게 동작할까?

 

이 두가지 경우, virtual 키워드가 붙어 있으면 vtable에서 상위 클래스의 생성자나 소멸자를 검색한다.

그리고 검색된 결과를 현재의 생성자/소멸자 코드 앞에 붙여준다.

이는 재귀적으로 발생하여, 최상위 클래스의 생성자/소멸자부터 순차적으로 호출이 된다.

 

이렇게 모든 생성자/소멸자들이 호출이 되면, 컴파일러는 다시 한번 코드를 자동 생성한다.

바로 멤버를 자동으로 생성/소멸하는 과정이다.

 

정리를 하자면, 

"Virtual 키워드가 붙은 함수는 물론이고 생성자, 소멸자들은 vtable에서 어떤 것을 사용 할지 관리가 된다.

이 중 함수는 Instance에 따라 하위 클래스의 함수를 호출하고, 

생성자와 소멸자는 상위 클래스의 것을 먼저 호출한 뒤 자신의 것을 호출하며,

마지막으로 멤버 생성/소멸 과정을 거친다.

때문에 Override 할 때 virtual 키워드를 사용해야 한다."

 

정도가 될 것 같다.

 

참고자료: https://stackoverflow.com/questions/7750280/how-does-virtual-destructor-work-in-c

 

How Does Virtual Destructor work in C++

I will type an example : class A { public: virtual ~A(){} }; class B: public A { public: ~B() { } }; int main(void) { A * a = new B; delete a; return 0; } Now in Above Example , destructors ...

stackoverflow.com

'메모장 > 기술면접' 카테고리의 다른 글

UE4 UPROPERTY란 무엇인가?  (0) 2020.09.01
C++ malloc/free와 new/delete의 차이점  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Actor의 Role과 Remote Role  (0) 2020.08.10
UE4 Replicate 방식간 차이  (0) 2020.08.10

오늘은 우선 ISpawnable이란 Interface를 만들어 적용했습니다.

기존에는 IObjectActivity에 추가했는데 이렇게 되면 모든 Object나 Character들이

비슷한 기능과 이름의 함수와 공존하게 됩니다. 

그래서 새로운 Interface를 적용했습니다.

 

이를 통해 기능을 분리 했으나 여전히 Host에서 Character의 Visibility는 정상화 되지 않았습니다.

 

그 다음에는 Character의 하위 클래스를 두고, 이 하위 클래스의 생성자 내부에서 Visibility를 초기화 했습니다.

하지만 여전히 작동하지 않았습니다.

 

생각해둔 방법을 모두 사용해서 이 뒤로는 고민을 더 해야 할 것 같습니다.

일반 Object와 Character의 차이가 뭔지 좀 더 알아보려 합니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.09.02 개발일지  (0) 2020.09.02
20.08.21 개발일지  (0) 2020.08.31
20.08.24 개발일지  (0) 2020.08.24
20.08.22 개발일지  (0) 2020.08.22
20.08.20 개발일지  (0) 2020.08.20

오늘은 오후에 면접이 있어서 개발을 하지 못했습니다.

 

내일은 오전 면접이라 오후에 부지런히 움직이면 개발이 가능할 것 같습니다.

 

잠깐 코드를 보았는데 Spawned Character와 Spawned Projectile의 차이는

생성자 단위에서 Inactive가 되느냐 아니냐였습니다.

 

일단 Trap의 생성자 단위에서 이 부분을 처리해봐야겠지만,

만약 안된다면 Character의 하위 클래스를 하나 만들어야 할 것 같습니다.

'개발일지' 카테고리의 다른 글

20.08.29 비개발일지  (0) 2020.08.29
20.08.28 비개발일지  (0) 2020.08.28
20.08.12 비개발일지  (0) 2020.08.12
20.08.11 비개발일지  (0) 2020.08.11
20.07.23 비개발일지  (0) 2020.07.23

+ Recent posts