반응형

오브젝트 스폰(Object Spawn)


유니티에서 게임 오브젝트를 생성할 때는, Instantiate() 함수를 사용해서 생성한다. 이것을 스폰(Spawn)이라고 한다. 하지만 이러한 스폰은 당연하게도 단순히 Instantiate() 함수만 호출해서 소환한다고 해서 자동으로 네트워크에서 스폰되고 동기화되는 것은 아니다. 평범하게 스폰된 게임 오브젝트를 네트워크에서 스폰하고 동기화하기 위해서는 유니티에서 정한 일련의 제약과 과정을 거쳐야 한다.


먼저 오브젝트가 네트워크로 스폰되기 위해서는 네트워크 매니저의 spawnPrefabs라는 리스트에 스폰 가능한 프리팹으로 등록되어 있어야 하는데 여기에 등록될 프리팹은 반드시 루트 게임 오브젝트에 NetworkIdentity 컴포넌트를 가지고 있어야 하며, Network Behaviour 스크립트는 반드시 이 Network Identity 컴포넌트와 동일한 게임 오브젝트에 있어야 한다.



정상적으로 Network Identity 컴포넌트를 가진 프리팹의 경우 Inspector 뷰에서 확인해보면 프리팹에 Asset ID가 고유한 값으로 할당되어 있는 것을 확인할 수 있다. 네트워크 매니저는 이 Asset ID를 통해 지금 네트워크 스폰하려는 오브젝트가 유효하게 spawnPrefabs에 등록되어 있는 프리팹인지 확인하고 스폰하게 된다.





이렇게 제대로 만들어진 프리팹을 spawnPrefabs 리스트에 등록하는 것은 스크립트에서도 가능하고 유니티 에디터에서도 가능하다.




using UnityEngine;
using UnityEngine.Networking;

public class SpawnObjTestNetManager : NetworkManager
{
    void Awake ()
    {
        // Resources 폴더에 있는 Character라는 이름을 가진 프리팹 파일을 가져온다.
        GameObject prefab = Resources.Load<GameObject>("Character");
        // spawnPrefabs 리스트에 스폰할 오브젝트를 추가
        spawnPrefabs.Add(prefab);
    }
}


위의 예시와 같이 spawnPrefabs에 등록된 프리팹들은 네트워크를 통해 스폰 가능해진다. 네트워크를 통해 스폰하는 예시 코드는 다음과 같다.


using UnityEngine;
using UnityEngine.Networking;

public class SpawnObjTestNetManager : NetworkManager
{

    // 서버측에서 클라이언트가 접속했을 때의 콜백
    public override void OnServerConnect(NetworkConnection conn)
    {
        base.OnServerConnect(conn);
        // spawnPrefabs에 등록된 프리팹을 스폰한다.
        GameObject charObj = Instantiate(spawnPrefabs[0]);

        // 네트워크를 통해서 이 오브젝트가 생성되었음을 클라이언트에 알린다.
        NetworkServer.Spawn(charObj);
    }
}


위의 예시들을 따라 작성하고 빌드하여 서버에 클라이언트를 접속시키면 Character 프리팹이 서버와 클라이언트 양측에 모두 소환되는 것을 확인할 수 있다.





스폰된 오브젝트는 유니티 네트워크의 스포닝 시스템이 관리하게 되며, 스포닝 시스템에 속하게 된 오브젝트가 서버에서 변화가 있으면 그것이 클라이언트에도 전송되고, 서버에서 오브젝트가 소멸하면 클라이언트에서도 소멸하게 된다. 그리고 스폰된 오브젝트는 서버가 관리하는 네트워크 오브젝트 집합에도 추가되기 때문에, 이후에 다른 클라이언트가 게임에 참여하더라도 프로그래머가 별도의 처리를 만들 필요없이 자동으로 오브젝트가 소환되고 동기화 되어야할 값들이 동기화된다.



또한 스폰된 오브젝트는 각각 서버와 클라이언트에서 동일한 "netId"라고 하는 고유한 네트워크 인스턴스 ID를 가지게 되는데, 이 ID를 통해서 각각의 오브젝트에 메시지를 보내고 식별할 수 있다.




네트워크를 통해 오브젝트가 생성되는 자세한 과정은 유니티 네트워크 문서를 통해 확인할 수 있다.


https://docs.unity3d.com/kr/current/Manual/UNetSpawning.html

반응형

+ Recent posts