Reimplement solo and mp rig switching

This commit is contained in:
2024-09-12 16:55:54 +02:00
parent e428d3a9f9
commit f8822831aa
9 changed files with 119 additions and 198 deletions

View File

@@ -993,7 +993,7 @@ namespace HurricaneVR.Framework.ControllerInput
#else
loaders = string.Join(",", XRGeneralSettings.Instance.Manager.loaders.Select(e => e.name));
#endif
Debug.Log($"{XRGeneralSettings.Instance.Manager.automaticLoading}");
//Debug.Log($"{XRGeneralSettings.Instance.Manager.automaticLoading}");
Debug.Log($"XRGeneralSettings.Instance.Manager.isInitializationComplete {XRGeneralSettings.Instance.Manager.isInitializationComplete}");
Debug.Log($"XRPlugin Detected | XRSettings.enabled {XRSettings.enabled} | Loader : {XRPluginLoader} | Loaders Enabled: {loaders}");

View File

@@ -44,7 +44,16 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d357a0b6e2db94a4aadef95ef4fff758, type: 3}
m_Name:
m_EditorClassIdentifier:
soloRig: {fileID: 0}
multiplayerRig: {fileID: 0}
rigPrefab: {fileID: 75161255762383020, guid: 1ef3259331ddc1f4d94b628323ec45f3, type: 3}
player: {fileID: 0}
networkManager: {fileID: 0}
autoConnectOrHost: 0
OnConnected:
m_PersistentCalls:
m_Calls: []
OnDisconnected:
m_PersistentCalls:
m_Calls: []
OnClientsChanged:
m_PersistentCalls:
m_Calls: []

View File

@@ -21,22 +21,22 @@ PrefabInstance:
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.x
value: 148
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
value: 148
objectReference: {fileID: 0}
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -46,7 +46,7 @@ PrefabInstance:
- target: {fileID: 2723252326716659909, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -280
objectReference: {fileID: 0}
- target: {fileID: 3680965801110432182, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -71,22 +71,22 @@ PrefabInstance:
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.x
value: 148
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
value: 148
objectReference: {fileID: 0}
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -96,27 +96,27 @@ PrefabInstance:
- target: {fileID: 6236588919629483555, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -280
objectReference: {fileID: 0}
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.x
value: 148
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
value: 148
objectReference: {fileID: 0}
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -126,27 +126,27 @@ PrefabInstance:
- target: {fileID: 6353877099413377020, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -206
objectReference: {fileID: 0}
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.x
value: 148
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
value: 148
objectReference: {fileID: 0}
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -156,7 +156,7 @@ PrefabInstance:
- target: {fileID: 6413800453266084155, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -280
objectReference: {fileID: 0}
- target: {fileID: 7749079862415865764, guid: f871c3b28fd786d4f820bea343f67979,
type: 3}
@@ -275,7 +275,7 @@ PrefabInstance:
- target: {fileID: 3822188217954140599, guid: 6974999791dc8804fafee05e319aa932,
type: 3}
propertyPath: m_Enabled
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3924027509007222391, guid: 6974999791dc8804fafee05e319aa932,
type: 3}
@@ -622,7 +622,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 918221477
GlobalObjectIdHash: 3394388680
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1

View File

@@ -2810,37 +2810,6 @@ Transform:
type: 3}
m_PrefabInstance: {fileID: 212601291}
m_PrefabAsset: {fileID: 0}
--- !u!1 &216372457
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 216372458}
m_Layer: 0
m_Name: Character_Sample_04 (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &216372458
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 216372457}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &217767396
PrefabInstance:
m_ObjectHideFlags: 0
@@ -4507,37 +4476,6 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 693918f5252cc9543ad4901c66a265ed, type: 3}
--- !u!1 &310335279
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 310335280}
m_Layer: 0
m_Name: Character_Sample_04
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &310335280
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 310335279}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &313084521
PrefabInstance:
m_ObjectHideFlags: 0
@@ -11368,37 +11306,6 @@ Transform:
type: 3}
m_PrefabInstance: {fileID: 845377780}
m_PrefabAsset: {fileID: 0}
--- !u!1 &856515704
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 856515705}
m_Layer: 0
m_Name: InputField_Icon_Lock
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &856515705
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 856515704}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &857455115
GameObject:
m_ObjectHideFlags: 0
@@ -35379,6 +35286,3 @@ SceneRoots:
- {fileID: 3091828949070161056}
- {fileID: 2770940432321735806}
- {fileID: 2097484082}
- {fileID: 856515705}
- {fileID: 310335280}
- {fileID: 216372458}

