TIL (89) | 2023.11.30 | SO데이터 넣어주기

kjg5370·2023년 11월 30일
0

TIL

목록 보기
87/91
post-thumbnail

들어가기 앞서

오늘은 적의 능력치를 조정해주는 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) 데이터와 같은 값을 설정하는 것은 유지보수의 어려움, 값의 불일치, 코드와 데이터 간 분리 부재, 프로젝트 복잡성 증가, 그리고 실수 및 버그 발생 가능성을 초래할 수 있습니다. 대신, 스크립트를 활용하여 데이터를 설정함으로써 코드의 일관성과 유지보수성을 높일 뿐 아니라 실수를 최소화하고 프로젝트의 효율성을 향상시킬 수 있습니다.

profile
학생입니다

0개의 댓글