CameraBot Position overrider section setup

This session is made for anyone to override their camera position, the panel you may visualize in video will look like this:

overrider01

For programmers:

How to override the position related to orbit camera idea position.
CameraBot will need the the following information,
overrider02
here is the interface to implement your code.
Interface: IDeaPosition

public interface IDeaPosition
{
	/// <summary>Each group can only taken a position, the one with highest weight</summary>
	int GroupNumber { get; }
	/// <summary>the recommand position will sent to <see cref="CameraPivot"/></summary>
	Vector3 ToLocalPosition { get; }
	/// <summary>To define how important of this information is.</summary>
	float Weight { get; }
	/// <summary>The information that will displayed on position overrider section.</summary>
	string ToString();
}

following will provide you the base class to help you implement easier.
base class : IDeaPositionBase.cs

using UnityEngine;
using Kit.Extend;
using System;

namespace CF.CameraBot.Parts
{
	[RequireComponent(typeof(Preset))]
	public class IDeaPositionBase : MonoBehaviour, IDeaPosition
	{
		#region interface
		
		[SerializeField]
		private Preset m_Preset;
		protected Preset preset { get { return m_Preset; } }

		[Header("Position overrider")]
		[SerializeField]
		private int m_GroupNumber;
		public int GroupNumber { get { return m_GroupNumber; } }

		[SerializeField]
		private Vector3 m_LocalPosition;
		public Vector3 ToLocalPosition
		{
			get { return m_LocalPosition; }
			protected set { m_LocalPosition = value; }
		}

		[SerializeField]
		[Range(0f,1f)]
		private float m_Weight = .5f;
		public float Weight { get { return m_Weight; } }
		#endregion

		#region common variables
		/// <summary>The clone position & rotation related to chase target</summary>
		/// <remarks>Non-real chase target, it's preset's instance</remarks>
		protected Transform GetChaseTarget { get { return preset.Instance.transform; } }
		/// <summary>The offset applied on chase target</summary>
		protected Transform GetChaseTargetOffset { get { return preset.Instance.GetChaseTargetOffset(); } }
		/// <summary>The camera pivot point, position & rotation</summary>
		protected Transform GetCameraCurrentPivot { get { return preset.Instance.GetCameraPivot(); } }
		/// <summary>The camera pivot point, without modify</summary>
		protected Transform GetCameraIdeaPivot { get { return preset.Instance.GetCameraOffset(); } }
		/// <summary>The location, should focus by camera</summary>
		protected Transform GetCameraLookAt { get { return preset.Instance.GetCameraLookAt(); } }
		/// <summary>The idea Camera direction</summary>
		protected Vector3 GetCameraIdeaDirection { get { return GetCameraLookAt.position.Direction(GetCameraIdeaPivot.position); } }
		/// <summary>The idea Camera distance</summary>
		protected float GetCameraIdeaDistance { get { return GetCameraLookAt.position.Distance(GetCameraIdeaPivot.position); } }
		#endregion

		#region helper
		protected virtual void OnValidate()
		{
			if (m_Preset == null)
			{
				m_Preset = GetComponent<Preset>();
			}
			
			// for debug purpose, not allow to change.
			m_LocalPosition = Vector3.zero;
		}

		protected virtual void OnEnable()
		{
			m_Preset.Instance.CameraPivot.RegisterOperator(this);
		}

		protected virtual void OnDisable()
		{
			m_Preset.Instance.CameraPivot.UnregisterOperator(this);
		}

		public override string ToString()
		{
			return string.Format("[G:{5}][W:{0:F2}] {1} :: Pos({2:F2},{3:F2},{4:F2})", Weight, GetType().Name, ToLocalPosition.x, ToLocalPosition.y, ToLocalPosition.z, GroupNumber);
		}
		#endregion
	}
}

 

And here is the sample code to achieve the basic backward obstacle avoidance, the one used in demo video.
Sample code : BackwardObstacleAvoidance.cs

using UnityEngine;
using Kit.Extend;
namespace CF.CameraBot.Parts
{
	[RequireComponent(typeof(Preset))]
	public class BackwardObstacleAvoidance : IDeaPositionBase, IDeaPosition
	{
		public float m_SafeDistance = 0.2f;
		
		/// <summary>Ignore nothing by default, recommand ignore chase target's layer</summary>
		public LayerMask m_IgnoreLayerMask = 1;

		void FixedUpdate()
		{
			BackwardRaycast();
		}

		private void BackwardRaycast()
		{
			RaycastHit hit;
			if (Physics.Raycast(
					GetCameraLookAt.position,
					GetCameraIdeaDirection,
					out hit,
					GetCameraIdeaDistance,
					~m_IgnoreLayerMask,
					QueryTriggerInteraction.UseGlobal))
			{
				ToLocalPosition = GetCameraIdeaPivot.InverseTransformPoint(hit.point.PointOnDistance(-GetCameraIdeaDirection, m_SafeDistance));
				Debug.DrawLine(GetCameraLookAt.position, hit.point, Color.red, 0.01f);
			}
			else
			{
				ToLocalPosition = Vector3.zero;
			}
		}
	}
}

by following the interface to implement your code, we are able to override the orbit camera position to anywhere, problem is how to achieve your ideas.

overrider03