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

고현규·2024년 2월 22일
0
post-custom-banner

적이 발사하는 발사체 정보를 받아온 뒤에
해당 정보의 발사체가 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
게임 개발과 기획
post-custom-banner

0개의 댓글