hyrule 2022. 6. 9. 00:54

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


 

class CWidgetComponent: public CWidgetWindow;

- 여태까지는 게임오브젝트를 따라다녀야 하는 위젯들은 손수 주소를 받아서 위치를 구했었다.

- 그런데 위젯은 종종 게임오브젝트를 따라다닌다 -> 아예 이걸 미리 설정해놓은 '위젯 컴포넌트'를 만들면 편할 것이다.

 

- CWidgetWindow 클래스를 상속받아 조금 개조해서,

CGameObject에서도 생성 가능하게 해주고, 

CGameObject에서 생성 시 지속적으로 CGameObject를 따라다니도록 만든다.

 

-- 그런 다음 CGameObject에서 필요한 위젯을 CWidgetWindow에서 만들게 시킨 뒤

Offset값만 정해 주면,

해당 CGameObject에서 일정 거리만큼 떨어진 채로 따라다니게 만들 수 있을 것이다.

 

- 기존의 CWidgetWindow는 이런 방식으로 사용했었다. 박스 내부의 양수 좌표값에서만 사용 가능했지만

 

 

- 하지만, 상속받아 개조하는 CWidgetComponent:public CWidgetWindow는

이렇게 사용한다. Offset 값을 통해 마이너스 좌표값까지 끌어다 쓰는것이다.

 

{ class CGameObject* m_OwnerGameObj }

- 상속해서 새로 만들어붜야 할 변수는 이게 전부이다.

.

< CollisionMouse() >
- 재정의해서 그냥 무조건 false를 반환하도록 만들자. 마이너스 좌표까지 사용하므로 충돌처리를 하면 안된다.

 

< Update, PostUpdate, Render >
- 일단 전부 재정의를 해주고 코드 똑같이 긁어와서 없앨 부분만 없애준다.

-- 가장 먼저 해야할 일은, 주인 오브젝트의 위치를 따라가는 것이다. 주인 오브젝트와 카메라의 위치정보를 받아와서 이 UI가 화면의 어디에서 렌더링되어야 하는지를 m_Pos에 저장해 놓는다.

 

< Render() >

 


class CGameObject

 

{ CSharedPtr<class CWidgetComponent> m_WidgetComponent; }

- 일단은 nullptr로 설정해놓고,

 

< void CreateWidgetComponent(); >

- 이 메소드를 호출하면 동적할당하여 하나 만들어준다.

- 공유 포인터를 사용하므로 따로 제거는 안 해줘도 된다.


- 이렇게 설정해주면 이제 게임오브젝트를 따라다니는 UI의 설정이 매우 간단해진다.

- 몬스터의 초기화 과정에서 CWidgetComponent를 생성하고, Offset을 포함한 기초 설정을 해준 뒤,

 

- Update 과정에서 위에서 CWidget을 생성하면서 포인터 변수를 만들어 저장해 두었다면 해당 포인터 변수를 통해 숫자를 변경하면 되고,

그렇지 않다면

m_WidgetComponent->FindWidget<CProgressBar>("MonsterHPBar")->SetValue(m_HP / m_HPMax);
m_WidgetComponent->FindWidget<CWidgetNumber>("MonsterHPNum")->SetNumber((int)m_HP);

- 이런 식으로 아예 생성해둔 위젯컴포넌트를 통해 접근해서 위젯에 정보를 전달해 주면 되기 때문이다.

 

- 기존에 쓰던, CMonster의 체력바와 남은 체력을 숫자로 표시해주던 CWindowMonsterHP 클래스를 생성하는 대신 CWidgetComponent를 통해 몬스터의 체력바와 남은 체력을 출력해 보았다.

메모리 누수 없이 잘 작동한다.
GameFrameworkStepbyStep_63_WidgetComponent.zip
8.75MB