유니티

캐릭터 스텟 만들기 (ScriptableObject)

잼잼재미 2023. 12. 8. 01:46

ScriptableObject


  • 유니티에서 제공하는 대량의 데이터를 저장하는데 사용하는 데이터 컨테이너
  • 데이터 컨테이너로 데이터를 공유할 수 있고, 이를 통해 메모리 사용량 줄일 수 있음

 

 

 

 

스크립트 작성


 

 

CharacterStats

using System;

public enum StatsChangeType
{
    Add,
    Multiple,
    Override,
}

[Serializable]	// class, struct를 인스펙터창에서 확인 가능
public class CharacterStats	// MonoBehaviour 상속 필요 x
{
    public StatsChangeType statsChangeType;
    [Range(1, 100)] public int maxHealth;	// 인스펙터 창에서 범위 조절 가능
    [Range(1f, 20f)] public float speed;

    // 공격 데이터
    public AttackSO attackSO;
}

 

 

AttackSO

공격 관련 데이터

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// CreateAssetMenu : 에디터에서 쉽게 사용할 수 있도록 메뉴를 만듬
[CreateAssetMenu(fileName = "DefaultAttackData", menuName = "TopDownController/Attacks/Default", order = 0)]

public class AttackSO : ScriptableObject	// MonoBehaviour 상속 x, ScriptableObject 상속
{
    [Header("Attack Info")]
    public float size;
    public float delay;
    public float power;
    public float speed;
    public LayerMask target;

    [Header("Knock Back Info")]
    public bool isOnKnockback;	// 넉백이 있는가?
    public float knockbackPower;
    public float knockbackTime;
}

 

 

RangedAttackData

원거리 관련 데이터

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "RangedAttackData", menuName = "TopDownController/Attacks/Ranged", order = 1)]

public class RangedAttackData : AttackSO	// AttackSO를 상속
{
    [Header("Ranged Attack Data")]
    public string bulletNameTag;
    public float duration;
    public float spread;
    public int numberofProjectilesPerShot;
    public float multipleProjectilesAngle;
    public Color projectileColor;
}

 

 

CharacterStatsHandler

CharacterStats를 관리, 임시 복사

public class CharacterStatsHandler : MonoBehaviour
{
    [SerializeField] private CharacterStats baseStats;
    public CharacterStats CurrentStates { get; private set; }
    public List<CharacterStats> statsModifiers = new List<CharacterStats>();

    private void Awake()
    {
        UpdateCharacterStats();
    }

    private void UpdateCharacterStats()
    {
        AttackSO attackSO = null;
        if(baseStats.attackSO != null)
        {
            attackSO = Instantiate(baseStats.attackSO);	// 가상으로 하나를 복제함
        }

        CurrentStates = new CharacterStats { attackSO = attackSO };

        // 복사 (임시)
        CurrentStates.statsChangeType = baseStats.statsChangeType;
        CurrentStates.maxHealth = baseStats.maxHealth;
        CurrentStates.speed = baseStats.speed;

    }
}

 

 

설정 방법


원거리 공격 스텟을 설정하기 위해 Ranged 클릭

 

 

스텟을 설정

 

 

캐릭터에 CharacterStatsHandler 스크립트 드래그, AttackSO에 ScriptableObject 드래그

'유니티' 카테고리의 다른 글

Object Pool  (0) 2023.12.08
싱글톤  (1) 2023.12.08
사운드 슬라이더 바 만들기  (1) 2023.12.05
데이터 저장, 불러오기 (PlayerPrefs)  (1) 2023.12.05
사운드  (0) 2023.12.04