0
\$\begingroup\$

I am developing a Third Person Shooter.

Until now, I had parented the camera to player. It would therefore automatically stay behind the player.

Because this would not work well with Root Motion, I need to use a different approach:

In my script, I need to make it so that the camera follows the player.

How could I make it so that the camera stays behind the player at always the same position (and with the same rotation)?

This is my current code, but it doesn't work:

    _camera.transform.rotation = Quaternion.Euler(0, this.transform.rotation.eulerAngles.y, 0);
    _camera.transform.position = _InitialCamPos + this.transform.position;

Can anybody help?

Thank you!

\$\endgroup\$
1
  • \$\begingroup\$ Can you describe what problem you have with root motion? \$\endgroup\$
    – DMGregory
    Aug 13 '21 at 11:46
2
\$\begingroup\$

It looks like you want something like this:

// Get a "yaw-only" rotation without relying on Euler angles.
var forward = transform.forward;
forward.y = 0;    
_camera.transform.rotation = Quaternion.LookRotation(forward);

// Map the camera position from the player's local space to world space.
_camera.transform.position = transform.TransformPoint(_InitialCamPos);

Here _InitialCamPos is measured in the local coordinate system of this object. So for instance if the character's origin is at its feet, and you want the camera to be 1 m above that and nudged 0.1 m forward, that's (0, 1, 0.1). The TransformPoint method will automatically handle adjusting this based on the character's rotation and translation.

If you need to determine _InitialCamPos dynamically based on where the camera was at scene load time, you can use something like this:

void Awake() {
     _InitialCamPos = transform.InverseTransformPoint(_camera.transform.position);
}

This maps a world space point into the object's local coordinate system.

\$\endgroup\$
2
\$\begingroup\$

Create an empty gameobject as a child of your player then attach the camera to the empty gameobject and reposition camera as per your need. Hierarchy would look something like:

 Player
    |- EmptyGO
          |- Camera
\$\endgroup\$
1
\$\begingroup\$

Why don't you use unity cinemachine it has a lot of different camera options and you can do most of the thing without coding and it is really flexible. Here are the docs: https://docs.unity3d.com/Packages/com.unity.cinemachine@2.3/manual/index.html

\$\endgroup\$
2
  • \$\begingroup\$ I have spent so much time on my own camera logic already... :( It breaks my heart to use cinemachine. \$\endgroup\$
    – tmighty
    Sep 5 '21 at 20:10
  • \$\begingroup\$ I know the feeling but it goes down to why would you invest time in a complicated way to set up your camera when you can yust use cinemachine and invest that time in something more inportant in your project. You said that you already spend a lot of time in creating that script now you will spend more time in fixing it, plus if you get new problems down the road that is more time spent trying to fix something that you could do in like 5 minutes with cinemachine. \$\endgroup\$
    – Ivan
    Sep 6 '21 at 7:43

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .