using UnityEngine; using System.Collections; public class Camera360 : MonoBehaviour { public Transform target; public Vector3 targetOffset; public float initdistance = 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; public float autoRotate = 1f; public float autoRotateSpeed = 0.1f; private float xDeg = 0.0f; private float yDeg = 0.0f; public float currentDistance; private float desiredDistance; private Quaternion currentRotation; private Quaternion desiredRotation; private Quaternion rotation; private Vector3 position; private float idleTimer = 0.0f; private float idleSmooth = 0.0f; void Start() { Init(); //if (!target) //{ // go = new GameObject("cam target"); // go.transform.position = transform.position + (transform.forward * distance); // target = go.transform; //} } GameObject go; void OnEnable() { //Init(); } public void SetTarget(Transform objCenter) { go.transform.position = objCenter.position; go.transform.rotation = objCenter.rotation; currentDistance = desiredDistance = initdistance; //更新距离 //视角定位到X轴 currentRotation = rotation= Quaternion.LookRotation(-objCenter.right); transform.rotation = currentRotation; xDeg = transform.rotation.eulerAngles.y; yDeg = transform.rotation.eulerAngles.x; } public void Init() { // if (!target) { go = new GameObject("cam target"); go.transform.position = transform.position + (transform.forward * initdistance); target = go.transform; } //distance = Vector3.Distance(transform.position, target.position); currentDistance = initdistance; desiredDistance = initdistance; //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); xDeg = transform.rotation.eulerAngles.y; yDeg = transform.rotation.eulerAngles.x; position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset); } /* * Camera logic on LateUpdate to only update after all character movement logic has been handled. */ void LateUpdate() { if (target == null) return; // 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") * 0.02f * zoomRate * 0.125f * Mathf.Abs(desiredDistance); //} //// If middle mouse and left alt are selected? ORBIT //else if (Input.GetMouseButton(0)) { xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f; yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; //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, 0.02f * zoomDampening); transform.rotation = rotation; // Reset idle timers idleTimer = 0; idleSmooth = 0; } else { //自动旋转 //idleTimer+= 0.02f; // if (idleTimer > autoRotate && autoRotate > 0) // { // idleSmooth += (0.02f + idleSmooth) * 0.005f; // idleSmooth = Mathf.Clamp(idleSmooth, 0, 1); // xDeg += xSpeed * Time.deltaTime * idleSmooth * autoRotateSpeed; // } // //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, 0.02f * zoomDampening * 2); // transform.rotation = rotation; } // Middle click disabled // 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") * 0.02f * 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, 0.02f * 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); } /// /// 修改物体及子物体层级 /// /// /// public void ChangeObjLayer(GameObject obj,string layerName) { foreach (Transform item in obj.GetComponentsInChildren(true)) { item.gameObject.layer = LayerMask.NameToLayer(layerName); } } }