- PhotonFusionのチュートリアルにおけるこちらの公式ドキュメント https://doc.photonengine.com/ja-jp/fusion/current/fusion-100/fusion-102 (現在2023/02/08)がそのまま書いても動作しないので備忘録
- 1.
INetworkRunnerCallbaks
インターフェイスをクラスに追加する際、OnInput
メソッドとOnHostMigration
メソッドも実装しなければならない。正しくは以下
public class BasicSpawner : MonoBehaviour, INetworkRunnerCallbacks
{
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { }
public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { }
public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { }
public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { }
public void OnConnectedToServer(NetworkRunner runner) { }
public void OnDisconnectedFromServer(NetworkRunner runner) { }
public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { }
public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { }
public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { }
public void OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList) { }
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { }
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ArraySegment<byte> data) { }
public void OnSceneLoadDone(NetworkRunner runner) { }
public void OnSceneLoadStart(NetworkRunner runner) { }
//ここが必要!
public void OnInput(NetworkRunner runner, NetworkInput input) { }
public void OnHostMigration(NetworkRunner runner, HostMigrationToken token) { }
}
- また
StartGameArgs
に定義されているメンバ変数はObjectSceneProvider
ではなくSceneManager
である
async void StartGame(GameMode mode)
{
// Create the Fusion runner and let it know that we will be providing user input
_runner = gameObject.AddComponent<NetworkRunner>();
_runner.ProvideInput = true;
// Start or join (depends on gamemode) a session with a specific name
await _runner.StartGame(new StartGameArgs()
{
GameMode = mode,
SessionName = "TestRoom",
Scene = SceneManager.GetActiveScene().buildIndex,
//ここが変更!
SceneManager = gameObject.AddComponent<NetworkSceneManagerBase>()
});
}
- さらに
Player
関数を書く際、NetwowrkCharacterController
で入力を受け渡しているが、これは非推奨であり、正しくはNetworkCharacterControllerPrototype
でなければならない。
public class Player : NetworkBehaviour
{
//ここが変更!
private NetworkCharacterControllerPrototype _cc;
private void Awake()
{
//ここが変更!
_cc = GetComponent<NetworkCharacterControllerPrototype>();
}
public override void FixedUpdateNetwork()
{
if (GetInput(out NetworkInputData data))
{
data.direction.Normalize();
_cc.Move(5 * data.direction * Runner.DeltaTime);
}
}
}
このとき、アタッチするコンポーネントもNetworkCharacterControllerPrototype
にすることを忘れないこと。
- なお1,2番目は日本語・英語ドキュメント両方で間違っており、3番目は日本語ドキュメントのみ間違っている。うまくいかないときは英語ドキュメントをまず調べることも重要そうだ