[HELP] Need help making camera snap to center via rotation

Hello, i made this camera where i click mouse 2 button and drag to move it around my player, but i would like it to snap to every 90 degrees instead of going all the way around, here is my current camera code:

using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
 
    public class ThirdPersonCamera : MonoBehaviour
    {
 
        //All the variables used in this class(Look below to see what they do.)
        private const float Y_ANGLE_MIN = 5.0f;
        private const float Y_ANGLE_MAX = 35.0f;
        private const float DISTANCE_MAX = 50.0f;
        private const float DISTANCE_MIN = 20.0f;
        private const float TRANS_MIN = 1.0f;
        private const float TRANS_MAX = 2.0f;
 
        public float dragSpeed = 2;
        private Vector3 dragOrigin;
 
        public Transform lookAt;
        public Transform camTransform;
        public GameObject player;
 
        private Camera cam;
 
        public float distance = 5.0f;
        private float currentX = 0.0f;
        private float currentY = 0.0f;
        private float sensitivityX = 4.0f;
        private float sensitivityY = 1.0f;
        private float trandis;
 
        public Vector3 height = new Vector3(0, 0, 0);
 
        private bool below = false;
 
        private void Start()
        {
 
            //Makes camTransform a transform.
            camTransform = transform;
            //Sets variable cam value to the main camera
            cam = Camera.main;
 
        }
        private void Update()
        {
 
            //Makes the camera move by looking at the axis of the mouse(Also multiplied by the seisitivity.)
            if (Input.GetMouseButton(2))
            {
                currentX += Input.GetAxis("Mouse X") * sensitivityX;
                currentY -= Input.GetAxis("Mouse Y") * sensitivityY;
            }
            //Limits the Y variable
            currentY = Mathf.Clamp(currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
 
            //Thiago Laranja's scrollwheel implemetation.
            if (Input.GetAxis("Mouse ScrollWheel") > 0) { distance -= 2.0f; }
            if (Input.GetAxis("Mouse ScrollWheel") < 0) { distance += 2.0f; }
 
            //Makes sure that these variables never go over the max and be les than the min.
            distance = Mathf.Clamp(distance, DISTANCE_MIN, DISTANCE_MAX);
            trandis = Mathf.Clamp(distance, TRANS_MIN, TRANS_MAX) - 1;
 
            //Sets players transparency(Make sure that player materials rendering mode has set to transparent or other mode that supports transparency).
            player.GetComponent<Renderer>().material.color = new Color(player.GetComponent<Renderer>().material.color.r, player.GetComponent<Renderer>().material.color.g, player.GetComponent<Renderer>().material.color.b, trandis);
 
            //Disables the object from rendering if your're at distance 0.8.
            if (distance <= 0.8f) { player.GetComponent<Renderer>().enabled = false; }
            if (distance > 0.8f) { player.GetComponent<Renderer>().enabled = true; }
 
            //If close enough to the character sinp into distance of 0.1(If distance is 0 the camera cant be rotated.)
            if (distance <= 0.8f && below == false) { distance = 0.1f; below = true; }
            if (distance >= 0.8f && below == true) { below = false; }
 
        }
        private void LateUpdate()
        {
 
            //Subtracts hte distance from Z coordinate
            Vector3 dir = new Vector3(0, 0, -distance);
 
            //Creates an quaternion for rotation(too bad that we cannot use Vector3.)
            Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);
 
            //Sets the cameras position and makes it look at player.
            camTransform.position = lookAt.position + height + rotation * dir;
            camTransform.LookAt(lookAt.position + height);
 
            //Camera Snap 90 degrees
            Vector3 angles = camTransform.eulerAngles;
            angles.y = (angles.y / 90) * 90;
            camTransform.eulerAngles = angles;
 
        }
 
    }

Specifically this last part under LateUpdate is where my 90 degree code is:

    //Camera Snap 90 degrees
            Vector3 angles = camTransform.eulerAngles;
            angles.y = (angles.y / 90) * 90;
            camTransform.eulerAngles = angles;

It is not working for some reason, any help? Thanks in advance.

EDIT: I changed this last part to this:

    angles.y = Mathf.Round(angles.y / 90) * 90;

instead of

    angles.y = (angles.y / 90) * 90;

But now the camera is snapping 90 degrees, yet it’s like it’s on an orbit, not locking to the center of the character. I would like the camera to only be able to pan up and down (my Y axis), and use the X axis only to switch views of looking at the character on these 90 degree snaps, but still via click and drag. Small gif of the problem occurring: https://i.gyazo.com/7af52400c5823baba856700e5ffeb5e6.mp4

You’re applying the camera snap later than you should.

For starters, you should not use Euler angles as input - ever. (input being, reading the Euler angles from the transform, as you’re doing in line 91) They’re unreliable and useless. They’re fine in some cases for assignment (as you’re doing in line 84), but never the other way.

Why not just snap/round currentX and currentY in line 84 itself? Wouldn’t that accomplish what you’re trying to do?

Sorry i’m very new, would you mind elaborating?

Adding to what @StarManta said, let me walk you through some slight calculation difficulties with some sample data:

You’re facing heading 0, you integer divide by 90, multiply by 90. You’re facing 0. Awesome.

You’re facing heading 90, you integer divide by 90, multiply by 90, you’re facing 90. Awessome.

You’re facing heading 89, you integer divide by 90 (gives a result of zero!), multiply by 90, you’re facing 0. Bad.

So what you want is to add in half of the desired “detent,” in this case 90.

 facing = (int)((facing + 45) / 90) * 90;

That will “snap back to center” on a 90-degree mark as long as you are less than 45 degrees either side away from it.

ALSO, I prefer to keep a single float that is my “heading” and modify that, then use that value to directly drive the Y rotation of the camera transform, rather than reading it back from the camera each frame.

Thank you, but i have no variable “facing” what would i put in that variable when i add it?

Variable name is not important: I’m saying if you’re facing heading 89 and divide by 90 (integer), then multiply by 90, you’ll be turned to heading 0, which is 89 degrees snapped left. That’s probably not what you want when you are implementing this snap feature. That’s all the point was about.

Ohhh i see, thanks.

And how would i go about doing this in line 84?