Unity3D_MMO - 소멸

k_hyun·2022년 10월 23일
0

Unity_MMO_Project

목록 보기
31/33

Define.cs

public enum WorldObject
    {
        Unknown,
        Player,
        Monster,
    }

WorldObject의 타입을 정하기 위해 선언하였다.

GameManagerEx.cs

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이 된다.

MonsterController.cs

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로 초기화한다.

GameScene.cs

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");
    }

플레이어와 몬스터를 스폰해주었다.

실행 결과

스폰 및 디스폰, 풀링이 잘 되고 있다.

0개의 댓글