[Error] Photon - Fusion 2 Init Network Object after Spawning

qweasfjbv·2024년 7월 16일

Error

목록 보기
3/7
post-thumbnail

문제


NetworkObject 를 스폰하고 난 직후에 해당 객체의 컴포넌트를 초기화하는 함수를 호출하면 가끔씩 제대로 호출이 되지 않는 경우가 생겼습니다.
항상 그러는 것도 아니고, 1~2번은 잘 되다가 세 번쨰 부터 초기화가 제대로 되지 않아서 네트워크 부분에 문제가 있다고 생각했습니다.

문제가 발생한 부분입니다.


		NetworkGridInfo grid;

        for (int i = 0; i < mapArrs.Count; i++)
        {
            grid = mapArrs[i];
            NetworkedMapGrids.Set(new Vector2Int(grid.Pos.y, grid.Pos.x), runner.Spawn(gridPrefab, new Vector3(grid.Pos.x, 0, grid.Pos.y) * Constant.GRID_SIZE, Quaternion.identity).GetComponent<MapGrid>());
            NetworkedMapGrids[new Vector2Int(grid.Pos.y, grid.Pos.x)].transform.localScale = Vector3.one * Constant.GRID_SIZE;
            NetworkedMapGrids[new Vector2Int(grid.Pos.y, grid.Pos.x)].InitMapGrid(grid);

        }

순서는 다음과 같습니다.
1. Runner 를 통해 Spawn 하면서 Dictionary 에 Set
2. 해당 Network Object의 localscale 변경
3. 해당 Network Object의 Component 의 초기화 함수 호출

여기서 문제가 발생한 부분은 transform 과 관련된 부분이었습니다.

아래는 정상 실행 화면과 에러가 난 실행 화면입니다.

해결


해결 방법은 Fusion 2 공식 문서에서 찾을 수 있었습니다.
OnBeforeSpawned 부분에서 Spawn 함수에 Init 함수를 인자로 넘겨줄 수 있습니다.

다만, Renderer 컴포넌트에 접근하는 부분은 Spawn 되기 전이기 때문에 AfterSpawn 콜백 함수에서 다시 실행해주었습니다.

        NetworkGridInfo grid;

        for (int i = 0; i < mapArrs.Count; i++)
        {
            grid = mapArrs[i];
            var sp = runner.Spawn(gridPrefab, new Vector3(grid.Pos.x, 0, grid.Pos.y) * Constant.GRID_SIZE, Quaternion.identity,
               inputAuthority: null,
               (runner, NO) => NO.GetComponent<MapGrid>().InitMapGrid(grid));

            NetworkedMapGrids.Set(new Vector2Int(grid.Pos.y, grid.Pos.x), sp.GetComponent<MapGrid>());

        }

localscale을 조정하는 부분을 컴포넌트의 초기화 함수에 넣고, 그 함수를 OnBeforeSpawned에 인자로 넘겨서 실행시켰습니다.

참고자료


https://doc.photonengine.com/ko-kr/fusion/current/manual/spawning

0개의 댓글