반응형
유니티에서 제공하는 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
아래는 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 에서도 간단하게 반복 처리를 할 수 있게됩니다.
반응형
댓글