YiHe_AllVersion/YHWeb/Assets/YHElectric/Scripts/InputController/CameraOrbit.cs

116 lines
5.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace YHElectric
{
public class CameraOrbit : MonoBehaviour
{
public bool isActive = false;
public bool isControllable = true;
public bool reverseXAxis = false;
public bool reverseYAxis = false;
public float minZoomAmount = 1;
public float maxZoomAmount = 8;
public Transform cameraTarget;
public Vector2 mouseSensitivity = new Vector2(4.0f, 4.0f);
public Vector3 cameraOffset = new Vector3(0.0f, 0.0f, 0.0f);
public float cameraFOV = 60;
public ControllerMaster CM;
public InputController IC;
private Transform cameraObject;
private Vector3 targetPosition;
private Quaternion targetRotation;
private Vector2 axisSensitivity = new Vector2(4, 4);
private float setFOV = 1;
private float camFOV = 60f;
private float oldMouseRotation;
private float MouseRotationDistance = 0;
private float MouseVerticalDistance = 0;
private float MouseScrollDistance = 0;
[HideInInspector] public static float followDistance = 130;//摄像机初始距离与焦点,值越大摄像机越远
private float followTgtDistance = 0;
private float camRotation = 0;
private float camHeight = 80;
private bool orbitView = false;
private bool isExtraZoom = false;
public static bool isFoucs = false;
public static bool isRotate = false;
[HideInInspector]
public Animator anim;
private void Awake()
{
//anim = GetComponent<Animator>();
//anim.enabled = false;
targetPosition = cameraTarget.position;
targetRotation = Quaternion.Euler(new Vector3(90, 0, 0));
}
private void FixedUpdate()
{
if (isActive)
{
cameraObject = CM.cameraObject;
if (isControllable)
{
//isExtraZoom = IC.inputMouseKey1;
setFOV = isExtraZoom ? 0.5f : 1;
orbitView = IC.inputMouseKey0 || IC.inputMouseKey1;
}
targetPosition = cameraTarget.position;
oldMouseRotation = MouseRotationDistance;
MouseRotationDistance = IC.inputMouseX /50;
MouseVerticalDistance = IC.inputMouseY /8;
MouseScrollDistance = IC.inputMouseWheel*40 ;
if (reverseXAxis) MouseRotationDistance = -IC.inputMouseX / 50;
if (reverseYAxis) MouseVerticalDistance = -IC.inputMouseY /2;
camFOV = Mathf.Lerp(camFOV, cameraFOV * setFOV, Time.deltaTime * 4.0f);
axisSensitivity = new Vector2(
Mathf.Lerp(axisSensitivity.x, mouseSensitivity.x, Time.deltaTime * 4.0f),
Mathf.Lerp(axisSensitivity.y, mouseSensitivity.y, Time.deltaTime * 4.0f)
);
if (isControllable)
{
float followLerpSpeed = 2.0f;
followDistance -= MouseScrollDistance;
followDistance = Mathf.Clamp(followDistance, minZoomAmount, maxZoomAmount);
followTgtDistance = Mathf.Lerp(followTgtDistance, followDistance, Time.deltaTime * followLerpSpeed);
if (orbitView) camRotation = Mathf.Lerp(oldMouseRotation, MouseRotationDistance * axisSensitivity.x, Time.deltaTime);
targetRotation.eulerAngles = new Vector3(
targetRotation.eulerAngles.x,
targetRotation.eulerAngles.y + camRotation,
targetRotation.eulerAngles.z
);
cameraObject.transform.eulerAngles = new Vector3(
targetRotation.eulerAngles.x,
targetRotation.eulerAngles.y,
cameraObject.transform.eulerAngles.z
);
if (orbitView) camHeight = Mathf.Lerp(camHeight, camHeight + MouseVerticalDistance * axisSensitivity.y, Time.deltaTime);
camHeight = Mathf.Clamp(camHeight, 5, 200);
if (isFoucs)
{
followDistance = 10;
camHeight = cameraTarget.transform.position.y;
isFoucs = false;
}
cameraObject.transform.position = new Vector3(
cameraTarget.transform.position.x + cameraOffset.x + (-cameraObject.transform.up.x * followTgtDistance),
Mathf.Lerp(camHeight, cameraTarget.transform.position.y + cameraOffset.y + (-cameraObject.transform.up.y * followTgtDistance), Time.deltaTime * 0.5f),
cameraTarget.transform.position.z + cameraOffset.z + (-cameraObject.transform.up.z * followTgtDistance)
);
cameraObject.transform.LookAt(new Vector3(targetPosition.x, targetPosition.y, targetPosition.z));
cameraObject.GetComponent<Camera>().fieldOfView = camFOV;
}
}
}
}
}