using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using UnityEngine; using System.Runtime.InteropServices; public class Smooth3DCamera : MonoBehaviour { public GameObject donahua1, donahua2, donahua3, donahua4, donahua5, donahua6, donahua7, donahua8, donahua9, donahua10, donahua11, donahua12, donahua13, donahua14, donahua15, donahua16, donahua17, donahua18, donahua19; public Transform pivot; public float distance = 10.0f; public float minDistance = 2f; public float maxDistance = 15f; public float zoomSpeed = 1f; public float xSpeed = 250.0f; public float ySpeed = 250.0f; public bool allowYTilt = true; public float yMinLimit = -90f; public float yMaxLimit = 90f; private float x = 0.0f; private float y = 0.0f; private float targetX = 0f; private float targetY = 0f; public float targetDistance = 0f; private float xVelocity = 1f; private float yVelocity = 1f; private float zoomVelocity = 1f; private void Start() { // donahua1.SetActive(false); // donahua2.SetActive(false); // donahua3.SetActive(false); // donahua3.SetActive(false); // donahua4.SetActive(false); // donahua5.SetActive(false); // donahua6.SetActive(false); // donahua7.SetActive(false); // donahua8.SetActive(false); // donahua9.SetActive(false); // donahua10.SetActive(false); // donahua11.SetActive(false); // donahua12.SetActive(false); // donahua13.SetActive(false); // donahua14.SetActive(false); // donahua15.SetActive(false); // donahua16.SetActive(false); // donahua17.SetActive(false); // donahua18.SetActive(false); // donahua19.SetActive(false); var angles = transform.eulerAngles; targetX = x = angles.y; targetY = y = angles.x; targetDistance = distance; } public void Donghua(int a) { switch(a) { case 1 : pivot = donahua1.transform; donahua1.SetActive(true); break; case 2: pivot = donahua2.transform; donahua2.SetActive(true); break; case 3: pivot = donahua3.transform; donahua3.SetActive(true); break; case 4: pivot = donahua4.transform; donahua4.SetActive(true); break; case 5: pivot = donahua5.transform; donahua5.SetActive(true); break; case 6: pivot = donahua6.transform; donahua6.SetActive(true); break; case 7: pivot = donahua7.transform; donahua7.SetActive(true); break; case 8: pivot = donahua8.transform; donahua8.SetActive(true); break; case 9: pivot = donahua9.transform; donahua9.SetActive(true); break; case 10: pivot = donahua10.transform; donahua10.SetActive(true); break; case 11: pivot = donahua11.transform; donahua11.SetActive(true); break; case 12: pivot = donahua12.transform; donahua12.SetActive(true); break; case 13: pivot = donahua13.transform; donahua13.SetActive(true); break; case 14: pivot = donahua14.transform; donahua14.SetActive(true); break; case 15: pivot = donahua15.transform; donahua15.SetActive(true); break; case 16: pivot = donahua16.transform; donahua16.SetActive(true); break; case 17: pivot = donahua17.transform; donahua17.SetActive(true); break; case 18: pivot = donahua18.transform; donahua18.SetActive(true); break; } } private void LateUpdate() { if (!pivot) return; if (Input.GetAxis("Mouse ScrollWheel") > 0.0f) { targetDistance -= zoomSpeed; } else if (Input.GetAxis("Mouse ScrollWheel") < 0.0f) { targetDistance += zoomSpeed; } targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance); if (Input.GetMouseButton(0)) { targetX += Input.GetAxis("Mouse X") * xSpeed * 0.02f; if (allowYTilt) { targetY -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; targetY = ClampAngle(targetY, yMinLimit, yMaxLimit); } } x = Mathf.SmoothDampAngle(x, targetX, ref xVelocity, 0.3f); y = allowYTilt ? Mathf.SmoothDampAngle(y, targetY, ref yVelocity, 0.3f) : targetY; Quaternion rotation = Quaternion.Euler(y, x, 0); //Debug.Log(rotation); distance = Mathf.SmoothDamp(distance, targetDistance, ref zoomVelocity, 1f); Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + pivot.position; transform.rotation = rotation; 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); } }