내일배움캠프

내일배움캠프 Unity - TIL : 25.03.12

달시_Dalsi 2025. 3. 12. 23:01
728x90

오늘 학습한 내용

1) ScriptableObject에서 기능 구현

기존에는 ScriptableObject를 오직 데이터(변수 값)를 저장하는 용도로만 사용하였으나,
아이템의 기능까지 ScriptableObject에서 구현하여 활용하는 방식도 가능하다는 점을 알게 되었습니다.

이를 통해 별도의 스크립트에서 아이템 기능을 따로 구현할 필요 없이,
각 아이템이 자신만의 효과를 ScriptableObject 내에서 정의하고 실행할 수 있습니다.


문제 및 해결 과정

1) 문제

 

  • ScriptableObject를 단순히 데이터 저장소로만 사용했기 때문에,
    아이템의 기능을 별도의 아이템 관리 스크립트에서 구현해야 했습니다.
  • 여러 종류의 아이템이 존재할 경우, 관리 코드가 복잡해지고 유지보수가 어려워질 가능성이 있었습니다.

 

 

시도한 해결 방법

  • ScriptableObject에 소모 아이템 효과를 직접 구현하여 아이템이 자신의 효과를 직접 실행할 수 있도록 변경하였습니다.
  • 각 아이템이 Use() 같은 메서드를 가지고 있으며, 이를 호출하면 해당 아이템의 기능이 동작하도록 설계하였습니다.
using UnityEngine;

// 아이템 기능을 정의하는 ScriptableObject
public abstract class ConsumableItem : ScriptableObject
{
    public string itemName;
    public string description;

    // 아이템 사용 기능을 각 아이템이 자체적으로 구현하도록 함
    public abstract void Use(GameObject target);
}

 

// 체력 회복 아이템
[CreateAssetMenu(fileName = "HealthPotion", menuName = "Items/Health Potion")]
public class HealthPotion : ConsumableItem
{
    public int healAmount;

    public override void Use(GameObject target)
    {
        PlayerHealth playerHealth = target.GetComponent<PlayerHealth>();
        if (playerHealth != null)
        {
            playerHealth.Heal(healAmount);
            Debug.Log($"{itemName}을 사용하여 {healAmount}만큼 체력을 회복했습니다.");
        }
    }
}

 

// 아이템을 사용하는 예제 코드
public class Player : MonoBehaviour
{
    public ConsumableItem currentItem;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && currentItem != null)
        {
            currentItem.Use(gameObject);
        }
    }
}

 

 

결과

  • ScriptableObject를 단순한 데이터 저장소가 아닌 아이템의 기능까지 포함한 객체로 활용할 수 있음
  • 아이템별 효과를 ScriptableObject에서 직접 정의하여 관리 코드가 간결해지고 확장성이 높아짐
  • 별도의 아이템 스크립트를 만들지 않고도 다양한 아이템 효과를 쉽게 추가할 수 있음

새롭게 알게 된 점

ScriptableObject는 데이터 저장소 이상의 역할을 할 수 있다.

ScriptableObject는 단순한 데이터 저장소가 아니라 객체의 행동(기능)까지 포함할 수 있음


아이템별 효과를 개별적으로 관리할 수 있다.

아이템의 기능을 ScriptableObject에서 직접 구현하면 아이템별 효과를 개별적으로 관리할 수 있어 유지보수와 확장성이 좋아짐


불필요한 관리 코드(ItemManager 등)를 줄일 수 있다.

기존의 관리형 코드(ItemManager 등)를 줄이고 아이템 자체가 기능을 수행하는 방식으로 개선할 수 있음

 

 

 

728x90