[UNITY],[C#]/TIL : UNITY

[Unity] ScriptableObject를 다양하게 사용해보자

네,가능합니다 2024. 11. 11. 23:39

스크립터블 오브젝트는 매우 다양하게 사용할 수 있다.

 

심지어 매우 효율적이다. 하지만 어떻게 사용해야할지 감이 잘 잡히지 않는다.

 

그래서 다양한 활용성을 예제들로 한번 정리하고 한번씩 보려고 한다.

 

1. 게임 데이터 관리

[CreateAssetMenu(fileName = "PlayerStats", menuName = "ScriptableObjects/PlayerStats")]
public class PlayerStats : ScriptableObject
{
    public int maxHealth = 100;
    public int attackPower = 20;
}

// 플레이어 클래스에서 PlayerStats 사용
public class Player : MonoBehaviour
{
    public PlayerStats playerStats;

    private int currentHealth;

    private void Start()
    {
        currentHealth = playerStats.maxHealth; // SO에서 체력 정보를 불러옴
    }
}

 

이런 방식으로 간단하게  플레이어 스탯을 관리해보았다.

이런 방법은 자주 사용해본 것 같다.

 

2. 델리게이트와 이벤트 관리

[CreateAssetMenu(fileName = "GameEvent", menuName = "ScriptableObjects/GameEvent")]
public class GameEvent : ScriptableObject
{
    private Action listeners;

    public void Raise()
    {
        if (listeners != null)
            listeners.Invoke();
    }

    public void RegisterListener(Action listener)
    {
        listeners += listener;
    }

    public void UnregisterListener(Action listener)
    {
        listeners -= listener;
    }
}

// 버튼 클릭 시 게임 이벤트 발생
public class Button : MonoBehaviour
{
    public GameEvent onButtonPressed;

    private void OnMouseDown() // 버튼이 클릭되었을 때 실행
    {
        onButtonPressed.Raise(); // GameEvent를 발생시킴
    }
}

// 이벤트를 구독하는 클래스
public class EventListener : MonoBehaviour
{
    public GameEvent gameEvent;

    private void OnEnable()
    {
        gameEvent.RegisterListener(OnEventRaised);
    }

    private void OnDisable()
    {
        gameEvent.UnregisterListener(OnEventRaised);
    }

    private void OnEventRaised()
    {
        Debug.Log("버튼이 작동되었습니다.");
    }
}

이 방법을 알고 아 이건 꼭 써봐야겠다 생각을 했다.

SO를 이용하면 메모리 관리도 효율적이라고 한다.

 

3.상태관리

[CreateAssetMenu(fileName = "GameState", menuName = "ScriptableObjects/GameState")]
public class GameState : ScriptableObject
{
    public int playerScore = 0;

    public void AddScore(int score)
    {
        playerScore += score;
        Debug.Log($"현재 점수: {playerScore}");
    }
}

// 플레이어가 점수를 얻었을 때 AddScore 호출
public class Player : MonoBehaviour
{
    public GameState gameState;

    public void CollectCoin()
    {
        gameState.AddScore(10);
    }
}

// UI에서 GameState를 사용해 점수를 표시
public class ScoreDisplay : MonoBehaviour
{
    public GameState gameState;

    private void Update()
    {
        // UI에 gameState.playerScore 를 출력
    }
}

 

 

다양한 AI를 구현하는데 사용해도 좋다고 하는데 어떤 방식인지 잘 모르겠다.

 

이부분은 공부를 좀 더 해보고 수정해봐야겠다.. (+= 이루어지지 않는 TODO 리스트)

 

개인적으로 가장 인상깊었던건 델리게이트를 함께 사용하는 SO라고 생각한다.