「Unity/photon/fusion/SharedMode」の版間の差分
提供: 初心者エンジニアの簡易メモ
(同じ利用者による、間の21版が非表示) | |||
行3: | 行3: | ||
https://doc.photonengine.com/ja-jp/fusion/current/tutorials/shared-mode-basics/1-getting-started | https://doc.photonengine.com/ja-jp/fusion/current/tutorials/shared-mode-basics/1-getting-started | ||
− | == | + | ==準備== |
− | # [[Unity/photon/fusion/インストール]] [ショートカット] | + | #アセットのシリアル化を実行 [Edit > Project Settings > Editor > Asset Serialization > ModeのForce Text] (初期設定なので、設定されてるかも) |
− | # | + | #Mono Cecilのインストール(Window > Package Manager > 右上+をクリック > Add package from git URL、"com.unity.nuget.mono-cecil"で、追加) |
+ | #[[Unity/photon/fusion/インストール]] [ショートカット] | ||
+ | |||
+ | ==シーン初期設定== | ||
+ | #空のシーンを作成 | ||
+ | #Window/Fusion/GameObject/Setup/Networkingを選択し、"Prototype Network Start"と、"Prototype Runner"を、追加する。 | ||
+ | #Unityを再生すると、Start~な感じのダイアログが出て実行できることを確認。 | ||
+ | #SharedModeにするために、"Prototype Network Start"のStartModeをAutomaticにして、AutoStartAsをSharedにする。 | ||
+ | |||
+ | ===clientCountが0エラーが出る場合=== | ||
+ | エラー詳細 | ||
+ | GameMode is set to Shared, and clientCount is set to zero. Starting no network runners. | ||
+ | 対応方法 | ||
+ | #"Phototype Network Start"のStartModeを、UserInterfaceにして、起動時にSharedを選択すれば、このエラーは消える | ||
+ | |||
+ | ==同期キャラクタ作成== | ||
+ | #空オブジェクトを作成し、名前を"PlayerCharacter"に | ||
+ | #作ったObjectのInspectorを開いて、NetworkObjectを、AddComponentする。 | ||
+ | #一旦、NetworkObjectの"Destroy When State Authority Leaves"にチェックして、削除同期させる。 | ||
+ | #Allow State Authority Overrideのチェックを外して、他のクライアントが操作できるようにする。 | ||
+ | #CharacterControllerをAddComponentする。これはキャラ操作用。 | ||
+ | #NetworkTransformをAddComponentする。 | ||
+ | #3dObject/Capsuleを作成し、"Interpolation Target"に名前を変更する。CapsuleColliderを削除。それを、PlayerCharacterの下に、移動。 | ||
+ | #PlayerCharacterのNetworkTransformのInterpoplationTargetに、↑で作成したInterpoplationTargetを入れる。 | ||
+ | #PlayerCharacterをProject側のPrefabsのディレクトリに移動。 | ||
+ | ==プレイヤー生成== | ||
+ | <pre> | ||
+ | using Fusion; | ||
+ | using UnityEngine; | ||
+ | public class PlayerSpawner : SimulationBehaviour, IPlayerJoined | ||
+ | { | ||
+ | public GameObject PlayerPrefab; | ||
+ | |||
+ | public void PlayerJoined(PlayerRef player) | ||
+ | { | ||
+ | if (player == Runner.LocalPlayer) | ||
+ | { | ||
+ | Runner.Spawn(PlayerPrefab, new Vector3(0, 1, 0), Quaternion.identity, player); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | #PlayerSpawner.csを作り、上記をコピペ。 | ||
+ | #"Prototype Runner"オブジェクトに、PlayerSpawnerをAddComponentする | ||
+ | |||
+ | ==プレイヤー操作== | ||
+ | <pre> | ||
+ | using System.Collections; | ||
+ | using System.Collections.Generic; | ||
+ | using UnityEngine; | ||
+ | using Fusion; | ||
+ | |||
+ | public class PlayerMovement : NetworkBehaviour | ||
+ | { | ||
+ | public Camera Camera; | ||
+ | float PlayerSpeed = 10f; | ||
+ | private Vector3 velocity; | ||
+ | CharacterController Controller; | ||
+ | private void Start() | ||
+ | { | ||
+ | velocity = Vector3.zero; | ||
+ | Controller = GetComponent<CharacterController>(); | ||
+ | } | ||
+ | public override void FixedUpdateNetwork() | ||
+ | { | ||
+ | // Only move own player and not every other player. Each player controls its own player object. | ||
+ | if (!HasStateAuthority) | ||
+ | { | ||
+ | return; | ||
+ | } | ||
+ | //var cameraRotationY = Quaternion.Euler(0, Camera.transform.rotation.eulerAngles.y, 0); | ||
+ | //Vector3 move = cameraRotationY * new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed; | ||
+ | Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed; | ||
+ | if (Controller != null) | ||
+ | { | ||
+ | Controller!.Move(move + velocity * Runner.DeltaTime); | ||
+ | } | ||
+ | |||
+ | if (move != Vector3.zero) | ||
+ | { | ||
+ | gameObject.transform.forward = move; | ||
+ | } | ||
+ | } | ||
+ | public override void Spawned() | ||
+ | { | ||
+ | if (HasStateAuthority) | ||
+ | { | ||
+ | Camera = Camera.main; | ||
+ | Camera.GetComponent<FirstPersonCamera>().Target = GetComponent<NetworkTransform>().InterpolationTarget; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </pre> | ||
+ | #PlayerMovement.csを作成して、上記をコピペ | ||
+ | #PrefabのPlayerCharacterオブジェクトに、PlayerMovementをAddComponentする | ||
+ | |||
+ | HasStateAuthorityは、自分のプレイヤーのときのみ、trueとなる。 | ||
+ | |||
+ | ==一人称カメラ設定== | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | |||
+ | public class FirstPersonCamera : MonoBehaviour | ||
+ | { | ||
+ | public Transform Target; | ||
+ | public float MouseSensitivity = 10f; | ||
+ | |||
+ | private float vertialRotation; | ||
+ | private float horizontalRotation; | ||
+ | |||
+ | void LateUpdate() | ||
+ | { | ||
+ | if (Target == null) | ||
+ | { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | transform.position = Target.position; | ||
+ | |||
+ | float mouseX = Input.GetAxis("Mouse X"); | ||
+ | float mouseY = Input.GetAxis("Mouse Y"); | ||
+ | |||
+ | vertialRotation -= mouseY * MouseSensitivity; | ||
+ | vertialRotation = Mathf.Clamp(vertialRotation, -70f, 70f); | ||
+ | |||
+ | horizontalRotation += mouseX * MouseSensitivity; | ||
+ | |||
+ | transform.rotation = Quaternion.Euler(vertialRotation, horizontalRotation, 0); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | #FirstPersonCamera.csを作成して、上記をコピペ | ||
+ | #MainCameraオブジェクトに、FirstPersonCameraをAddComponentする |
2023年11月6日 (月) 21:14時点における最新版
公式
始め方 https://doc.photonengine.com/ja-jp/fusion/current/tutorials/shared-mode-basics/1-getting-started
準備
- アセットのシリアル化を実行 [Edit > Project Settings > Editor > Asset Serialization > ModeのForce Text] (初期設定なので、設定されてるかも)
- Mono Cecilのインストール(Window > Package Manager > 右上+をクリック > Add package from git URL、"com.unity.nuget.mono-cecil"で、追加)
- Unity/photon/fusion/インストール [ショートカット]
シーン初期設定
- 空のシーンを作成
- Window/Fusion/GameObject/Setup/Networkingを選択し、"Prototype Network Start"と、"Prototype Runner"を、追加する。
- Unityを再生すると、Start~な感じのダイアログが出て実行できることを確認。
- SharedModeにするために、"Prototype Network Start"のStartModeをAutomaticにして、AutoStartAsをSharedにする。
clientCountが0エラーが出る場合
エラー詳細
GameMode is set to Shared, and clientCount is set to zero. Starting no network runners.
対応方法
- "Phototype Network Start"のStartModeを、UserInterfaceにして、起動時にSharedを選択すれば、このエラーは消える
同期キャラクタ作成
- 空オブジェクトを作成し、名前を"PlayerCharacter"に
- 作ったObjectのInspectorを開いて、NetworkObjectを、AddComponentする。
- 一旦、NetworkObjectの"Destroy When State Authority Leaves"にチェックして、削除同期させる。
- Allow State Authority Overrideのチェックを外して、他のクライアントが操作できるようにする。
- CharacterControllerをAddComponentする。これはキャラ操作用。
- NetworkTransformをAddComponentする。
- 3dObject/Capsuleを作成し、"Interpolation Target"に名前を変更する。CapsuleColliderを削除。それを、PlayerCharacterの下に、移動。
- PlayerCharacterのNetworkTransformのInterpoplationTargetに、↑で作成したInterpoplationTargetを入れる。
- PlayerCharacterをProject側のPrefabsのディレクトリに移動。
プレイヤー生成
using Fusion; using UnityEngine; public class PlayerSpawner : SimulationBehaviour, IPlayerJoined { public GameObject PlayerPrefab; public void PlayerJoined(PlayerRef player) { if (player == Runner.LocalPlayer) { Runner.Spawn(PlayerPrefab, new Vector3(0, 1, 0), Quaternion.identity, player); } } }
- PlayerSpawner.csを作り、上記をコピペ。
- "Prototype Runner"オブジェクトに、PlayerSpawnerをAddComponentする
プレイヤー操作
using System.Collections; using System.Collections.Generic; using UnityEngine; using Fusion; public class PlayerMovement : NetworkBehaviour { public Camera Camera; float PlayerSpeed = 10f; private Vector3 velocity; CharacterController Controller; private void Start() { velocity = Vector3.zero; Controller = GetComponent<CharacterController>(); } public override void FixedUpdateNetwork() { // Only move own player and not every other player. Each player controls its own player object. if (!HasStateAuthority) { return; } //var cameraRotationY = Quaternion.Euler(0, Camera.transform.rotation.eulerAngles.y, 0); //Vector3 move = cameraRotationY * new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed; Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed; if (Controller != null) { Controller!.Move(move + velocity * Runner.DeltaTime); } if (move != Vector3.zero) { gameObject.transform.forward = move; } } public override void Spawned() { if (HasStateAuthority) { Camera = Camera.main; Camera.GetComponent<FirstPersonCamera>().Target = GetComponent<NetworkTransform>().InterpolationTarget; } } }
- PlayerMovement.csを作成して、上記をコピペ
- PrefabのPlayerCharacterオブジェクトに、PlayerMovementをAddComponentする
HasStateAuthorityは、自分のプレイヤーのときのみ、trueとなる。
一人称カメラ設定
using UnityEngine; public class FirstPersonCamera : MonoBehaviour { public Transform Target; public float MouseSensitivity = 10f; private float vertialRotation; private float horizontalRotation; void LateUpdate() { if (Target == null) { return; } transform.position = Target.position; float mouseX = Input.GetAxis("Mouse X"); float mouseY = Input.GetAxis("Mouse Y"); vertialRotation -= mouseY * MouseSensitivity; vertialRotation = Mathf.Clamp(vertialRotation, -70f, 70f); horizontalRotation += mouseX * MouseSensitivity; transform.rotation = Quaternion.Euler(vertialRotation, horizontalRotation, 0); } }
- FirstPersonCamera.csを作成して、上記をコピペ
- MainCameraオブジェクトに、FirstPersonCameraをAddComponentする