Skeletal Mesh와 Static Mesh를 Output으로 Return하려할 때는 반드시 Component를 Primitive Component로 설정해야한다. USkeletalMeshComponent와 UStaticMeshComponent가 모두 UPrimitiveComponent를 상속받은 SubClass Component기 때문이다.
유니티든 언리얼이든 기본 애니메이션에 추가 애니메이션을 사용할 때 Blend를 사용하지 않으면 자연스럽지 못한 출력을 얻게 된다. 예를 들어, 플레이어가 움직이면서 동시에 무기를 꺼낸다면 하체의 다리는 계속 걷고 있어야하며, 상체는 칼을 꺼내고 있어야한다. 각각의 애니메이션은 Walk / DrawWeapon으로 분리되어있지만 동시에 실행돼야하므로 Blend를 사용하여 상하체가 동시에 두 개의 애니메이션을 사용하도록 설정해야한다. 언리얼 엔진5에서, 플레이어가 이동하면서 무기를 꺼낼 때/넣을 때 Animation Blend를 사용하지 않고 Main States를 Default Slot 그대로 출력하게 된다면, 마찬가지로 무기꺼내는 애니메이션을 취하면서 움직이기에 매우 어색한 연출을 얻게 된다. 언리얼에서는..
IDE : Visual Studio Code Editor : UE 5.3 Hot Reload (핫 리로드) 핫 리로드 방식은, 기존 개발자에게 익숙한 방식이며 IDE에서 빌드하면 Editor에 바로 적용되는 기능이다. 혹은, Editor에서 하단 모양의 버튼을 클릭해서 컴파일할 수도 있다. IDE에서 수정한 내용을 Editor에서 컴파일하면 수정이 된다. Live Coding (라이브코딩) 라이브 코딩은 Editor, 즉, 엔진이 실행되고 있는 동안 C++ 코드를 리빌드하고 바이너리를 패치하는 시스템이다. IDE에서 수정한 내용을 빌드하려면 Editor를 반드시 종료해야하며, 종료를 하지 않고 Build를 하면 "Unable to build while Live Coding is active. Exit t..
OOP로 개발을 하다보면 캡슐화가 매우 중요하다. 특히 게임개발을 하다보면 데이터 하나하나가 매우 중요한데 이런 데이터를 캡슐화하지 않게 되면 치명적인 오류를 발생시킬 수도 있다. (게임의 의도대로 진행이 안된다던지 등의 이슈) 그래서 한 클래스 내부에서 데이터를 Private 으로 설정하여 제한된 접근을 생성하며 캡슐화를 한다. 하지만 게임 로직 상 값이 수정돼야할 상황이 종종 발생하는데 이 때, Getter/Setter를 이용하여 좀 더 안전하게 값을 수정한다. protected static _language = Application.systemLanguage; // getter setter public static get Language() { if (this._language === 23) { r..
UE5를 학습하던 도중 캡슐화를 하면서 Pure 체크박스에 체크를 하여 순수함수로 만들어줬었는데, 확실하게 순수함수에 대해 짚고 넘어가고자 학습하게 되었다. 순수 함수를 검색하면 아래와 같이 나온다. - 같은 입력를 넣으면, 항상 같은 출력이 나오는 함수 - 사이드이펙트(부작용)이 없는 함수 본격적으로 학습하기 전에, 함수에 대한 기본개념을 다시 숙지하자면, 함수는 아래와 같은 목적으로 사용된다. - Mapping : 주어진 입력을 원하는 출력으로 매핑해주는 기능 - Procedures : 함수는 순차적으로 처리하도록 실행될 때가 있는데, 이를 절차형 프로그래밍 (PP) 라고 부른다. - I/O : 다른 시스템과 소통하기 위해 존재하는 함수도 있다. 만약에 여러 개의 함수가 하나의 데이터를 동시에 수정하..
객체 지향 설계 5원칙 (SOILD 원칙) SRP (Single Responsibility Principle) - 모든 클래스는 각각 하나의 책임만 가져야한다. 클래스는 그 책임을 완전히 캡슐화해야함을 말한다. (캡슐화 : 객체지향프로그래밍에서의 중요한 특징 중 하나로, 연관된 데이터와 함수를 논리적으로 묶어놓은 것이며, 데이터를 보호하기 위해 다른 객체의 접근을 제한하는 접근 제한 수식자의 기능을 제공한다. OCP (Open Closed Principle) - 확장에는 열려있고 수정에는 닫혀있는, 기존의 코드를 변경하지 않으면서(Closed), 기능을 추가할 수 있도록(Open) 설계까 되어야한다는 원칙을 말한다. LSP (Liskov Substitution Principle) - 자식 클래스는 언제나..
객체 지향 설계 원칙 총정리 응집도를 높인다 1-1. 단일 책임 원칙 하나의 클래스는 하나의 기능만 가져야 한다. 그렇지 않다면 클래스를 분리한다 분리된 클래스끼리 위계 관계가 있다면 있다면 상속한다 1-2. 인터페이스 분리 원칙 특정 클라이언트는 클래스의 특정 기능만을 사용해야 한다 따라서 특정 클라이언트를 위한 특정 인터페이스를 정의한다 그리고 특정 클라이언트는 특정 인터페이스로 객체를 선언한다 객체 생성시에 구체 클래스를 쓰거나 추상 클래스를 쓴다 결합도를 낮춘다 2-1은 2-2와 2-3의 조합 즉, 추상성과 다형성으로 성취될 수 있다 2-1. 개방 폐쇄의 원칙 변경을 최소화하고 동시에 확장이 가능한 설계를 고려한다 이를 위해서 추상성과 다형성을 활용해야 한다 이를 통해서 결합도를 낮춘다 2-2. ..
핵심 디자인 패턴 6가지 싱글톤 패턴 전략 패턴 팩토리 패턴 어댑터 패턴 프록시 패턴 옵저버 패턴 싱글톤 패턴 프로그램 실행 중에 최대 하나만 있어야 할 경우나 전역적으로 접근이 가능한 개체여야 할 경우, 어떤 클래스에서 만들 수 있는 인스턴스 수를 하나로 제한하기 위해서 사용한다. static 변수를 직접 쓰는 대신 대신 굳이 싱글톤 패턴을 쓰는 이유는 static 변수는 전역 변수에 가깝지만 싱글톤 객체는 객체지향 패러다임에 맞기 때문 싱글톤은 객체이므로 생성자로 생성 시점을 제어할 수 없다. 전략 패턴 간단히 말해서 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다. 예를 들어, 기차( Tra..
INTRO Unity XR Interaction Toolkit을 공부하던 중 LeftHand Direct Interactor에 Kill Log나 HP 등을 표시할 UI를 부착해보기로 했습니다. 이전 제페토 월드를 제작할 때 말풍선에 사용했던 코드를 비교하면서 새로운 방법과 기존 방법과의 차이를 비교해보려고 합니다. CONTENT 미리 Prefab화 해둔 UI Offset를 Hierachy에 Instantiate하고 LeftHand Direct Interactor의 Child로 넣어주었습니다. 중요한 것은 UI의 Rotation이 플레이어의 카메라 Rotation에 맞춰 실시간으로 변해야 한다는 것이죠 제페토 프로젝트를 진행하면서 NPC의 말풍선에도 똑같은 기능을 적용시켜야 했으며, 그 당시에는 LookA..
행 : 속성 열 : 대미지/디버프 독 행 - 지속 대미지(중독), 전이 -> 확장 : 부식/방사능/화학무기 불 행 - 지속 대미지(화상), 즉시 대미지 -> 확장 : 폭발 물 행 - 즉시 대미지, 지속 대미지(동상), 슬로우(각종 속도 감소, 공격속도/이동속도 등), 익사 -> 확장 : 물 빛 행 - 즉시 대미지, 시야 제한(실명), 스턴 -> 확장 : 번개 대지 행 - 즉시 대미지, 스턴, 슬로우, 밀쳐냄 -> 확장 : 돌, 기계 바람 행 - 즉시 대미지, 스턴, 무작위 이동, 시야 제한(실명과 유사) -> 확장 : 폭풍 어둠 행 - 즉시 대미지, 지속 대미지(ex. 던파 소울브링어 스킬), 시야 제한 자연 행 - 치유, 즉시 대미지, 지속 대미지(ex. 덩굴)