50 lines
2.3 KiB
C#
50 lines
2.3 KiB
C#
using UnityEngine; // 유니티 기능을 불러올거에요 -> UnityEngine을
|
|
using System.Collections.Generic; // 리스트를 사용할거에요 -> 제네릭을
|
|
|
|
/// <summary>
|
|
/// 모든 몬스터의 Update를 중앙에서 관리하여 성능을 최적화하는 매니저
|
|
/// </summary>
|
|
public class MobUpdateManager : MonoBehaviour // 클래스를 선언할거에요 -> 몹 업데이트 매니저를
|
|
{
|
|
public static MobUpdateManager Instance { get; private set; } // 프로퍼티를 선언할거에요 -> 싱글톤 인스턴스를
|
|
|
|
private readonly List<MonsterClass> _activeMobs = new List<MonsterClass>(); // 리스트를 선언할거에요 -> 활성 몬스터 목록을
|
|
|
|
private void Awake() // 함수를 실행할거에요 -> 초기화 Awake를
|
|
{
|
|
if (Instance == null) Instance = this; // 조건이 맞으면 설정할거에요 -> 나를 유일한 인스턴스로
|
|
else Destroy(gameObject); // 아니면 파괴할거에요 -> 중복된 나를
|
|
}
|
|
|
|
public void RegisterMob(MonsterClass mob) // 함수를 선언할거에요 -> 몬스터 등록을
|
|
{
|
|
if (!_activeMobs.Contains(mob)) // 조건이 맞으면 실행할거에요 -> 목록에 없다면
|
|
{
|
|
_activeMobs.Add(mob); // 추가할거에요 -> 목록에
|
|
}
|
|
}
|
|
|
|
public void UnregisterMob(MonsterClass mob) // 함수를 선언할거에요 -> 몬스터 해제를
|
|
{
|
|
if (_activeMobs.Contains(mob)) // 조건이 맞으면 실행할거에요 -> 목록에 있다면
|
|
{
|
|
_activeMobs.Remove(mob); // 제거할거에요 -> 목록에서
|
|
}
|
|
}
|
|
|
|
private void Update() // 함수를 실행할거에요 -> 매 프레임마다
|
|
{
|
|
// 역순 반복문: 중간에 삭제되어도 안전하게
|
|
for (int i = _activeMobs.Count - 1; i >= 0; i--) // 반복할거에요 -> 뒤에서부터 하나씩
|
|
{
|
|
if (_activeMobs[i] != null && _activeMobs[i].gameObject.activeInHierarchy) // 조건이 맞으면 실행할거에요 -> 몬스터가 켜져 있다면
|
|
{
|
|
_activeMobs[i].OnManagedUpdate(); // 실행할거에요 -> 관리형 업데이트 함수를
|
|
}
|
|
else // 꺼져있거나 삭제됐다면
|
|
{
|
|
_activeMobs.RemoveAt(i); // 제거할거에요 -> 리스트에서 정리
|
|
}
|
|
}
|
|
}
|
|
} |