Я бы избегал работы с углами и работы в мире векторов и плоскостей.
Определите, на какой стороне камеры находится желтая точка:
Camera cam = cameraComp;
Transform camTransform = cam.transform;
Vector3 yellowPos = yellowPoint.transform.position;
// <0 if on left, >0 if on right
float camDirection = Vector3.Dot(camTransform.right, yellowPos - camTransform.position);
// if it's directly straight ahead, do nothing.
if (Mathf.Approximately(camDirection, 0f)) return;
Найдите луч для края области просмотра камеры на той же стороне желтой точки. Высота в области просмотра не имеет значения.
Ray edgeRay = cam.ViewportPointToRay(camDirection < 0f ? Vector3.zero : Vector3.right);
Определите алгебраическую c плоскость (не физическую плоскость), перпендикулярную камере справа и проходящую через положение желтой точки:
Plane yellowPlane = new Plane(camTransform.right, yellowPos);
Найдите пересечение луча и плоскости с помощью алгебры c raycast (не физика raycast):
float raycastDistance;
if (! yellowPlane.Raycast(edgeRay, out raycastDistance)) return; // should not return
Vector3 raycastPoint = edgeRay.GetPoint(raycastDistance);
Найдите разницу от точки пересечения до положения yellowPoint и произведите точечное произведение с направлением камеры вперед, чтобы узнать, как перемещать камеру вперед:
float forwardDelta = Vector3.Dot(camTransform.forward, yellowPos - raycastPoint);
camTransform.Translate(0f, 0f, forwardDelta);
Итак, в целом:
Camera cam = cameraComp;
Transform camTransform = cam.transform;
Vector3 yellowPos = yellowPoint.transform.position;
// <0 if on left, >0 if on right
float camDirection = Vector3.Dot(camTransform.right, yellowPos - camTransform.position);
// if it's directly straight ahead, do nothing.
if (Mathf.Approximately(camDirection, 0f)) return;
Ray edgeRay = cam.ViewportPointToRay(camDirection < 0f ? Vector3.zero : Vector3.right);
Plane yellowPlane = new Plane(camTransform.right, yellowPos);
float raycastDistance;
if (! yellowPlane.Raycast(edgeRay, out raycastDistance)) return; // should not return
Vector3 raycastPoint = edgeRay.GetPoint(raycastDistance);
float forwardDelta = Vector3.Dot(camTransform.forward, yellowPos - raycastPoint);
camTransform.Translate(0f, 0f, forwardDelta);
Хорошая вещь в этом подходе состоит в том, что он будет работать независимо от ориентации камеры или относительного положения точки от камеры.