[Unity] 오브젝트 공유 문제 해결

고현규·2024년 2월 22일

적이 발사하는 발사체 정보를 받아온 뒤에
해당 정보의 발사체가 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부분을 삭제했다.

profile
게임 개발과 기획

0개의 댓글