/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Samples
{
using Opsive.Shared.Utility;
using System.Reflection;
using UnityEngine;
///
/// Ensures compatibility with or without the volumetric light package from https://github.com/CristianQiu/Unity-URP-Volumetric-Light.
///
public class VolumetricPackageCompatibility : MonoBehaviour
{
[Tooltip("A reference to the volumetric profile.")]
[SerializeField] protected ScriptableObject m_VolumetricProfile;
[Tooltip("The volumetric light anisotropy value.")]
[SerializeField] protected float m_LightAnisotropy;
[Tooltip("The volumetric light scattering value.")]
[SerializeField] protected float m_LightScattering;
[Tooltip("The volumetric light radius value.")]
[SerializeField] protected float m_LightRadius; //0 1.72 .469
///
/// Sets the volumetric light settings if the package exists.
///
private void Start()
{
var additionalLightType = TypeUtility.GetType("VolumetricAdditionalLight");
if (additionalLightType == null) {
Destroy(gameObject);
return;
}
var volumeType = TypeUtility.GetType("UnityEngine.Rendering.Volume");
if (volumeType == null) {
return;
}
var volume = UnityEngine.Object.FindFirstObjectByType(volumeType);
if (volume == null) {
return;
}
var profileProperty = volumeType.GetProperty("profile", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (profileProperty == null) {
return;
}
profileProperty.SetValue(volume, m_VolumetricProfile);
// All of the behavior tree agents with flashlights were spawned within Awake.
#if UNITY_6000_4_OR_NEWER
var volumetricLightObjects = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include);
#elif UNITY_6000_0_OR_NEWER
var volumetricLightObjects = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None);
#else
var volumetricLightObjects = Object.FindObjectsOfType(true);
#endif
for (int i = 0; i < volumetricLightObjects.Length; ++i) {
SetupVolumetricLight(volumetricLightObjects[i].gameObject, additionalLightType);
}
Destroy(gameObject);
}
///
/// Adds the Volumetric Light component.
///
/// A reference to the light.
/// The component type.
private void SetupVolumetricLight(GameObject lightGameObject, System.Type additionalLightType)
{
var lightComponent = lightGameObject.AddComponent(additionalLightType);
var property = additionalLightType.GetProperty("Anisotropy", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null) {
property.SetValue(lightComponent, m_LightAnisotropy);
}
property = additionalLightType.GetProperty("Scattering", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null) {
property.SetValue(lightComponent, m_LightScattering);
}
property = additionalLightType.GetProperty("Radius", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null) {
property.SetValue(lightComponent, m_LightRadius);
}
}
}
}