집게사장의 꿈

NetworkRunner.IsServer || StateGameResult.Ok [결론...삽질...] 본문

유니티/Fusion

NetworkRunner.IsServer || StateGameResult.Ok [결론...삽질...]

Krapboss 2024. 7. 13. 01:00
문제점

 

Shared 모드를 사용하여 Fusion을 이용한 멀티게임 제작 중

멀티게임 씬에서의 서버 연결이 자동으로 ShutDown 되는 현상이 발견됨.

 

원래는 대기 시간이 표시되면서 현재 퍼즐 배경이 제거 되지 않고 존재해야된다.

 

 

 

해결

NetworkRunner.IsServer || StateGameResult.Ok
문제점은 위 두가지 조건문으로 씬을 불러올 때 발생하는 문제였는데,

 

StateGameResult.Ok

모든 클라이언트와 서버에서 씬을 로드를 한다.

 

이건, 네트워크 게임을 연결하고 시작할 때, 현재 연결을 시도한 클라이언트에서 실행되면 안되는데 서버와 동시에 실행이 되면서 문제가 발생했던 것이다.

 

//게임 시작을 위한 설정을 진행한다.
var result = await _runnerInstance.StartGame(startGameArgs);

//서버에 연결된 상태일 경우
if(result.Ok)
{
    CustomDebug.Print("서버 연결 성공 접속 시도");
    //씬을 호출합니다.
    await _runnerInstance.LoadScene(sceneName);
}

 

 

서버 뿐만 아니라 클라이언트에서도 씬을 중복으로 생성하다 보니까

씬마다 하나씩 있어야될 매니저가 2개씩 생성된 걸 확인할 수 있었다.

 

뿐만 아니라 

CustomDebug.Print("서버 연결 성공 접속 시도");

로 로그가 찍히면서, 클라이언트에서도 씬 호출을 시도한 것을 알 수 있었다.

서버에서만 씬을 생성한다면, 로그가 보이지 않는다.

 

 

 

 

NetworkRunner.IsServer

서버에서만 씬을 로드

 

씬 호출을 서버에서만 실행하도록 하는 것이기 때문에, 정상적으로 작동했다.

 

await _runnerInstance.StartGame(startGameArgs);

if (_runnerInstance.IsServer)
{
    CustomDebug.Print("서버 연결 성공 접속 시도");
    //씬을 호출합니다.
    await _runnerInstance.LoadScene(sceneName);
}

 

 


 

삽질에...다달은...결론....

 

결론적으로는 해당 함수는 서버에서만 실행이 되는 것이다.!

결국 저 조건문 자체가 필요하지 않았다.

 

runner.StartGame() 파라미터에 이미 게임에 대한 정보가 들어가 있기 때문이다.

 

 

 

아침에 살펴보니....(지금 06시.......)

아무래도 새벽에 작성한다고....머리가 과부화 걸려 무엇이 문제인지 파악하지 못한 것 같다.

 

클라우드에 코드가 복제된다는 생각은...참 신박하다.

왜 아무리 찾아도 자료가 안나오는지 이제야 이해했다....

 

 


 

 

Shared 모드에서는 Cloud 를 거쳐서 데이터가 동기화

 

포톤 공식 문서를 보면 Shared 모드에서는 Simulation 의 IsServer는 클라이언트의 경우에는 False만 반환한다.

 

 

Ref

https://www.youtube.com/watch?v=TDlFWfE-scg

https://doc-api.photonengine.com/en/fusion/v2/class_fusion_1_1_simulation.html

 

Photon Fusion: Simulation Class Reference

Main simulation class. More... Inherits ILogSourceProxy, and INetPeerGroupCallbacks. void GetAreaOfInterestGizmoData (List<(Vector3 center, Vector3 size, int playerCount, int objectCount)> result)  Clears the provided list and populates it with data abou

doc-api.photonengine.com

 

'유니티 > Fusion' 카테고리의 다른 글

flag |= NetworkObjectFlags.MasterClientObject;  (0) 2024.06.18
Fusion 기본 정보  (1) 2024.06.06
[뜯어보기] Asteroids.SharedSimple  (0) 2024.06.06
photon fusion tutorial #3  (1) 2024.06.04
Photon Fusion Tutorial #2  (0) 2024.06.04