So, you want to get a forward vector parallel to the ground plane relative to the camera's rotation, from what I can get.
The solution is as simple as using Vector3.Cross(Vector a, Vector b), it is not commutative, so you'll have to give the vectors in the correct order. What the cross product gives you, is a vector C perpendicular to 2 vectors A and B. So, both vectors you'll have to pass as parameters in the function are the camera's transform.right and the plane's normal (as an Y vector) as A and B respectively, so you get a forward vector parallel to the ground's plane.
One of the ways to get a ground's normal is by using Physics' API functions such as Raycast, Spherecast, Boxcast, etc., where you can obtain the RaycastHit information of the ground you are contacting.
For the sake of a simple example, you could try this with Raycast:
public class GetForwardVector : MonoBehaviour
{
public LayerMask mask;
public float distance;
public Vector3 forward;
public void Update()
{
RaycastHit hit;
if(Physics.Raycast(transform.position, -transform.up, out hit, distance, mask))
{
forward = Vector3.Cross(transform.right, hit.normal);
}
}
}
Here, if the script was attached to the camera, a ray is casted from the camera's position, taking the camera's relative down direction, to obtain the information of the ground below it.
Hope it helps.