| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | using UnityEngine;namespace Dustyroom {public class OrbitMotion : MonoBehaviour {    public enum TargetMode {        Transform,        Position    }    public TargetMode targetMode = TargetMode.Position;    public Transform targetTransform;    public bool followTargetTransform = true;    public Vector3 targetOffset = Vector3.zero;    public Vector3 targetPosition;    [Space] public float distanceHorizontal = 60.0f;    public float distanceVertical = 60.0f;    public float xSpeed = 120.0f;    public float ySpeed = 120.0f;    public float damping = 3f;    [Space] public bool clampAngle = false;    public float yMinLimit = -20f;    public float yMaxLimit = 80f;    [Space] public bool allowZoom = false;    public float distanceMin = .5f;    public float distanceMax = 15f;    float _x = 0.0f;    float _y = 0.0f;    [Space] public bool autoMovement = false;    public float autoSpeedX = 0.2f;    public float autoSpeedY = 0.1f;    public float autoSpeedDistance = -0.1f;    [Space] public bool interactive = true;    private float _lastMoveTime;    [HideInInspector] public float timeSinceLastMove;    void Start() {        Vector3 angles = transform.eulerAngles;        _x = angles.y;        _y = angles.x;        // Make the rigid body not change rotation        Rigidbody rigidbody = GetComponent<Rigidbody>();        if (rigidbody != null) {            rigidbody.freezeRotation = true;        }#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR        xSpeed *= 0.2f;        ySpeed *= 0.2f;#endif        if (targetMode == TargetMode.Transform) {            if (targetTransform != null) {                targetPosition = targetTransform.position + targetOffset;            }            else {                Debug.LogWarning("Reference transform is not set.");            }        }    }    void Update() {        if (targetMode == TargetMode.Transform && followTargetTransform) {            if (targetTransform != null) {                targetPosition = targetTransform.position + targetOffset;            }            else {                Debug.LogWarning("Reference transform is not set.");            }        }        //*        bool isCameraMoving = false;#if ((UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR)        isCameraMoving = Input.GetTouch(0).deltaPosition.sqrMagnitude > 0f;#else        isCameraMoving = Mathf.Abs(Input.GetAxis("Mouse X")) + Mathf.Abs(Input.GetAxis("Mouse Y")) > 0f;#endif        if (isCameraMoving) {            _lastMoveTime = Time.time;        }        timeSinceLastMove = Time.time - _lastMoveTime;        //*/        if (interactive && Input.GetMouseButton(0)) {#if ((UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR)        _x += Input.GetTouch(0).deltaPosition.x * xSpeed * 40f * 0.02f;        _y -= Input.GetTouch(0).deltaPosition.y * ySpeed * 40f * 0.02f;#else        _x += Input.GetAxis("Mouse X") * xSpeed * 40f * 0.02f;        _y -= Input.GetAxis("Mouse Y") * ySpeed * 40f * 0.02f;#endif        }        else if (autoMovement) {            _x += autoSpeedX * 40f * Time.deltaTime * 10f;            _y -= autoSpeedY * 40f * Time.deltaTime * 10f;            distanceHorizontal += autoSpeedDistance;        }        if (clampAngle) {            _y = ClampAngle(_y, yMinLimit, yMaxLimit);        }        Quaternion rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(_y, _x, 0),            Time.deltaTime * damping);        if (allowZoom) {            distanceHorizontal = Mathf.Clamp(                distanceHorizontal - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax);        }        float rotationX = rotation.eulerAngles.x;        if (rotationX > 90f) {            rotationX -= 360f;        }        float usedDistance = Mathf.Lerp(distanceHorizontal, distanceVertical, Mathf.Abs(rotationX / 90f));        Vector3 negDistance = new Vector3(0.0f, 0.0f, -usedDistance);        Vector3 position = rotation * negDistance + targetPosition;        transform.rotation = rotation;        transform.position = position;    }    private static float ClampAngle(float angle, float min, float max) {        if (angle < -360f)            angle += 360f;        if (angle > 360f)            angle -= 360f;        return Mathf.Clamp(angle, min, max);    }}}
 |