[TIL] Unity - MonsterSO

MINO·2024년 8월 1일
post-thumbnail

2024-08-01


Scriptable Object (SO)

대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너.

  • Skeleton 프리팹을 인스턴스화할 때마다, 데이터의 사본을 생성하므로 메모리가 낭비
  • Scriptable Object 를 사용해 메모리에서 한 번만 원본 데이터 SkeletonSO 를 저장
  • 프리팹들은 SkeletonSO 를 참조하는 방식으로 메모리 최적화 가능

스크립트

MonsterSO.cs

스켈레톤 , 고블린 , 오우거 등의 몬스터 종류가 존재하고,
프리팹으로 만들어둔 각각의 몬스터들은 오브젝트 풀을 통해 인스턴스화 된다.

모든 몬스터들의 스탯 정보가 담긴 데이터의 사본을 생성하게 된다면,
메모리가 상당히 낭비될 것이라 MonsterSO 를 제작하였다.

using UnityEngine;

[CreateAssetMenu(fileName = "Monster",menuName = "Monster/Stats")]
public class MonsterSO : ScriptableObject
{
    [field:Header("Monster Stats")]

    [field: SerializeField] public float HP { get; private set; }
    [field: SerializeField] public float STR { get; private set; }  // 공격력
    [field: SerializeField] public float DEF { get; private set; } // 방어력
    [field: SerializeField] public float LCK { get; private set; } // 크리티컬 관련 스탯

    [field: Header("Monster AI")]
    [field: SerializeField] public float WalkSpeed { get; private set; } // 순찰 시 이동 속도
    [field: SerializeField] public float WanderRadius { get; private set; } // 순찰 반경
    [field: SerializeField] public float WanderWaitTime { get; private set; } // 순찰 대기 시간

    

    [field: Header("Monster Attack State")]
    [field: SerializeField] public float RunSpeed { get; private set; } // 공격 시 이동 속도
    [field: SerializeField] public float DetectRadius { get; private set; } // 타겟 감지 반경
    [field:SerializeField]  public float AttackRate { get; private set; } // 공격 속도
    [field: SerializeField] public float AttackDistance { get; private set; } // 공격 사거리
    
    [field: SerializeField] public float Exp { get; private set; } // 처치 시 경험치
}

결과물

GoblinSkeleton

TIL 마무리

몬스터들의 능력치를 밸런스에 맞게 조절하는 작업도 함께 진행해봤는데,

플레이어와 밸런스를 적당히 유지하는 게 쉽지 않은 것 같다.
기획적인 부분은 쉽진 않지만, 테스트하는 과정에서 재미를 느낄 수도 있는 것 같다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글