XRoom_Unity/Assets/Photon/FusionXRHost/Scripts/Utils/HideForLocalUser.cs
2025-05-31 10:20:20 +03:30

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;
}
}
}