はじめに
こちらのチュートリアルを参考にPhotonFusionのお勉強をしていたところ、
ジャンプ処理をGetKey()
で処理してるのを、ボタン押したときだけ適用させたいな~と思ったので、
この記事を書いてみました
つくりかた
めっちゃ悩んだけど、全然難しいことではなかった
結論:入力構造体(INetworkInput
)にUpdate
で入力状態して、コールバックのOnInput
でセットする
-
入力管理する感じのクラス作って、
INetworkRunnerCallbacks
実装する.cspublic class GameLauncher : SimulationBehaviour, INetworkRunnerCallbacks {}
-
そんなかにコールバック定義
.cs// これだけ使います public void OnInput(NetworkRunner runner, NetworkInput input) { } 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 OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { } public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ArraySegment<byte> data) { } public void OnSceneLoadDone(NetworkRunner runner) { } public void OnSceneLoadStart(NetworkRunner runner) { }
-
自作の入力構造体とボタン列挙体作る
- ボタンは
NetworkButtons
というのを使います
.cs// 構造体 public struct NetworkInputData : INetworkInput { public Vector3 Dir; public NetworkButtons Buttons; } // ボタン列挙体 public enum InputButtons { Jump, }
- ボタンは
-
入力構造体を入力管理クラスに宣言
.cspublic class GameLauncher : SimulationBehaviour, INetworkRunnerCallbacks { NetworkInputData inputData; // ... }
-
Update
にボタンの判定処理実装する-
NetworkButtons.Set()
で列挙体の値と入力判定値を入れる
.csvoid Update(){ inputData.Buttons.Set(InputButtons.Jump, Input.GetKeyDown(KeyCode.Space)); }
-
-
OnInput
コールバックにこんな感じで書く-
input.Set()
で入力値をセットする - 最後に
default
を代入して、現在のフレームの入力データをリセットする
.cspublic void OnInput(NetworkRunner runner, NetworkInput input) { // データ適用 input.Set(inputData); // データリセット inputData = default; }
-
取得
NetworkBehavior
を継承させたクラスのFixedUpdateNetwork
内にこんな感じの処理書く
-
GetInput()
でOnInput
コールバック内でセットされた値を取得できる -
Buttons.IsSet()
で、指定したボタンの入力状態を取得できる
Client.cs
if(Object.HasStateAuthority){
if (GetInput(out NetworkInputData data)) {
// ジャンプ入力判定
if (data.Buttons.IsSet(InputButtons.Jump)) {
print("pressed");
}
}
}
参考