본문 바로가기

UNITY

UNITY_20230918[스크립터블 오브젝트]

지금까지는 게임 내 데이터의 저장 및 관리를 여러 변수와 열거형의 집합으로 진행했다. 하지만 동일한 데이터를 가지는 오브젝트가 수작업으로는 불가능한 영역에 들어서면 이런 방법은 사용하지 못한다.

 

따라서 다음으로 사용할 방법으로 Scriptable Object(SO)가 있다.

SO는 데이터를 모아두는 컨테이너 개념으로, 유니티에서 오브젝트 데이터를 저장, 관리하는 방법 중 하나다.

전사의 공격력, 궁수의 공격력 따위의 스테이터스는 플레이어블 캐릭터 오브젝트 안에서 동일한 위치의 데이터다. 따라서 이러한 변수는 하나의 스크립트에서 일괄적으로 생성해, 각각의 바리에이션에 맞게 조절하는 것이 바람직하다.

아래는 SO의 스크립트와 해당 스크립트가 인스펙터 뷰에서 보이는 내용이다.

using UnityEngine;

 // 아래의 CreateAssetMenu로 SO를 프로젝트 뷰에서 생성할 수 있다.
[CreateAssetMenu(fileName = "DefaultAttackData", menuName = "TopDownController/Attacks/Default", order = 0)]
public class AttackSO : ScriptableObject
{
    [Header("Attack Info")] // Header : 인스펙터 창의 변수 옵션 위에 정보가 텍스트가 뜬다.
    public float size;
    public float delay;
    public float power;
    public float speed;
    public LayerMask target;

    [Header("Knock Back Info")]
    public bool isOnKnockback;
    public float knowbackPower;
    public float knowbackTime;
}

이 스크립트는 default 스크립트다. 아래의 스크립트는 위를 상속하는 스크립트다.

using UnityEngine;

[CreateAssetMenu(fileName = "RangedAttackData", menuName = "TopDownController/Attacks/Ranged", order = 1)]
public class RangedAttackData : AttackSO
{
    [Header("Ranged Attack Data")]
    public string bulletNameTag;
    public float duration;
    public float spread;
    public int numberofProjectilesPerShot;
    public float multipleProjectileAngle;
    public Color projectileColor;
}

위 스크립트는 프로젝트 뷰에서 아래와 같이 생성 가능하다.

Datas폴더 하위의 Player_RangedAttackData는 위 그림으로 생성된 오브젝트다.

Player_RangedAttackData의 인스펙터 뷰는 다음과 같다.

값은 임의로 정했다. 위 두 스크립트의 필드가 전부 표시된다.

 

default 오브젝트는 근접 공격, Ranged 오브젝트는 원거리 공격이 가능하게 작성했다.

이처럼, 하나의 SO를 생성하고, 이 SO를 다수의 SO가 상속받아 참조, 재사용함으로써 동일한 형태의 코드 작성을 줄일 수 있다. 또한, 변수 코드와 로직&데이터 코드를 분리시킴으로써 코드의 가독성이 증가하고, 인스펙터 창에서 빠른 변수의 수정이 가능하다.


오늘 SO말고도 투사체 표현, 오브젝트 풀도 청강했는데, 이 세개 강의 모두 거의 이해 못했다. 그냥 받아쓰기 한 느낌

분노의 영어타자속도는 점점 빨라진다.