Implement switching between solo and multiplayer rig seamlessly
This commit is contained in:
@@ -24,33 +24,53 @@ public class PlayerComponent : NetworkBehaviour
|
||||
[SerializeField]
|
||||
private CharacterController characterController;
|
||||
|
||||
[SerializeField]
|
||||
private AudioListener audioListener;
|
||||
|
||||
[ReadOnly]
|
||||
[SerializeField]
|
||||
private float fadeDuration = 2f;
|
||||
|
||||
public Vector3 Position
|
||||
{
|
||||
get { return controller.transform.position; }
|
||||
}
|
||||
private GameObject[] dependencies => new GameObject[] {
|
||||
controller.RightHand.ForceGrabber._anchor.gameObject,
|
||||
controller.LeftHand.ForceGrabber._anchor.gameObject,
|
||||
controller.LeftHand._anchor,
|
||||
controller.RightHand._anchor
|
||||
};
|
||||
|
||||
public Vector3 Rotation
|
||||
{
|
||||
get { return controller.transform.eulerAngles; }
|
||||
}
|
||||
public Vector3 Position => controller.transform.position;
|
||||
|
||||
public Vector3 Rotation => controller.transform.eulerAngles;
|
||||
|
||||
private bool isSoloRig => !networkObject.IsPlayerObject;
|
||||
private bool isMultiplayerLocalRig => networkObject.IsLocalPlayer;
|
||||
|
||||
private bool isMultiplayerRemoteRig => !networkObject.IsOwner && networkObject.IsPlayerObject;
|
||||
|
||||
public override void OnNetworkSpawn()
|
||||
{
|
||||
base.OnNetworkSpawn();
|
||||
|
||||
name = $"Player - {networkObject.OwnerClientId}"
|
||||
+ (networkObject.IsLocalPlayer ? " (local)" : "");
|
||||
if (!isSoloRig)
|
||||
{
|
||||
name = $"Player - {networkObject.OwnerClientId}"
|
||||
+ (networkObject.IsLocalPlayer ? " (local)" : "");
|
||||
}
|
||||
|
||||
if (!networkObject.IsOwner)
|
||||
if (isMultiplayerRemoteRig)
|
||||
{
|
||||
StartCoroutine(DestroyMultiplayerComponents());
|
||||
}
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (!isSoloRig) return;
|
||||
|
||||
audioListener.enabled = true;
|
||||
StartCoroutine(DestroySoloComponents());
|
||||
}
|
||||
|
||||
private IEnumerator DestroyMultiplayerComponents()
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
@@ -71,18 +91,52 @@ public class PlayerComponent : NetworkBehaviour
|
||||
controller.RemoveMultiplayerComponents();
|
||||
}
|
||||
|
||||
public void DestroyDependencies()
|
||||
private IEnumerator DestroySoloComponents()
|
||||
{
|
||||
Destroy(controller.RightHand.ForceGrabber._anchor.gameObject);
|
||||
Destroy(controller.LeftHand.ForceGrabber._anchor.gameObject);
|
||||
Destroy(controller.LeftHand._anchor);
|
||||
Destroy(controller.RightHand._anchor);
|
||||
yield return new WaitForEndOfFrame();
|
||||
|
||||
foreach (var t in new[]
|
||||
{
|
||||
typeof(NetworkObject),
|
||||
typeof(NetworkTransform)
|
||||
})
|
||||
{
|
||||
foreach (var component in GetComponentsInChildren(t))
|
||||
{
|
||||
Destroy(component);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroyWithDependencies()
|
||||
public override void OnDestroy()
|
||||
{
|
||||
DestroyDependencies();
|
||||
Destroy(gameObject);
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
public void DestroyDependencies()
|
||||
{
|
||||
foreach (var d in dependencies)
|
||||
{
|
||||
Destroy(d);
|
||||
}
|
||||
}
|
||||
|
||||
public void ToggleAudioListener(bool enabled) => audioListener.enabled = enabled;
|
||||
|
||||
public void Toggle(bool active)
|
||||
{
|
||||
// Only toggle solo rig components, not multiplayer one
|
||||
if (isSoloRig)
|
||||
{
|
||||
foreach (var d in dependencies)
|
||||
{
|
||||
d.SetActive(active);
|
||||
}
|
||||
|
||||
audioListener.enabled = active;
|
||||
gameObject.SetActive(active);
|
||||
}
|
||||
}
|
||||
|
||||
public void Teleport(Vector3 position, Vector3 direction)
|
||||
|
||||
Reference in New Issue
Block a user