meta xr, auto fix, occlusion additions

This commit is contained in:
Timur Nizamov
2025-12-09 21:37:52 +02:00
parent 647d247c81
commit 1f500f31d4
164 changed files with 1314 additions and 508 deletions

View File

@@ -2,6 +2,7 @@ using UnityEngine;
using FMODUnity;
using FMOD.Studio;
using System.Collections;
using System.Collections.Generic; // ADDED
public class FirstPersonOcclusion : MonoBehaviour
{
@@ -26,6 +27,10 @@ public class FirstPersonOcclusion : MonoBehaviour
private bool initialisedExternally = false;
// ADDED: now stores ALL event instances that must be occluded
private List<EventInstance> managedInstances = new List<EventInstance>();
public void InitialiseWithInstance(EventInstance instance)
{
AudioOccluded = instance;
@@ -37,9 +42,28 @@ public class FirstPersonOcclusion : MonoBehaviour
GetComponent<Rigidbody>()
);
managedInstances.Add(AudioOccluded); // ADDED
AudioOccluded.getDescription(out AudioDes);
AudioDes.getMinMaxDistance(out float min, out MaxDistance);
}
// ADDED: allows adding extra FMOD instances for occlusion
public void AddInstance(EventInstance instance)
{
if (instance.isValid())
{
RuntimeManager.AttachInstanceToGameObject(
instance,
gameObject,
GetComponent<Rigidbody>()
);
managedInstances.Add(instance);
}
}
private IEnumerator Start()
{
// If already initialised, skip internal creation
@@ -47,13 +71,18 @@ public class FirstPersonOcclusion : MonoBehaviour
if (!initialisedExternally)
{
AudioOccluded = RuntimeManager.CreateInstance(SelectAudio);
// 2. Attaching Instance
RuntimeManager.AttachInstanceToGameObject(AudioOccluded, gameObject);
// 3. Starting Audio
AudioOccluded.start();
// 4. Releasing Instance (This allows the event to self-manage its lifetime, which is fine)
AudioOccluded.release();
managedInstances.Add(AudioOccluded); // ADDED
// 5. Getting Event Description and Max Distance
AudioDes = RuntimeManager.GetEventDescription(SelectAudio);
AudioDes.getMinMaxDistance(out float minDistance, out MaxDistance);
@@ -64,6 +93,7 @@ public class FirstPersonOcclusion : MonoBehaviour
Listener = FindObjectOfType<StudioListener>();
}
private void FixedUpdate()
{
if (Listener == null) return;
@@ -82,6 +112,7 @@ public class FirstPersonOcclusion : MonoBehaviour
lineCastHitCount = 0f;
}
private void OccludeBetween(Vector3 sound, Vector3 listener)
{
// 9. Calculate Points (Log only a few to avoid clutter)
@@ -117,6 +148,7 @@ public class FirstPersonOcclusion : MonoBehaviour
SetParameter();
}
private Vector3 CalculatePoint(Vector3 a, Vector3 b, float m, bool posOrneg)
{
float n = Vector3.Distance(new Vector3(a.x, 0f, a.z), new Vector3(b.x, 0f, b.z));
@@ -139,9 +171,11 @@ public class FirstPersonOcclusion : MonoBehaviour
return new Vector3(x, a.y, z);
}
private void CastLine(Vector3 Start, Vector3 End)
{
RaycastHit hit;
// 11. Raycast result
bool isHit = Physics.Linecast(Start, End, out hit, OcclusionLayer);
@@ -156,10 +190,18 @@ public class FirstPersonOcclusion : MonoBehaviour
}
}
private void SetParameter()
{
float occlusionValue = lineCastHitCount / 11;
// 12. Final Parameter Value
AudioOccluded.setParameterByName("Occlusion", occlusionValue);
foreach (var inst in managedInstances)
{
if (inst.isValid())
{
inst.setParameterByName("Occlusion", occlusionValue);
}
}
}
}