public enum WorldObject
{
Unknown,
Player,
Monster,
}
WorldObject의 타입을 정하기 위해 선언하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManagerEx
{
GameObject _player;
HashSet<GameObject> _monsters = new HashSet<GameObject>();
// 게임오브젝트 스폰 및 세팅
public GameObject Spawn(Define.WorldObject type, string path, Transform parent = null)
{
GameObject go = Managers.Resource.Instantiate(path, parent);
switch (type)
{
case Define.WorldObject.Monster:
_monsters.Add(go);
break;
case Define.WorldObject.Player:
_player = go;
break;
}
return go;
}
// 게임오브젝트의 BaseController 컴포넌트에 접근해서 어떤 타입인지 확인
public Define.WorldObject GetWorldObjectType(GameObject go)
{
BaseController bc = go.GetComponent<BaseController>();
if (bc == null)
return Define.WorldObject.Unknown;
return bc.WorldObjectType;
}
// 몬스터 타입인 경우 HashSet에서 제거
// 플레이어인 경우 null로 초기화
public void Despawn(GameObject go)
{
Define.WorldObject type = GetWorldObjectType(go);
switch (type)
{
case Define.WorldObject.Monster:
{
if (_monsters.Contains(go))
_monsters.Remove(go);
}
break;
case Define.WorldObject.Player:
{
if (_player == go)
_player = null;
}
break;
}
Managers.Resource.Destroy(go);
}
}
몬스터를 스폰 , 디스폰 하기 위한 매니저이다.
디스폰의 경우 플레이어는 Pooling이 된다.
void OnHitEvent()
{
if (_lockTarget != null)
{
Stat targetStat = _lockTarget.GetComponent<Stat>();
int damage = Mathf.Max(0, _stat.Attack - targetStat.Defense);
targetStat.Hp -= damage;
if (targetStat.Hp <= 0)
{
Managers.Game.Despawn(targetStat.gameObject);
_lockTarget = null;
}
}
}
플레이어의 hp가 0 이하가 되면 플레이어 오브젝트를 풀링시키고, 타겟을 null로 초기화한다.
protected override void Init()
{
GameObject player = Managers.Game.Spawn(Define.WorldObject.Player, "UnityChan");
Camera.main.GetOrAddComponent<CameraController>().SetPlayer(player);
Managers.Game.Spawn(Define.WorldObject.Monster, "Knight");
}
플레이어와 몬스터를 스폰해주었다.
스폰 및 디스폰, 풀링이 잘 되고 있다.