本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6856374.html

首先,总结了下最近工作中关于摄像机漫游的功能,

脚本如下:

  1     Transform _Camera;
  2     public LayerMask mask;
  3      
  4     public float checkHeight = 500f;
  5     public float minHeight = 20f;
  6     public float maxHeight = 8000f;
  7     public float minClamp = 50f;
  8     public float maxClamp = 950f;
  9 
 10     public float sensitivityX = 5f;
 11     public float sensitivityY = 5f;
 12     private float rotationY = 0f;
 13 
 14     //上下最大Y视角
 15     public float minimumY = -90f;
 16     public float maximumY = 30f;
 17 
 18     public Vector3 PreMouseMPos;
 19 
 20     public float scrollSpeed = 200f;
 21 
 22     void Start () 
 23     {
 24         mask.value = 1;
 25         _Camera = Camera.main.transform;
 26     }
 27     
 28     // Update is called once per frame
 29     void Update ()
 30     {
 31         if(Input.GetKey(KeyCode.LeftAlt))
 32         {
 33             MouseScrollWheel ();
 34             CameraMove ();
 35             MoveEulerAngles ();
 36         }
 37     }
 38 
 39     /// <summary>
 40     /// Checks the height of the low.
 41     /// </summary>
 42     void CheckLowHeight()
 43     {
 44         if (_Camera.position.x < minClamp)
 45             _Camera.position = new Vector3 (minClamp, _Camera.position.y, _Camera.position.z);
 46         if (_Camera.position.x > maxClamp)
 47             _Camera.position = new Vector3 (maxClamp, _Camera.position.y, _Camera.position.z);
 48         if (_Camera.position.z < minClamp)
 49             _Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, minClamp);
 50         if (_Camera.position.z > maxClamp)
 51             _Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, maxClamp);
 52 
 53         RaycastHit hit;
 54         if(Physics.Raycast(_Camera.position+Vector3.up*checkHeight,Vector3.down,out hit ,checkHeight+minHeight,mask))
 55         {
 56             if(_Camera.position.y-hit.point.y<minClamp)
 57             {
 58                 Vector3 lowPoint = hit.point + new Vector3 (0, minHeight, 0);
 59                 _Camera.position = lowPoint;
 60             }
 61         }
 62     }
 63 
 64     /// <summary>
 65     /// Mouses the scroll wheel.
 66     /// </summary>
 67     private void MouseScrollWheel()
 68     {
 69         if(Input.GetAxis("Mouse ScrollWheel")!=0)
 70         {
 71             _Camera.Translate (new Vector3 (0, 0, Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * scrollSpeed));
 72         }
 73 
 74         CheckLowHeight ();
 75 
 76         if (_Camera.position.y >= maxHeight)
 77             _Camera.position = new Vector3 (_Camera.position.x, maxHeight, _Camera.position.z);
 78     }
 79 
 80     /// <summary>
 81     /// Cameras the move.
 82     /// </summary>
 83     private void CameraMove()
 84     {
 85         if(Input.GetMouseButton(0))
 86         {
 87             if(PreMouseMPos.x<=0)
 88             {
 89                 PreMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0);
 90             }
 91             else
 92             {
 93                 Vector3 CurMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0);
 94                 Vector3 offset = CurMouseMPos - PreMouseMPos;
 95                 offset = -offset * 0.5f * 2;
 96                 if((_Camera.position+offset).y>=minHeight
 97                     &&(_Camera.position+offset).y<=maxHeight)
 98                 {
 99                     _Camera.Translate(offset);
100 
101                     CheckLowHeight();
102 
103                     PreMouseMPos = CurMouseMPos;
104                 }
105             }                
106         }
107         else
108             PreMouseMPos = Vector3.zero;
109     }
110 
111     /// <summary>
112     /// Moves the euler angles.
113     /// </summary>
114     private void MoveEulerAngles()
115     {
116         if(Input.GetMouseButton(1))
117         {
118             float rotationX = _Camera.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX;
119 
120             rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
121 
122             rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
123 
124             _Camera.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
125         }
126     }
MoveRocket

相关文章: