본문 바로가기
카테고리 없음

UniTask 로 ScriptableObject 에서 반복 처리하기

by 레오란다 2024. 7. 13.
반응형

유니티에서 제공하는 ScriptableObject 는 게임을 만들 때 굉장히 유용하게 사용할 수 있는 기능으로 캐릭터나 스킬등의 기본 수치를 정의하는 용도로 많이 사용됩니다.

 

ScriptableObject 는 Monobehaviour 를 상속하지 않기 때문에 Update 나 Coroutine 을 사용할 수 없어 주기적인 처리는 할 수 없었습니다. 다행히 유니티는 Coroutine 과 유사하게 사용할 수 있는 UniTask 를 제공하는데 이를 이용해 주기적인 처리를 ScriptableObject 에서도 수행할 수 있습니다.

 

UniTask 를 사용하기 위해선 Package Manager 를 이용해 따로 설치해 주셔야 합니다. 자세한 방법은 제가 예전에 작성했던 아래의 글을 참고해 주시기 바랍니다.

 

https://ugames.tistory.com/entry/Coroutine-%EA%B3%BC-UniTask-%EB%B9%84%EA%B5%90-%EC%98%88%EC%A0%9C 

 

Coroutine 과 UniTask 비교 예제

UniTask 는 async 와 await 를 유니티에서 더 사용하기 편리하도록 만든 통합 패키지입니다. UniTask 는 Coroutine 에 비해 메모리 사용량, 성능, try-catch 사용 가능 및 return 을 사용할 수 있어서 Coroutine 대신

ugames.tistory.com

 

 

아래는 ScriptableObject 에서 UniTask 를 이용해 반복 처리를 수행하는 간단한 예제입니다.

using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine;

[CreateAssetMenu(fileName = "NewAttackSkill", menuName = "Skills/AttackSkill")]
public class SO_AttackSkill : ScriptableObject
{
   public float damage;   
   public float critPriority;
   public float critDamage;
   
   public float cooldown;
   
   public GameObject skillPrefab;	

   public void Activate()
   {
      ActivateAsync();
   }

   async UniTaskVoid ActivateAsync()
   {
      var skill = Instantiate(skillPrefab);
   
      while (Application.isPlaying)
      {
         skill.GetComponent<Skill>().Activate(this);
         await UniTask.Delay(cooldown);
      }
   }
}

 

 

이런 식으로 사용하면 ScriptableObject 에서도 간단하게 반복 처리를 할 수 있게됩니다.  

반응형

댓글