Issue with positioning camera that is controlled with mouse so that player stays in view (for third person view)
I've set up rigged player character, moved main camera inside the player object, so it is always moving together with the player and added simple camera movement script that is controlled with mouse. The script is attached to player object.
Here is the script code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseLook : MonoBehaviour
{
public float mouseSensitivity = 100f;
public float minAngle = -45f;
public float maxAngle = 45f;
public float minPosition = 0f;
public float maxPosition = 6f;
public float camDefaultY = 3.198001f;
public GameObject headObject;
private float yaw = 0f;
private float pitch = 0f;
private Transform headAngle;
// Start is called before the first frame update
void Start()
{
headAngle = headObject.transform;
}
// Update is called once per frame
void Update()
{
yaw += Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
pitch = Mathf.Clamp(pitch, minAngle, maxAngle);
transform.eulerAngles = new Vector3(0f, yaw, 0f);
headObject.transform.eulerAngles = new Vector3(-pitch, headAngle.eulerAngles.y, headAngle.eulerAngles.z);
Camera.main.transform.eulerAngles = new Vector3(pitch, yaw, 0f);
}
}
The preferred result is to:
make player object rotate with the camera horizontally (on x axis) on mouse movement (solved)
make player head (child object) and camera rotate vertically on mouse movement (solved)
limit vertical camera rotation to, let's say, 45° (solved)
position camera vertically so the player object is always in the same place (having issue with this)
The issue I'm having is that while I got first 3 things working, I can't find proper way to position camera vertically in a way that player object always will stay +/- in the same place/view. How can I achieve it?
Here is what I got:
And here is what I want to achieve (notice how player stays in the same place in camera):
Also I would like to know if there is maybe easier way to achieve this whole 3rd person mouse control?
Thanks in advance!
Okay, closest I've got is to use LookAt()
function or adding additional layer to head, so I can animate head's new parent layer while attaching camera to head object, so the camera won't animate with it.
Answer by ricardsss · Feb 14, 2020 at 03:48 PM
So I finally figured it out with some help. To keep the animation for head, rotate it with the mouse movement and make camera follow no only player's head but also mouse with vertical limitation, I just created additional empty object under Player object to use it as camera target and put the camera inside it.
From that point I added it in my script. Here's an updated code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseLook : MonoBehaviour
{
public float mouseSensitivity = 100f;
public float minAngle = -45f;
public float maxAngle = 45f;
public float minPosition = 0f;
public float maxPosition = 6f;
public float camDefaultY = 3.198001f;
public GameObject cameraTarget;
public GameObject headTarget;
private float yaw = 0f;
private float pitch = 0f;
private Transform targetAngle;
// Start is called before the first frame update
void Start()
{
targetAngle = cameraTarget.transform;
}
// Update is called once per frame
void Update()
{
yaw += Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
pitch = Mathf.Clamp(pitch, minAngle, maxAngle);
transform.eulerAngles = new Vector3(0f, yaw, 0f);
cameraTarget.transform.eulerAngles = new Vector3(-pitch, targetAngle.eulerAngles.y, targetAngle.eulerAngles.z);
}
void LateUpdate()
{
headTarget.transform.eulerAngles = new Vector3(-pitch, targetAngle.eulerAngles.y, targetAngle.eulerAngles.z);
}
}