title: Unity3d: rotate camera around center of the screen with middle mouse button pressed
body: <p>I am working on an RTS game and would like to support the camera to rotate around the current center of the screen on mouse button pressed, just like in any RTS, strategy game. </p>
  
  <p>I tried the MouseOrbitImproved script as shown on the unity wiki (copied below), but it  needs a target object used by the camera to rotate around. My problem is that my target is always the current center of the screen.</p>
  
  <p>Any idea how to achieve this, but only while the middle mouse button is pressed?</p>
  
  <pre><code>using UnityEngine;
  using System.Collections;
  
  [AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]
  public class MouseOrbitImproved : MonoBehaviour {
  
      public Transform target;
      public float distance = 5.0f;
      public float xSpeed = 120.0f;
      public float ySpeed = 120.0f;
  
      public float yMinLimit = -20f;
      public float yMaxLimit = 80f;
  
      public float distanceMin = .5f;
      public float distanceMax = 15f;
  
      private Rigidbody rigidbody;
  
      float x = 0.0f;
      float y = 0.0f;
  
      // Use this for initialization
      void Start () 
      {
          Vector3 angles = transform.eulerAngles;
          x = angles.y;
          y = angles.x;
  
          rigidbody = GetComponent&lt;Rigidbody&gt;();
  
          // Make the rigid body not change rotation
          if (rigidbody != null)
          {
              rigidbody.freezeRotation = true;
          }
      }
  
      void LateUpdate () 
      {
          if (target) 
          {
              x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
              y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
  
              y = ClampAngle(y, yMinLimit, yMaxLimit);
  
              Quaternion rotation = Quaternion.Euler(y, x, 0);
  
              distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);
  
              RaycastHit hit;
              if (Physics.Linecast (target.position, transform.position, out hit)) 
              {
                  distance -=  hit.distance;
              }
              Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
              Vector3 position = rotation * negDistance + target.position;
  
              transform.rotation = rotation;
              transform.position = position;
          }
      }
  
      public static float ClampAngle(float angle, float min, float max)
      {
          if (angle &lt; -360F)
              angle += 360F;
          if (angle &gt; 360F)
              angle -= 360F;
          return Mathf.Clamp(angle, min, max);
      }
  }
  </code></pre>