C++/유니티 엔진 모작(일시중지)

[유니티 엔진 제작] 컴퍼넌트 구조

나는야 개발자 2025. 2. 17. 21:51
반응형

컴퍼넌트 구조

- 내가 필요할때마다 추가하여 사용하는 방식

 

1. Component 클래스 추가

//DirectX_Component.h

#pragma once
#include "DirectX_Entity.h"

namespace dir
{
	class GameObject;
	class Component : public Entity
	{
	public:
		Component();
		~Component();
		virtual void Initialize();
		virtual void Update();
		virtual void LateUpdate();
		virtual void Render(HDC hdc);
		void SetOwner(GameObject* owner) { mOwner = owner; }
		GameObject* GetOwner() { return mOwner; }
	private:
		GameObject* mOwner;
	};
}
//DirectX_Component.cpp

#include "DirectX_Component.h"

namespace dir
{
	Component::Component()
	{
	}
	Component::~Component()
	{
	}
	void Component::Initialize()
	{
	}
	void Component::Update()
	{
	}
	void Component::LateUpdate()
	{
	}
	void Component::Render(HDC hdc)
	{
	}
}

 

 

2. Gameobject 클래스 수정

//DirectX_GameObject.cpp

#include "DirectX_GameObject.h"
#include "DirectX_Input.h"
#include "DirectX_Time.h"

namespace dir
{
	GameObject::GameObject()
	{

	}

	GameObject::~GameObject()
	{
		for (Component* comp : mComponents)
		{
			delete comp;
			comp = nullptr;
		}
	}

	void GameObject::Initialize()
	{
		for (Component* comp : mComponents)
		{
			comp->Initialize();
		}
	}

	void GameObject::Update()
	{
		for (Component* comp : mComponents)
		{
			comp->Update();
		}
	}

	void GameObject::LateUpdate()
	{
		for (Component* comp : mComponents)
		{
			comp->LateUpdate();
		}
	}

	void GameObject::Render(HDC hdc)
	{
		for (Component* comp : mComponents)
		{
			comp->Render(hdc);
		}
	}
}
//DirectX_GameObject.h

#pragma once
#include "CommonInclude.h"
#include "DirectX_Component.h"

namespace dir
{
	class GameObject
	{
	public:
		GameObject();
		~GameObject();

		virtual void Initialize();
		virtual void Update();
		virtual void LateUpdate();
		virtual void Render(HDC hdc);


		template <typename T>
		T* AddComponent()
		{
			T* newComponent = new T();
			newComponent->SetOwner(this);
			mComponents.push_back(newComponent);
			return newComponent;
		}

		template <typename T>
		T* GetComponent()
		{
			T* component = nullptr;
			for (Component* comp : mComponents)
			{
				component = dynamic_cast<T*>(comp);
				if (component)
					break;
			}
			return component;
		}

	private:
		std::vector<Component*> mComponents;
	};
}

 

3. SpriteRenederer 코드 추가

//DirectX_SpriteRenderer.cpp

#pragma once
#include "DirectX_GameObject.h"
#include "DirectX_Transform.h"
#include "DirectX_SpriteRenderer.h"

namespace dir
{
	SpriteRenderer::SpriteRenderer()
	{
	}
	SpriteRenderer::~SpriteRenderer()
	{
	}
	void SpriteRenderer::Initialize()
	{
	}
	void SpriteRenderer::Update()
	{
	}
	void SpriteRenderer::LateUpdate()
	{
	}
	void SpriteRenderer::Render(HDC hdc)
	{
		//파랑 브러쉬 생성
		HBRUSH blueBrush = CreateSolidBrush(RGB(255, 0, 255));
		// 파랑 브러쉬 DC에 선택 그리고 흰색 브러쉬 반환값 반환
		HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, blueBrush);
		HPEN redPen = CreatePen(PS_SOLID, 2, RGB(rand() % 255, rand() % 255, rand() % 255));
		HPEN oldPen = (HPEN)SelectObject(hdc, redPen);
		SelectObject(hdc, oldPen);
		Transform* tr = GetOwner()->GetComponent<Transform>();
		Rectangle(hdc, tr->GetX(), tr->GetY(), 100 + tr->GetX(), 100 + tr->GetY());
		SelectObject(hdc, oldBrush);
		DeleteObject(blueBrush);
		DeleteObject(redPen);
	}
}
//DirectX_SpriteRenderer.h

#pragma once
#include "DirectX_GameObject.h"
#include "DirectX_Component.h"

namespace dir
{
	class SpriteRenderer : public Component
	{
	public:
		SpriteRenderer();
		~SpriteRenderer();
		void Initialize() override;
		void Update()  override;
		void LateUpdate()  override;
		void Render(HDC hdc)  override;
	private:
	};
}

 

4.Player 코드 추가

//DirectX_Player.cpp

#include "DirectX_Player.h"


namespace dir
{
	void Player::Initialize()
	{
		GameObject::Initialize();
	}
	void Player::Update()
	{
		GameObject::Update();
	}
	void Player::LateUpdate()
	{
		GameObject::LateUpdate();
	}
	void Player::Render(HDC hdc)
	{
		GameObject::Render(hdc);
	}
}
//DirectX_Player.h

#pragma once
#include "..//DirectX_SOURECE/DirectX_GameObject.h"

namespace dir
{
	class Player : public GameObject
	{
	public:
		void Initialize() override;
		void Update() override;
		void LateUpdate() override;
		void Render(HDC hdc) override;
	private:
	};
}

 

5.PlayScene코드 수정

#include "DirectX_PlayScene.h"
#include "DirectX_GameObject.h"
#include "DirectX_Transform.h"
#include "DirectX_SpriteRenderer.h"
#include "DirectX_Player.h"

namespace dir
{
	PlayScene::PlayScene()
	{
	}
	PlayScene::~PlayScene()
	{
	}
	void PlayScene::Initialize()
	{
		{
			Player* pl = new Player();
			Transform* tr = pl->AddComponent<Transform>();
			tr->SetPos(800, 450);
			tr->SetName(L"TR");
			SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
			sr->SetName(L"SR");
			AddGameObject(pl);
		}

		{
			Player* pl = new Player();
			Transform* tr = pl->AddComponent<Transform>();
			tr->SetPos(300, 450);
			tr->SetName(L"TR");
			SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
			sr->SetName(L"SR");
			AddGameObject(pl);
		}
		{
			Player* pl = new Player();
			Transform* tr = pl->AddComponent<Transform>();
			tr->SetPos(100, 650);
			tr->SetName(L"TR");
			SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
			sr->SetName(L"SR");
			AddGameObject(pl);
		}
	}
	void PlayScene::Update()
	{
		//부모꺼의 함수 호출
		Scene::Update();
	}
	void PlayScene::LateUpdate()
	{
		Scene::LateUpdate();
	}
	void PlayScene::Render(HDC hdc)
	{
		Scene::Render(hdc);
	}
}

 

 

결과

반응형