목록Categories (1104)
KoreanFoodie's Study

Does Implement Interface 기능으로 데미지, 인터랙션 구현하기 총을 쏘았을때, 맞은 대상이 Enemy 이면 데미지를 전달하고 싶거나, 만약 상호작용 가능한 오브젝트인 경우 상호작용을 하고 싶다고 가정하자. 해당 기능을 어떻게 구현하면 좋을까? 물체의 경우, 각 물체에 트리거를 심는 경우도 생각해 볼 수 있겠지만, 배치되는 모든 오브젝트마다 트리거를 따로 설정해야 된다고 생각하면 너무 끔찍할 것이다. 데미지의 경우, 총에 맞은 액터가 데미지를 받을 수 있는지 없는지를 어떻게 판별하면 좋을까? 사실 Enemy 말고도 부술 수 있는 오브젝트도 마찬가지로 데미지를 받아야 할텐데, 각 클래스마다 데미지를 받는지 안 받는지를 설정하는 것은 매우 귀찮은 일이다. 언리얼에서는 Does Implemen..

1인칭 시점 구현하기 일반적으로 언리얼을 처음 배울때는 다들 3인칭으로 시작하는데, 3인칭의 FPS 의 경우 시점과 동작이 함께 움직이지 않는 특징이 있다. 따라서, 시점은 바닥을 바라보는데 팔은 총을 든 상태로 앞을 향하고 있는 부자연스러운 상황이 연출된다. 이를 해결하는 방법은 간단한데, 바로 FirstPersonBP (시작용 컨텐츠) 처럼, 기본으로 주어지는 Skeletal Mesh 를 Clear 하고, 카메라의 자식(Children)에 우리가 원하는 Skeletal Mesh 를 추가하는 것이다. 알맞은 Skeletal Mesh 를 연결한 다음, 미리 만들어 놓은 Animation Blueprint 를 선택만 해주면, 애니메이션도 잘 재생될 것이다.

UFUNCTION 과 FORCEINLINE 일반적으로, UFUNCTION 과 FORCEINLINE 은 호환되지 않는다. 우리가 UFUNCTION 을 붙이는 이유는 대개 블루프린트에서 해당 함수를 호출할 필요가 있기 때문인데, C++ 에서 작성된 코드를 BP 에서 읽어오려면, FORCEINLINE 을 붙이지 않아야 한다(Function call 의 형태이어야 함). 따라서 아래와 같은 함수는 블루프린트에서 인식되지 않는다. UFUNCTION(BlueprintCallable) FORCEINLINE void Foo() {}

GoF 의 디자인 패턴과 강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다. Dependency Injection Principle (의존성 역전 원리) 부모 - 자식 관계를 설정하는 Relationship 클래스와 관계를 검색하는 Research 클래스가 있다고 가정해보자. 다음과 같이 코드를 짠다면 어떨까? #include #include #include #include using namespace std; // A. High-level modules should not depend on low-level modules. // Both should depend on abstractions. // B. Abstractions should not depend on details. // Deta..

GoF 의 디자인 패턴과 강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다. Interface Segregation Principle (인터페이스 분리 원칙) 인터페이스 분리 원칙, ISP 는 각 인터페이스가 사용하지 않는 메서드만 지원해야 함을 의미한다. 예를 들어, 프린트와 스캐너 기능을 하는 기계를 인터페이스로 구현했다고 하자. struct IMachine { virtual void print(Document& doc) = 0; virtual void fax(Document& doc) = 0; virtual void scan(Document& doc) = 0; }; struct MFP : IMachine { void print(Document& doc) override; void fax(..

GoF 의 디자인 패턴과 강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다. Liskov Substitution Principle (리스코프 치환 원칙) 리스코프 치환 원칙 (줄여서 LSP) 란, 기반 클래스가 있고 파생 클래스가 있을때, 기반 클래스가 들어가는 자리에 파생 클래스가 들어갈 수 있어야 하며, 이때 기반 클래스를 넣었을때의 의도대로 코드가 잘 동작해야 함을 의미한다. 예를 들어, Rectangle 클래스를 기반 클래스로 한 Square 클래스를 보자. process 라는 함수에서 높이를 10으로 만든 후, 넓이를 반환하고 있다. #include class Rectangle { protected: int width, height; public: Rectangle(const int ..

GoF 의 디자인 패턴과 강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다. Open-Closed Principle (개방-폐쇄 원칙) OCP 는 확장에는 열려있고, 수정에는 폐쇄적인 디자인 원칙을 의미한다. (Open for extension, Closed for modification) 예를 들어, 다음과 같은 구조의 Product 를 분류해야 하는 코드를 짠다고 가정해 보자. 색깔과 사이즈 등의 기준으로 제품을 분류할 것이다. struct Product { string name; Color color; Size size; }; 위 경우, enum class 와 functor 를 사용하면 다음과 같이 코드를 짤 수 있을 것이다. #include #include #include using n..

GoF 의 디자인 패턴과 강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다. Single Responsibility Principle (단일 책임 원칙) Single Responsibility Principle, 줄여서 SRP 는 단일 책임 원칙으로, 모든 클래스가 하나의 책임을 가지며, 클래스가 그 책임을 완전히 캡슐화해야 함을 의미한다. 아래 코드를 보자. #include #include #include #include #include using namespace std; struct Journal { string title; vector entries; explicit Journal(const string& title) : title{title} { } void add(const stri..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! std::optional (C++17 이상 - ) 예를 들어서 어떠한 map 에서 주어진 키에 대응하는 값이 있는지 확인하는 함수를 만들고 싶다고 해보자. std::optional 을 사용하면 이를 깔끔하게 구현할 수 있다! #include #include #include #include std::optional GetValueFromMap(const std::map& m, int key) { auto itr = m.find(key); if (itr != m.end()) { return itr->second; } // nullopt 는 에 정의된 객체로 비어있는 optional 을 ..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 파일을 찾아보자 파일 시스템 라이브러리는 파일 데이터 의 입출력을 담당하는 파일 입출력 라이브러리 () 과는 다르다. 의 경우, 파일 하나가 주어지면 해당 파일의 데이터를 읽어내는 역할을 하지만, 그 외에 파일에 관한 정보 (파일 이름, 위치, 등등) 에 관한 데이터를 수정할 수 는 없다. 반면에 파일 시스템 라이브러리의 경우, 파일에 관한 정보 (파일 메타데이타)에 대한 접근을 도와주는 역할을 수행하며, 파일 자체를 읽는 일은 수행하지 않는다. 쉽게 말해서 하드 디스크 어딘가에 있는 a.txt 라는 파일을 찾고 싶다면 filesystem 라이브러리를 사용하게 되고, 해당 파일을 찾..