PhotonFusionを使うにあたって、チュートリアル100をやってみたので、実行可能なソースコードと実行結果をまとめてみます。
Fusion 100
Fusion SDKのバージョンや概要がまとめられています。
Fusion 101 - Getting Started
Fusion 101ではUnityにFusionを導入する手順がまとめられています。
Fusion 102 - シーンをセットアップする
Fusion 102では基本のネットワークセットアップ方法を説明しています。
上記を参考にするとNetworkCharacterControllerと古い記述があるので、すべてNetworkCharacterControllerPrototypeに置換します。
NetworkInputData.cs
```C#
using Fusion;
using UnityEngine;
public struct NetworkInputData : INetworkInput
{
public Vector3 direction;
}
```
BasicSpawner.cs
```C# using Fusion.Sockets; using Fusion; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class BasicSpawner : MonoBehaviour, INetworkRunnerCallbacks { public void OnInput(NetworkRunner runner, NetworkInput input) { var data = new NetworkInputData(); if (Input.GetKey(KeyCode.W)) data.direction += Vector3.forward; if (Input.GetKey(KeyCode.S)) data.direction += Vector3.back; if (Input.GetKey(KeyCode.A)) data.direction += Vector3.left; if (Input.GetKey(KeyCode.D)) data.direction += Vector3.right; input.Set(data); } public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { throw new NotImplementedException(); } [SerializeField] private NetworkPrefabRef _playerPrefab; private Dictionary<PlayerRef, NetworkObject> _spawnedCharacters = new Dictionary<PlayerRef, NetworkObject>(); public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { if (runner.IsServer) { // Create a unique position for the player Vector3 spawnPosition = new Vector3((player.RawEncoded % runner.Config.Simulation.DefaultPlayers) * 3, 1, 0); NetworkObject networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player); // Keep track of the player avatars so we can remove it when they disconnect _spawnedCharacters.Add(player, networkPlayerObject); } } public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { // Find and remove the players avatar if (_spawnedCharacters.TryGetValue(player, out NetworkObject networkObject)) { runner.Despawn(networkObject); _spawnedCharacters.Remove(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, ListsessionList) { } public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { } public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ArraySegment data) { } public void OnSceneLoadDone(NetworkRunner runner) { } public void OnSceneLoadStart(NetworkRunner runner) { } NetworkRunner _runner; async void StartGame(GameMode mode) { // Create the Fusion runner and let it know that we will be providing user input _runner = gameObject.AddComponent (); _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 () }); } private void OnGUI() { if (_runner == null) { if (GUI.Button(new Rect(0, 0, 200, 40), "Host")) { StartGame(GameMode.Host); } if (GUI.Button(new Rect(0, 40, 200, 40), "Join")) { StartGame(GameMode.Client); } } } } ```
Player.cs
```C#
using Fusion; public class Player : NetworkBehaviour { private NetworkCharacterControllerPrototype _cc; private void Awake() { _cc = GetComponent(); } public override void FixedUpdateNetwork() { if (GetInput(out NetworkInputData data)) { data.direction.Normalize(); _cc.Move(5 * data.direction * Runner.DeltaTime); } } } ```
実行結果
PhotonFusion始めました!#unity #gamediv pic.twitter.com/ZL6qilDfYZ
— ジェイ@ゲーム制作VTuber (@JY20160816) 2022年12月28日