本文原创,转载请注明出处: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 }