본문 바로가기

게임프로그래밍/실습1

(79)
[언리얼 실습] 49. 데미지 시스템 사용하기 목차언리얼 데미지 시스템데미지 받기 (TakeDamage)데미지 주기 (ApplyDamage)버그 수정하기1. 언리얼 데미지 시스템 언리얼 엔진에는 자체적으로 가지고 있는 데미지 시스템이 있다. 액터라면 종류에 상관없이 데미지를 받을 수 있다. 현재 에너미에게는 체력이 있고 이를 보여주는 체력바도 있다. 이제는 실제로 데미지를 줘서 이 체력에 영향을 주고 싶다. 이제 비주얼 스튜디오에서 이를 구현해보자.2. 데미지 주기 (ApplyDamage) 데미지를 주는 법을 알아보겠다. 무기.cpp 파일로 들어가자. 무기 클래스에는 OnBoxOverlap() 함수가 있고 이곳에서 오버랩되는 액터가 무엇인지 알 수 있다. UGameplayStatics 라이브러리에 있는 함수 중 ApplyDamage() 함수를 사용할..
[언리얼 실습] 48. 실제 체력바 퍼센트 조절하기 목차c++에서 체력바 조절하기체력바가 안 보일때 버그 수정1. c++에서 체력바 조절하기 C++로 위젯 컴포넌트를 만들고 그곳에 유저 위젯을 설정해주었다. 이제 이 유저 위젯을 다루어서 체력바를 조절하고 싶다. 비주얼스튜디오로 가서 위젯 컴포넌트 클래스로 들어가자 UCLASS()class PRACTICE_API UHealthBarComponent : public UWidgetComponent{ GENERATED_BODY() public: void SetHealthPercent(float Percent);}; 퍼블릭 섹션을 만들고 그곳에 함수를 선언한다. 이제 이 함수 내에서 유저 위젯을 조절해야한다. 그러기 위해서는 유저 위젯에 접근할 수 있어야 하는데 GetUserWidgetObject() 함수를 이용..
[언리얼 실습] 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..