using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; #if MM_URP using UnityEngine.Rendering.Universal; #endif using MoreMountains.Feedbacks; namespace MoreMountains.FeedbacksForThirdParty { /// <summary> /// This class will set the URP depth of field to focus on the set of targets specified in its inspector. /// </summary> #if MM_URP [RequireComponent(typeof(Volume))] #endif [AddComponentMenu("More Mountains/Feedbacks/Shakers/PostProcessing/MMAutoFocus_URP")] public class MMAutoFocus_URP : MonoBehaviour { [Header("Bindings")] /// the position of the camera [Tooltip("the position of the camera")] public Transform CameraTransform; /// a list of all possible targets [Tooltip("a list of all possible targets")] public Transform[] FocusTargets; [Header("Setup")] /// the current target of this auto focus [Tooltip("the current target of this auto focus")] public float FocusTargetID; [Header("Desired Aperture")] /// the aperture to work with [Tooltip("the aperture to work with")] [Range(0.1f, 20f)] public float Aperture = 0.1f; #if MM_URP protected Volume _volume; protected VolumeProfile _profile; protected DepthOfField _depthOfField; /// <summary> /// On Start, stores volume, profile and DoF /// </summary> void Start() { _volume = GetComponent<Volume>(); _profile = _volume.profile; _profile.TryGet<DepthOfField>(out _depthOfField); } /// <summary> /// On update we set our focus distance and aperture /// </summary> void Update() { float distance = Vector3.Distance(CameraTransform.position, FocusTargets[Mathf.FloorToInt(FocusTargetID)].position); _depthOfField.focusDistance.Override(distance); _depthOfField.aperture.Override(Aperture); } #endif } }