The following script can be used with the post processing stack. Editing the script at runtime is kind of a pain. Attach the script to an object that has the PostProcessing layer, such as the same object you are using for a post processing volume.
Calculate the distance as needed – I’m just getting the distance between the camera transform and the player transform, but if you have a larger player, you may want to use a raycast and get the distance to the closest point to the camera.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class FollowFocus : MonoBehaviour
{
Transform player;
public PostProcessVolume m_Volume;
public DepthOfField m_DOF;
public float distance = 10f;
void Start()
{
m_DOF = ScriptableObject.CreateInstance<DepthOfField>();
m_DOF.enabled.Override(true);
m_DOF.enabled.value = true;
m_DOF.focusDistance.Override(1f);
m_Volume = PostProcessManager.instance.QuickVolume(gameObject.layer, 100f, m_DOF);
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
distance = (Camera.main.transform.position-player.position).magnitude;
m_DOF.focusDistance.value = distance;
}
void OnDestroy()
{
RuntimeUtilities.DestroyVolume(m_Volume, true, true);
}
}