View File

@@ -11,9 +11,14 @@ using Unity.Netcode.Components;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Rendering.Universal;
using Zenject;
public class PlayerComponent : NetworkBehaviour
{
[SerializeField]
[Inject]
private HVRInputModule inputModule;
[SerializeField]
private NetworkObject networkObject;
@@ -45,46 +50,61 @@ public class PlayerComponent : NetworkBehaviour
public Vector3 Rotation => controller.Camera.forward;
private bool isSoloRig => !networkObject.IsPlayerObject;
private bool isMultiplayerLocalRig => networkObject.IsLocalPlayer;
private bool isLocalRig => networkObject.IsLocalPlayer;
private bool isMultiplayerRemoteRig => !networkObject.IsOwner && networkObject.IsPlayerObject;
private bool isRemoteRig => !networkObject.IsOwner && networkObject.IsPlayerObject;
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
// Teleport information after player is loaded into scene
private Vector3 teleportPosition;
private Vector3 teleportRotation;
private bool teleportAfterLoad;
if (!isSoloRig)
{
name = $"Player - {networkObject.OwnerClientId}"
+ (networkObject.IsLocalPlayer ? " (local)" : "");
}
if (isMultiplayerRemoteRig)
{
StartCoroutine(DestroyMultiplayerComponents());
}
}
private bool isLoaded;
private void Start()
{
this.Inject();
StartCoroutine(AddDontDestroyToDependencies());
if (isSoloRig || isMultiplayerLocalRig)
if (isSoloRig)
{
foreach (var pointer in GetComponentsInChildren<HVRUIPointer>())
{
HVRInputModule.Instance.AddPointer(pointer);
}
AddPointersToInputModule();
name = "Player - SP";
StartCoroutine(DestroyComponentsNotNeededForSolo());
DontDestroyOnLoad(gameObject);
}
else if (isLocalRig)
{
AddPointersToInputModule();
name = $"Player - MP {networkObject.OwnerClientId} (local)";
}
else if (isRemoteRig)
{
name = $"Player - MP {networkObject.OwnerClientId}";
StartCoroutine(DestroyComponentsNotNeededForRemoteRigs());
}
if (!isSoloRig) return;
isLoaded = true;
audioListener.enabled = true;
StartCoroutine(DestroySoloComponents());
DontDestroyOnLoad(gameObject);
if (teleportAfterLoad)
{
Teleport(teleportPosition, teleportRotation);
}
}
private IEnumerator DestroyMultiplayerComponents()
private void AddPointersToInputModule()
{
foreach (var pointer in GetComponentsInChildren<HVRUIPointer>())
{
inputModule.AddPointer(pointer);
}
}
private IEnumerator DestroyComponentsNotNeededForRemoteRigs()
{
yield return new WaitForEndOfFrame();
@@ -105,7 +125,7 @@ public class PlayerComponent : NetworkBehaviour
controller.RemoveMultiplayerComponents();
}
private IEnumerator DestroySoloComponents()
private IEnumerator DestroyComponentsNotNeededForSolo()
{
yield return new WaitForEndOfFrame();
@@ -140,26 +160,18 @@ public class PlayerComponent : NetworkBehaviour
}
}
public void ToggleAudioListener(bool enabled) => audioListener.enabled = enabled;
public void Toggle(bool active)
{
// Only toggle solo rig components, not multiplayer one
if (networkObject == null || isSoloRig)
{
foreach (var d in dependencies)
{
d.SetActive(active);
}
audioListener.enabled = active;
gameObject.SetActive(active);
}
}
public void Teleport(Vector3 position, Vector3 direction)
{
teleporter.Teleport(position, direction);
if (isLoaded)
{
teleporter.Teleport(position, direction);
}
else
{
teleportPosition = position;
teleportRotation = direction;
teleportAfterLoad = true;
}
}
public void FadeScreen(float to, float duration)

