[Unity實戰]相機觀察物體
阿新 • • 發佈:2019-01-10
在原有的旋轉、縮放的基礎上加上了“慣性”。
using UnityEngine; using System.Collections; public class CameraObserve : MonoBehaviour { public Transform targetObj; public float rotateSpeed = 100f; public float translateSpeed = 10f; public float minDistance = 3f;//縮放觀察的最小距離 public float maxDistance = 15f;//縮放觀察的最大距離 public bool isInertiaRot = false;//鬆開左鍵後是否會繼續旋轉少量角度 public bool isInertiaTra = false;//不滾滾輪後是否會繼續前進少量距離 private float mouseXRecord; private float mouseScrollRecord; // Update is called once per frame void Update () { float mouseX = Input.GetAxis("Mouse X"); float mouseScroll = Input.GetAxis("Mouse ScrollWheel"); if (Input.GetMouseButton(0)) { if (mouseX != 0) { transform.RotateAround(targetObj.position, targetObj.up, mouseX * rotateSpeed * Time.deltaTime); mouseXRecord = mouseX; } } if (mouseScroll != 0) { //print(Vector3.Distance(targetObj.position,transform.position)); Vector3 a = transform.position + (targetObj.position - transform.position) * mouseScroll * translateSpeed * Time.deltaTime; float distance = Vector3.Distance(targetObj.position, a); if ((distance > minDistance) && (distance < maxDistance)) transform.position = a; mouseScrollRecord = mouseScroll; } } void LateUpdate() { if (isInertiaRot && Input.GetMouseButtonUp(0)) { InvokeRepeating("Rotate",0,Time.deltaTime); StartCoroutine(StopRotate(0.5f)); } if (isInertiaTra && (Input.GetAxis("Mouse ScrollWheel") == 0) && (mouseScrollRecord != 0)) { InvokeRepeating("Translate", 0, Time.deltaTime); StartCoroutine(StopTranslate(2f)); isInertiaTra = false; } } void Rotate() { transform.RotateAround(targetObj.position, targetObj.up, mouseXRecord * rotateSpeed * Time.deltaTime); } void Translate() { Vector3 a = transform.position + (targetObj.position - transform.position) * mouseScrollRecord * translateSpeed * Time.deltaTime; float distance = Vector3.Distance(targetObj.position, a); if ((distance > minDistance) && (distance < maxDistance)) transform.position = a; } IEnumerator StopRotate(float time) { yield return new WaitForSeconds(time); CancelInvoke("Rotate"); mouseXRecord = 0; } IEnumerator StopTranslate(float time) { yield return new WaitForSeconds(time); CancelInvoke("Translate"); mouseScrollRecord = 0; isInertiaTra = true; } }