meta xr, auto fix, occlusion additions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user