Scene view style camera controller

Hello,

I’m looking for help trying to create a camera controller that mimics the scene view camera controls.

The unity manual lists the scene view navigation as such:

Specifically I am looking for these types of controls:

  • Hold right click and mouse input to pan left, right, up, and down
  • Hold right click and hold input w, s, a, and d to fly through forward, and back, and strafe left, and right, respectively at speeds that increase the longer the input is held down
  • Double left click to focus on target and move to set distance at a smoothed rate
  • Hold alt and right click to orbit around set camera target
  • Middle mouse scroll up and down to zoom in and out
  • Hold middle mouse and mouse input to drag up, down, left and right

I’ve already looked at the mouseOrbit script to get some of these controls started, but I was wondering if there was any other documentation available or if the code for the editor camera was publicly available somewhere.

Thank you!

There is an asset, you would have to search which will snap your editor view to the camera view. Not sure it is dynamic, as in follow the the cam if its transform etc is altered.

Do you mean ctrl + shift + f? Which sets the main camera to your current editor view?

I was unaware of that function. This asset, seemed to do just that.
Hm. Must be more tho as it seemed quite professional.

This is what I was talking about.

That is an interesting tool, but not quite what I am looking for.

What I am trying to find is a script that will allow the player to transform the position and rotation of the camera in game in the same way that I can manipulate the scene view in the editor. So far I have found a script in the wiki that allows me to add zoom and orbit functionality to the camera object.

public Transform target;
        public Vector3 targetOffset;
        public float distance = 5.0f;
        public float maxDistance = 20;
        public float minDistance = .6f;
        public float xSpeed = 200.0f;
        public float ySpeed = 200.0f;
        public int yMinLimit = -80;
        public int yMaxLimit = 80;
        public int zoomRate = 40;
        public float panSpeed = 0.3f;
        public float zoomDampening = 5.0f;
       
        private float xDeg = 0.0f;
        private float yDeg = 0.0f;
        private float currentDistance;
        private float desiredDistance;
        private Quaternion currentRotation;
        private Quaternion desiredRotation;
        private Quaternion rotation;
        private Vector3 position;
       
        void Start() { Init(); }
        void OnEnable() { Init(); }
       
        public void Init()
        {
            //If there is no target, create a temporary target at 'distance' from the cameras current viewpoint
            if (!target)
            {
                GameObject go = new GameObject("Cam Target");
                go.transform.position = transform.position + (transform.forward * distance);
                target = go.transform;
            }
           
            distance = Vector3.Distance(transform.position, target.position);
            currentDistance = distance;
            desiredDistance = distance;
           
            //be sure to grab the current rotations as starting points.
            position = transform.position;
            rotation = transform.rotation;
            currentRotation = transform.rotation;
            desiredRotation = transform.rotation;
           
            xDeg = Vector3.Angle(Vector3.right, transform.right );
            yDeg = Vector3.Angle(Vector3.up, transform.up );
        }
       
        /*
     * Camera logic on LateUpdate to only update after all character movement logic has been handled.
     */
        void LateUpdate()
        {
            // If Control and Alt and Middle button? ZOOM!
            if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl))
            {
                desiredDistance -= Input.GetAxis("Mouse Y") * Time.deltaTime * zoomRate*0.125f * Mathf.Abs(desiredDistance);
            }
            // If middle mouse and left alt are selected? ORBIT
            else if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt))
            {
                xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
               
                ////////OrbitAngle
               
                //Clamp the vertical axis for the orbit
                yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
                // set camera rotation
                desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
                currentRotation = transform.rotation;
               
                rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
                transform.rotation = rotation;
            }
            // otherwise if middle mouse is selected, we pan by way of transforming the target in screenspace
            else if (Input.GetMouseButton(2))
            {
                //grab the rotation of the camera so we can move in a psuedo local XY space
                target.rotation = transform.rotation;
                target.Translate(Vector3.right * -Input.GetAxis("Mouse X") * panSpeed);
                target.Translate(transform.up * -Input.GetAxis("Mouse Y") * panSpeed, Space.World);
            }
           
            ////////Orbit Position
           
            // affect the desired Zoom distance if we roll the scrollwheel
            desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
            //clamp the zoom min/max
            desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
            // For smoothing of the zoom, lerp distance
            currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);
           
            // calculate position based on the new currentDistance
            position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
            transform.position = position;
        }
       
        private static float ClampAngle(float angle, float min, float max)
        {
            if (angle < -360)
                angle += 360;
            if (angle > 360)
                angle -= 360;
            return Mathf.Clamp(angle, min, max);
        }
    }

So, in game you want the player to be able to adjust the camera position, rotation, via a mouse controller? Sure, of course, why not?

thank you so much Dantel. You saved my life
I’ve been looking such a code for weeks
thank you a lots.

Source code references here:
https://github.com/Unity-Technologies/UnityCsReference/blob/bf25390e5c79172c3d3e9a6b755680679e1dbd50/Editor/Mono/SceneView/SceneViewMotion.cs