TaiZhouCangChu_VRanime/Assets/动画/Scripts/Smooth3DCamera.cs

200 lines
5.7 KiB
C#

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);
}
}