내일배움캠프 TIL

내일배움캠프 46일차 TIL "유닛 스탯 적용 트러블 슈팅"

Jooglorystar 2024. 11. 21. 22:04

 

적 유닛을 생성하는데, 오브젝트 풀에서 생성하고, 적절한 SO를 삽입하여 다른 캐릭터로 만드는 것을 구현하고자 다음과 같은 코드를 작성하였다.

 

GameObject obj = GameManager.Instance.ObjectPool.SpawnFromPool("Enemy_Swordman");

Unit unit = obj.GetComponent<Unit>();

int value = Random.Range(0, enemyUnitSOs.Length);

unit.unitStat.unitSO = enemyUnitSOs[value];

// 스폰 Y축 설정
unit.transform.position = enemySpawnPos.position;
int genPosYValue = Random.Range(-2, 3);
unit.GetComponentInChildren<SpriteRenderer>().sortingOrder -= genPosYValue;
genPosVariation = new Vector3(0f, genPosYValue * 0.1f, 0f);

unit.transform.position += genPosVariation;

 

 

그런데, 애니메이터와 같은 외형적인 부분은 적용이 되지만, 공격력, 이동속도 같은 내부 스탯은 제대로 적용되지 않는 문제가 있었다.

 

원인을 찾아보니, 유닛들의 스탯이 유닛스탯SO를 갈아 끼기 전에 끼고 있던 유닛의 데이터를 그대로 가지고 있는 것이 확인 되었다.

오브젝트 풀에서 생성될 때, 기존 스탯으로 적용이 되고, 유닛을 생성할 때, 스탯 데이터를 교체해도 다시 스탯을 정해주는 부분이 없어서 생기는 문제로 판단되었다.

 

그래서 다음과 같이 스탯을 초기화해주는 메서드를 다시 선언함으로서 문제를 해결할 수 있었다.

 

GameObject obj = GameManager.Instance.ObjectPool.SpawnFromPool("Enemy_Swordman");

Unit unit = obj.GetComponent<Unit>();

int value = Random.Range(0, enemyUnitSOs.Length);

unit.unitStat.unitSO = enemyUnitSOs[value];
unit.unitStat.SetLevel();
unit.unitStat.SetStatAsLevel();

// 스폰 Y축 설정
unit.transform.position = enemySpawnPos.position;
int genPosYValue = Random.Range(-2, 3);
unit.GetComponentInChildren<SpriteRenderer>().sortingOrder -= genPosYValue;
genPosVariation = new Vector3(0f, genPosYValue * 0.1f, 0f);

unit.transform.position += genPosVariation;