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

[유니티 엔진 제작] Instantiate 함수

나는야 개발자 2025. 2. 20. 07:39
반응형

1. 현재 씬 가져오기 추가

//DirectX_SceneManager.h

//이하 생략


template <typename T>
static Scene* CreateScene(const std::wstring& name)
{
	T* scene = new T();
	scene->SetName(name);
    //생성 시 현재 씬으로 active 되도록
	mActiveScene = scene;

	scene->Initialize();
	mScenes.insert(std::make_pair(name, scene));
	return scene;
}

//현재씬 가져오기
static Scene* GetCurrentScene() { return mActiveScene; }

//함수 cpp파일로 이동
static Scene* LoadScene(const std::wstring& name);


//이하 생략

 

2. Gameobject 클래스 Transform 자동 컴퍼넌트 추가

//DirectX_Gameobject.h

//...이하생략

private:
	void initializedTransform();
    
//...이하생략
	//DirectX_Gameobject.cpp
    
    GameObject::GameObject()
    {
    	//생성할때 자동으로 Transform추가되도록
        initializedTransform();
    }
    
    //..이하 생략
    
    //추가 함수
    void GameObject::initializedTransform()
	{
		Transform* tr = GetComponent<Transform>();
		if (tr == nullptr)
		{
			tr = AddComponent<Transform>();
		}
	}
    
    //..이하 생략

 

3. Instantiate 함수 추가

//DirectX_Object.h

#pragma once
#include "DirectX_SceneManager.h"
#include "DirectX_Scene.h"
#include "DirectX_Layer.h"
#include "DirectX_GameObject.h"
#include "DirectX_Component.h"
#include "DirectX_Transform.h"


namespace dir::object
{
	template <typename T>
	static T* Instantiate(dir::eLayerType type)
	{
		T* obj = new T();
		Scene* activeScene = SceneManager::GetCurrentScene();
		Layer* layer = activeScene->GetLayer(type);
		layer->AddGameObject(obj);
		return obj;
	}

	template <typename T>
	static T* Instantiate(dir::eLayerType type, math::Vector2 pos)
	{
		T* obj = new T();
		Scene* activeScene = SceneManager::GetCurrentScene();
		Layer* layer = activeScene->GetLayer(type);
		layer->AddGameObject(obj);

		Transform* tr = obj->GetComponent<Transform>();
		tr->SetPos(pos);

		return obj;
	}
}

 

4. PlayScene 코드 수정

//DirectX_PlayScene.cpp

//..이하생략

void PlayScene::Initialize()
{
	{
    	//기존 코드 제거
		/*bg = new Player();
		Transform* tr = bg->AddComponent<Transform>();
		tr->SetPos(Vector2(0, 0));
		tr->SetName(L"TR");

		SpriteRenderer* sr = bg->AddComponent<SpriteRenderer>();
		sr->SetName(L"SR");
		sr->ImageLoad(L"D:\\Git\\Win_DirectX_Engine\\Resources\\CloudOcean.png");

		Scene::AddGameobject(bg, eLayerType::BackGround);*/
		
        //새로 생성코드를 이용하여 한줄로 생성 가능 
		bg = object::Instantiate<Player>(eLayerType::BackGround, Vector2(100,100));
        
        //이미지는 쓸때도 있고 아닐때도 있어서 필요할때마다 추가하도록 
		SpriteRenderer* sr = bg->AddComponent<SpriteRenderer>();
		sr->SetName(L"SR");
		sr->ImageLoad(L"D:\\Git\\Win_DirectX_Engine\\Resources\\CloudOcean.png");
	}
}

//..이하생략

 

 

5. 결과

- 정상적으로 잘나옴

반응형