View File

@@ -24,9 +24,6 @@ public class GlobalInstaller : MonoInstaller
[SerializeField]
private GameObject gameManagerPrefab;
[SerializeField]
private GameObject playerPrefab;
[SerializeField]
private GameObject uiManagerPrefab;
@@ -81,13 +78,6 @@ public class GlobalInstaller : MonoInstaller
Container.BindInstance(networkManager)
.AsSingle();
var playerGO = Instantiate(playerPrefab);
playerGO.name = playerPrefab.name;
var playerComponent = playerGO.GetComponent<PlayerComponent>();
Container.BindInstance(playerComponent)
.AsSingle();
Container.Bind<HVRInputModule>()
.FromComponentInNewPrefab(uiManagerPrefab)
.AsSingle()

View File

@@ -10,15 +10,13 @@ using System.Collections.Generic;
public class GameManager : NetworkBehaviour
{
[SerializeField]
[ReadOnly]
[Inject]
private PlayerComponent soloRig;
private GameObject rigPrefab;
[SerializeField]
[ReadOnly]
private PlayerComponent multiplayerRig;
private PlayerComponent player;
public PlayerComponent LocalPlayer => multiplayerRig ?? soloRig;
public PlayerComponent LocalPlayer => player;
[SerializeField]
[ReadOnly]
@@ -43,6 +41,8 @@ public class GameManager : NetworkBehaviour
networkManager.OnClientConnectedCallback += OnClientConnectedCallback;
networkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
player = SpawnSoloRig();
if (autoConnectOrHost)
{
if (ClonesManager.IsClone())
@@ -56,6 +56,11 @@ public class GameManager : NetworkBehaviour
}
}
private PlayerComponent SpawnSoloRig()
{
return Instantiate(rigPrefab).GetComponent<PlayerComponent>();
}
public void JoinGame(string code)
{
networkManager.StartClient();
@@ -107,23 +112,25 @@ public class GameManager : NetworkBehaviour
{
yield return new WaitForEndOfFrame();
var position = player.Position;
var rotation = player.Rotation;
player.DestroyDependencies();
if (toSolo)
{
soloRig.Toggle(toSolo);
soloRig.Teleport(multiplayerRig.Position, multiplayerRig.Rotation);
multiplayerRig.DestroyDependencies();
multiplayerRig = null;
yield return new WaitForEndOfFrame();
player = SpawnSoloRig();
}
else
{
soloRig.Toggle(toSolo);
Destroy(player.gameObject);
yield return new WaitForEndOfFrame();
var playerObject = networkManager.LocalClient.PlayerObject;
multiplayerRig = playerObject.GetComponent<PlayerComponent>();
multiplayerRig.Teleport(soloRig.Position, soloRig.Rotation);
multiplayerRig.ToggleAudioListener(true);
player = playerObject.GetComponent<PlayerComponent>();
}
player.Teleport(position, rotation);
}
private void OnClientDisconnectCallback(ulong clientId)

View File

@@ -70,6 +70,8 @@ public class HandMenuUI : NetworkBehaviour
private void Start()
{
this.Inject();
if (uiInput == null) return;
canvas = GetComponent<Canvas>();
@@ -88,14 +90,6 @@ public class HandMenuUI : NetworkBehaviour
settingsButton.onClick.AddListener(() => SettingsClicked());
}
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
// Player components need to be injected manualy again, because NetworkManager doesn't inject them.
gameObject.Inject();
}
private void Update()
{
CheckInput();

View File

@@ -43,4 +43,9 @@ public static class Injector
{
LookupContainer(go, container).InjectGameObject(go);
}
public static void Inject(this MonoBehaviour mb, ContainerSources container = ContainerSources.SceneContext)
{
LookupContainer(mb.gameObject, container).Inject(mb);
}
}