90 lines
2.6 KiB
C#
90 lines
2.6 KiB
C#
using Fusion.XR.Host.Rig;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Fusion;
|
|
|
|
namespace Fusion.XR.Host.Utils
|
|
{
|
|
/**
|
|
* Ensure that the user camera cannot see its own avatar, by making its layer "invisible"
|
|
*/
|
|
public class HideForLocalUser : NetworkBehaviour
|
|
{
|
|
public string localUserLayer = "InvisibleForLocalPlayer";
|
|
public string remoteUserLayer = "Default";
|
|
public bool hideLocalAvatar = true;
|
|
public bool applyLayerToChildren = true;
|
|
FusionRig rig;
|
|
|
|
private void Awake()
|
|
{
|
|
rig = FindObjectOfType<FusionRig>();
|
|
}
|
|
|
|
void ConfigureCamera()
|
|
{
|
|
int layer = LayerMask.NameToLayer(localUserLayer);
|
|
if (hideLocalAvatar && layer != -1)
|
|
{
|
|
var camera = rig.headset.GetComponentInChildren<Camera>();
|
|
camera.cullingMask &= ~(1 << layer);
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
// Change camera culling mask to hide local user, if required by hideLocalAvatar
|
|
ConfigureCamera();
|
|
}
|
|
|
|
public override void Spawned()
|
|
{
|
|
base.Spawned();
|
|
if (Object.HasInputAuthority) {
|
|
ConfigureLocalRenderers();
|
|
}
|
|
else
|
|
{
|
|
ConfigureRemoteRenderers();
|
|
}
|
|
}
|
|
|
|
public void ConfigureLocalRenderers()
|
|
{
|
|
if (localUserLayer != "")
|
|
{
|
|
int layer = LayerMask.NameToLayer(localUserLayer);
|
|
if (layer == -1)
|
|
{
|
|
Debug.LogError($"Local will be visible and may obstruct you vision. Please add a {localUserLayer} layer (it will be automatically removed on the camera culling mask)");
|
|
}
|
|
else
|
|
{
|
|
if (applyLayerToChildren)
|
|
{
|
|
foreach (var renderer in gameObject.GetComponentsInChildren<Renderer>())
|
|
{
|
|
renderer.gameObject.layer = layer;
|
|
}
|
|
}
|
|
gameObject.layer = layer;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ConfigureRemoteRenderers()
|
|
{
|
|
int layer = LayerMask.NameToLayer(remoteUserLayer);
|
|
if (applyLayerToChildren)
|
|
{
|
|
foreach (var renderer in gameObject.GetComponentsInChildren<Renderer>())
|
|
{
|
|
renderer.gameObject.layer = layer;
|
|
}
|
|
}
|
|
gameObject.layer = layer;
|
|
}
|
|
}
|
|
}
|