본문 바로가기

게임프로그래밍

(158)
[언리얼 실습] 47. C++ 유저 위젯 클래스 만들어서 블루프린트 변수와 C++ 변수 바인딩하기 목차C++ 헬스바 위젯의 부모 클래스 만들기부모 클래스 바꾸기1. C++ 헬시바 위젯의 부모 클래스 만들기  현재 헬스바 위젯의 부모 클래스가 User Widget으로 되어있는데 이것은 우리가 만든 것이 아닌 언리얼에서 기본으로 제공해주는 클래스이다. 클래스의 기능들을 더 추가하고 싶고 그러기 위해서 유저 위젯 클래스를 직접 만들어보려고 한다.  유저위젯을 부모 클래스로 하여 새로운 클래스를 만들어보도록 하자. 이제 이 클래스에서 프로그래스바(헬스바)의 진행도를 퍼센트에 맞게 변경할 것이다. 헬스바를 이렇게 변수로 설정할 수 있다. 즉 이 변수를 C++단에서 쓸 수 있으면 진행도를 조절할 수 있게 된다는 뜻이다. 이제 블루프린트의 변수와 C++변수를 링크해보자. UPROPERTY() class UProg..
[언리얼 실습] 46. 위젯 컴포넌트 만들기 목차위젯 컴포넌트 만들기헬스바 만들기헬스바 적용하기1. 위젯 컴포넌트 만들기 위젯 컴포넌트를 만들어서 체력바를 표시할 것이다.  컨텐츠 드로워에서 Widget Blueprint를 만들어주자.  부모 클래스로는 언리얼에서 제공해주는 User Widget을 사용할 것인데 추후 커스텀 위젯도 만들 것이다.  위젯 블루프린트로 들어가면 다른 블루프린트와 사뭇 다른 화면이 나오게 된다.2. 헬스바 만들기 이제 이곳에서 그림을 그려 헬스바를 만들어보려고 한다. 그림을 그리기 위해서는 캔버스가 필요하다.  캔버스 패널을 추가해주자. 캔버스 패널을 드래그 해서 이렇게 드롭다운 하면 된다.  이러면 이렇게 캔버스가 나오고 이는 우리가 보고 있는 화면과 동일하다.  이제 진행바를 추가해주자. 그리고 위치를 화면 정중앙으로..
[언리얼 실습] 45. 커스텀 컴포넌트 만들기 목차 커스텀 컴포넌트를 만드는 이유 커스텀 컴포넌트 만들기1. 커스텀 컴포넌트를 만드는 이유 커스텀 컴포넌트가 왜 필요할까? 플레이어든 적이든 클래스 마다 필요한 속성들이 있을 것이다. 그리고 그러한 속성 중 모든 클래스에게 필요한 속성들도 있을 것이다. 체력 속성이 대표적이며 이러한 기능들을 각각의 클래스마다 따로 만들면 비효율적이고 객체지향프로그래밍 사고에도 맞지 않는다. 그렇기 때문에 커스텀 컴포넌트를 추가하여 필요한 클래스에서 Add 하여 기능을 사용하도록 할 것이다. 2. 커스텀 컴포넌트 만들기 C++ 클래스를 만들어보자. 부모 클래스를 살펴보면 Actor 컴포넌트가 있는것을 볼 수 있다.  액터 컴포넌트의 이름은 AttributeComponent로 지정하였다. 컴포넌트를 만들었으니 속성(변수)..
[언리얼 실습] 44. 나이아가라 컴포넌트 모듈 추가하기 목차모듈 추가하기나이아가라 컴포넌트 추가하기1. 나이아가라 컴포넌트 모듈 추가하기 저번에 파티클을 추가할때는 Cascade 파티클을 추가하였다. 이번에는 나이아가라로 만들어진 파티클을 추가해보려고 한다.  아이템이 드랍되면 그곳에 효과를 주고 싶다. 모든 아이템에 공통되는 클래스에 이걸 추가하면 좋을 것이다. 현재 무기 클래스와 보물 클래스가 아이템 클래스에서 상속 받고 있다. 그렇기 때문에 아이템 클래스에서 나이아가라 시스템 컴포넌트를 추가하도록 하자.  언리얼문서에 따르면 C++에서 나이아가라 컴포넌트를 추가하기 위해서 모듈이 필요한 것을 볼 수 있다.PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine",..
[언리얼 실습] 43. 다양한 부실 수 있는 액터 만들기 목차부실 수 있는 액터 종류 늘리기Infinite loop detected 오류 해결하기1. 부실 수 있는 액터 종류 늘리기 보물에서 했던 것처럼 베이스 블루프린트 클래스를 놔두고 자식 클래스들을 만들어 다양환 종류의 액터를 만들어보려고 한다. 부실 수 있는 액터를 만들기 위해서는 지오메트리 컬렉션들이 필요하다. 부실만한 매시를 찾고 프랙쳐모드에서 지오메트리 컬렉션들을 만들자.  저기 항아리를 부실 것이다. 항아리의 크기가 작기 때문에 너무 잘게 부술 필요는 없다.  제네레이트의 new 아이콘을 눌러 지오메트리 컬렉션을 만들자. 이름은 알아보기 쉽게 바꾸는 편이 좋다.  프랙쳐는 유니폼으로 하고 보로노이 사이트의 숫자를 줄였다. 그 다음 본의 색깔을 원래대로 되돌리자.   bone 을 검색해서 Show ..
[언리얼 실습] 42. 다양한 보물이 나오게 하기. 목차랜덤 보물 만들기항아리를 부시면 랜덤한 보물이 나오게 하기1. 랜덤 보물 만들기 보물의 종류를 늘려보자. 보물의 종류를 늘리고 보물마다 주는 골드의 양을 다르게 할 것이다. 골드의 양을 다르게 하려면 먼저 골드의 존재가 있어야 한다. 비주얼 스튜디오로 돌아가자. class PRACTICE_API ATreasure : public AItem {private: UPROPERTY(EditAnywhere, Category = "Treasure Properties") int32 Gold; } 골드의 양은 에디터에서 조절할 수 있게 하였다. 이제 보물들을 여러개 만들고 이 보물마다 골드의 양을 다르게 하고 싶다. 그렇게 하기 위해서는 여러 클래스가 필요할 것이다. 이제 현재 있는 블루프린트 클래스를..
[언리얼 실습] 41. C++에서 액터 스폰하기 & 부서진 액터랑 충돌방지 목차UClass로 설정한 액터 스폰하기TSubclassOf 사용하기부서진 액터랑 충돌방지1. UClass 액터 스폰하기 항아리를 부시면 보물이 나오게 할 것이다. 그러기 위해서 액터를 스폰할 줄 알아야한다. BreakableActor 클래스에 GetHit 함수가 있다. 부실 수 있는 액터가 부셔지면 스폰을 해야하니 여기서 액터를 스폰해보자. 함수를 쓰면 7개나 되는 오버로드된 함수들을 볼 수 있다. 여기서 2번째 버전을 사용하려고 한다. (참고로 현재 비주얼스튜디오 2022를 사용하고 있다.) SpawnActor는 탬플릿 함수이기 때문에 타입 지정이 필요하다. 타입지정을 어떻게 해야할까? 단순히 ATreasure라고 지정하면 블루프린트 클래스가 아닌 C++ 클래스 타입이 생성되고 이것은 우리가 원하는 것..
[언리얼 실습] 40. 액터를 부수면 아이템 스폰하기 목차보물 클래스 만들기1. 보물 클래스 만들기 아이템에 사용할 매시와 사운드를 구한뒤 이를 바탕으로 보물 클래스를 만들어보자.  아이템 클래스를 기반으로 보물 클래스를 만들 것이다. // item.hUFUNCTION()virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); 클래스가 만들어졌으면 부모 클래스(아이템 클래스)에서 오버랩 이벤트 함수를 오버라이드 해서 사용해보자. UCLASS()class PRACTICE_A..
[언리얼 실습] 39. 액터가 부셔질 때 효과음을 내고 사라지게 하기 목차블루프린트에서 사운드 재생하기액터가 부서지면 사라지게 하기1. 블루프린트에서 사운드 재생하기 이전에 에너미가 Hit 할때 발생하는 효과음은 C++에서 재생하였다. 이번에는 블루프린트에서 재생해보려고 한다.  Breakable 액터의 이벤트 그래프로 들어가자. 전에 C++와 블루프린트 모두에서 사용할 수 있는 함수를 만들었다. 이곳에서 사운드를 재생할 것이다.  위와 같이 노드들을 연결해주자. 이렇게 하면 사운드가 재생되는 것을 볼 수 있다.2. 액터가 부서지면 사라지게 하기 대부분 (사실상 모든) 게임에서 부서질 수 있는 물체가 부서지고 나면 일정 시간후 사라진다. 계속 남기면 리소스를 계속 차지 할 것이고 이것은 최적화의 측면에서 좋지 못하다. 그렇기 때문에 액터가 부서지면 일정 시간 후 사라지게 ..
[언리얼 실습] 38. C++와 블루프린트에서 설정가능한 함수 만들기 목차BlueprintNativeEvent1. BlueprintNativeEvent 히트 후 소리를 재생하고 싶다. 히트 반응은 C++에서 구현하지만 사운드는 C++가 아닌 블루프린트에서 설정을 하고 싶다. 이 경우에 어떻게 해야할까? GetHit함수를 C++에서도 구현하고 블루프린트에서도 구현을 하고 싶다.  하지만 현재 GetHit는 블루프린트에서 설정이 불가능하다. 인터페이스에서 상속받고 있는데 인터페이스에서 설정은public: virtual void GetHit(const FVector& ImpactPoint) = 0; UFUNCTION 매크로 조차 존재하지 않는다. 그래서 이제 이 함수를 바꿀 필요가 있다. 이제 UFUNCTION 매크로를 추가해주자. public: UFUNCTION(Bluepri..