오늘은 적의 능력치를 조정해주는 EnemySO 데이터를 Hierarchy창에서 직접 넣어주는 방식이 아닌 스크립트를 통해 Enemy를 스폰할 때 넣어주도록 바꿔주었습니다.
SO데이터를 직접 넣지 않은 이유
유연성 및 수정 용이성: 스크립트를 사용하여 Enemy를 스폰할 때 SO 데이터를 설정하면, 나중에 SO 데이터에 변경이 생겼을 때 스크립트만 수정하면 되므로 유연성이 향상.
자동화 및 일괄 처리: 스크립트를 통한 스폰 방식은 자동화와 일괄 처리에 용이.
여러 Enemy를 생성하거나 일괄적으로 속성을 변경해야 할 때 스크립트를 사용하는 것이 효과적.
유지보수 용이성: 코드를 수정하거나 새로운 기능을 추가할 때 더 깔끔하게 처리할 수 있음.
SO컨테이너
EnemySO는 각자 적의 종류에 따라 총 4개가 이것들을 한꺼번에 관리할 수 있도록 컨테이너를 만듦.
public class EnemySODatas : ScriptableObject { [field: SerializeField] public EnemySO EnemyBaseSO { get; private set; } [field: SerializeField] public EnemySO EnemyMeleeSO { get; private set; } [field: SerializeField] public EnemySO EnemySniperSO { get; private set; } [field: SerializeField] public EnemySO EnemyEliteSO { get; private set; } }
EnemySpawn에 넣어주기
public void SpawnEnemie(EnemySpawnData spawnData) { GameObject enemy = null; switch (spawnData.statsChangeType) { case StatsChangeType.Melee: enemy = enemyPrefabMelee[Random.Range(0, enemyPrefabMelee.Length)]; enemy.GetComponent<Enemy>().Data = enemyDatas.EnemyMeleeSO; break; case StatsChangeType.Rifle: enemy = enemyPrefabRifle[Random.Range(0, enemyPrefabRifle.Length)]; enemy.GetComponent<Enemy>().Data = enemyDatas.EnemyBaseSO; break; case StatsChangeType.Sniper: enemy = enemyPrefabSniper[Random.Range(0, enemyPrefabSniper.Length)]; enemy.GetComponent<Enemy>().Data = enemyDatas.EnemySniperSO; break; case StatsChangeType.Sniper2: enemy = enemyPrefabStandingSniper[Random.Range(0, enemyPrefabStandingSniper.Length)]; enemy.GetComponent<Enemy>().Data = enemyDatas.EnemySniperSO; break; case StatsChangeType.Elite: enemy = enemyPrefabElite[Random.Range(0, enemyPrefabElite.Length)]; enemy.GetComponent<Enemy>().Data = enemyDatas.EnemyEliteSO; break; } if (enemy == null) return; enemy = Instantiate(enemy, spawnData.position, Quaternion.identity); Health enemyHealth = enemy.GetComponent<Health>(); enemyHealth.OnDie += OnEnemyDied; enemyCount++; spawnedEnemies.Add(enemy); }
각각의 타입의 Enemy를 생성할 때 넣어 주었습니다.
직접 인스펙터에서 ScriptableObject(SO) 데이터와 같은 값을 설정하는 것은 유지보수의 어려움, 값의 불일치, 코드와 데이터 간 분리 부재, 프로젝트 복잡성 증가, 그리고 실수 및 버그 발생 가능성을 초래할 수 있습니다. 대신, 스크립트를 활용하여 데이터를 설정함으로써 코드의 일관성과 유지보수성을 높일 뿐 아니라 실수를 최소화하고 프로젝트의 효율성을 향상시킬 수 있습니다.