적이 발사하는 발사체 정보를 받아온 뒤에
해당 정보의 발사체가 ObjectPool 발사체의 자식에 있는지 이름으로 확인하고
있다면 그걸 사용, 없으면 새로 생성하는 코드를 만들었다.
public void SetProjectile(GameObject VFX, long Damage)
{
this.Damage = Damage;
this.ProjectileVFX = VFX;
has = false;
if (ProjectileVFX != null && transform.childCount > 0)
{
for (int i = 0; i < transform.childCount; i++)
{
if (this.transform.GetChild(i).gameObject.name == ProjectileVFX.name)
{
has = true;
this.transform.GetChild(i).gameObject.SetActive(true);
break;
}
}
if (!has)
{
GameObject go = Instantiate(ProjectileVFX, transform.position, Quaternion.identity, gameObject.transform);
int index = go.name.IndexOf("(Clone)");
if (index > 0)
{
go.name = go.name.Substring(0, index);
}
}
}
}
이 코드를 처음에는 OnEnable()함수에 작성했었는데 받은 정보와 Active되는 오브젝트가 제각각이였다.
OnEnable()함수에 작성하는 것이 아닌, 새로운 함수로 작성한 뒤 원하는 타이밍에 실행할 수 있도록 제어했다.
아래와 같이 프로젝타일을 생성할 때 위의 함수를 호출하는 방식으로 문제를 해결했다.
private void CreateProjectail()
{
//Resources 폴더에서 EnemyProjectileFrame(발사체 틀)을 생성하고 go로 할당받음
var go = Manager.ObjectPool.GetGo("EnemyProjectileFrame");
go.transform.position = gameObject.transform.position;
//발사체 초기화를 위해 정보를 넘겨줌
go.GetComponent<EnemyProjectileHandler>().SetProjectile(_enemyBlueprint.ProjectailVFX, _damage);
}
게임 오브젝트 비교는 실패하여 이름이 같은지 비교했다.
Instatiate를 하면 (Clone)이 생성되기 때문에, 생성할 때 Clone부분을 삭제했다.