
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