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 |