- 비동기 프로그래밍
비동기 프로그래밍
프로젝트에서 Addressables을 사용해서 ResourceManager와 ObjectManager를 구현하였다
Addressables은 로드해서 사용할 떄 비동기 메서드를 쓰는 것이 권장 된다고 배웠고 그래서
ResourceManager와 ObjectPool 모두 비동기 방식으로 만들게 되었고
ObjectPool Object가 없을 경우 비동기 Instantiate를 하게 구현하였기 떄문에
오브젝트를 생성하는 부분을 비동기로 바꾸어 줄 필요가 생겼다.
동기 -> 비동기
일단 비동기 메서드들은 async-await, Task, Coroutine 으로 구현할 수 있었고
Coroutine 같은 경우는 MonoBehaviour를 상속해야 사용할 수 있고 async-await, Task는 어디서든 사용할 수 있었다.
그래서 사용하는 부분에 따라서 async-await, Task, Coroutine 를 활용하여 구현 해보았다.
일반 메서드에서 비동기 메서드를 실행하게되면 일반 메서드는 일반 메서드대로 진행되고
비동기 메서드는 또 비동기 메서드 대로 실행되어서 Object를 생성해서 해당 Object가 사용되어야 부분의 메서드들을
전부 비동기 메서드로 만들어주어야 했다.
Coroutine + Task - CardManager에서 CardSO를 받아오는 부분
CardManager는 Monobehaviour를 사용하지는 않지만 SelectCard를 사용하는 부분에서는
Monobehaviour를 가지고 있어서 Coroutine을 사용하도록 만들었다.
ResourceManager에서 리소스들이 로드되어있지 않은 경우를 대비해 Count()메서드로
혹시 키가 없으면 리소스를 로드하는 label으로 리소스를 로드하도록 했다.
ResourceManager는 Monobehaviour가 없으므로 async-await, Task를 사용했기 때문에
Task가 IsCompleted가 될 때 까지 Coroutine이 기다리는 형식으로 만들어주었다.
public IEnumerator SelectCard(Card card)
{
AddressableLabel label = (AddressableLabel)(int)SelectRarity();
Task<int> taskInt = ResourceManager.Instance.Count(label);
while(!taskInt.IsCompleted)
{
yield return null;
}
int count = taskInt.Result-1;
int index = Math.Abs(RandomInt() % count);
Task<ScriptableObject> task = ScriptableObjectManager.Instance.SelectRandomSO(label, index);
while(!task.IsCompleted)
{
yield return null;
}
card.InitCard(task.Result as CardSO);
}
async - await + Task - CageManager에서 Cage를 생성하는 부분
CageManager에서 Cage를 생성하고 초기화하는것까지 담당하고 있고 그 이후는 Cage객체에서 알아서 처리하도록
CageManager가 구현 되어있었기 때문에 async - await + Task로 비동기 메서드를 구현했다
public async Task<Cage> CreateCage(int i)
{
GameObject go = await ObjectManager.Instance.UsePool(AddressableLabel.Cage, "Cage");
Cage cage = go.GetComponent<Cage>();
cage.transform.position = new Vector3(18 * (i + 1), 0, 0);
return cage;
}
public async void AddNewCage()
{
if (DataManager.Instance.cageCount >= MAX_CAGES)
{
return;
}
Cage cage = await CreateCage(cages.Count);
cages.Add(cage);
empty.Add(cages.Count-1);
DataManager.Instance.cageCount++;
cage.InitCage(UICageCamera);
}