Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/AquariumCameraControllerVR.cs
2026-02-21 16:45:37 +08:00

249 lines
8.1 KiB
C#

using System.Collections;
using UltimateWater;
using UnityEngine;
public class AquariumCameraControllerVR : MonoBehaviour, IAquariumCamera
{
[SerializeField]
private Transform _controllerParent;
[SerializeField]
private Transform _cameraParent;
[SerializeField]
[Header("Follow Fish")]
private float _cameraPositionSmoothTime = 0.2f;
[SerializeField]
[Header("Height")]
private float _minHeight = -2f;
[SerializeField]
private float _maxHeight = 2f;
[SerializeField]
private float _defaultHeight = -1f;
[SerializeField]
private float _cameraHeightSpeed = 1f;
[SerializeField]
private float _cameraHeightSmoothTime = 0.2f;
[Header("Distance")]
[SerializeField]
private float _minDistance = 0.5f;
[SerializeField]
private float _maxDistance = 2f;
[SerializeField]
private float _defaultDistance = 0.75f;
[SerializeField]
private float _cameraZoomSpeed = 1f;
[SerializeField]
private float _cameraZoomSmoothTime = 0.2f;
[SerializeField]
[Header("Rotation")]
private float _cameraRotationSpeed = 1f;
[SerializeField]
private float _cameraRotationSmoothTime = 0.2f;
private Transform _cameraTransformVR;
private SchoolChild _currentFish;
private Vector3 _currentCameraPosition;
private Vector3 _cameraPositionVelocity;
private float _targetCameraDistance;
private float _currentCameraDistance;
private float _cameraDistanceVelocity;
private float _targetCameraHeight;
private float _currentCameraHeight;
private float _cameraHeightVelocity;
private Vector3 _targetCameraRotation;
private Vector3 _currentCameraRotation;
private Vector3 _cameraRotationVelocity;
private Vector3 _targetCameraPosition
{
get
{
return _currentFish._cacheTransform.position;
}
}
GameObject IAquariumCamera.gameObject
{
get
{
return base.gameObject;
}
}
private void Update()
{
UpdateCameraRotation();
CalculateCameraPosition();
CalculateCameraDistance();
CalculateCameraHeight();
CalculateCameraRotateArund();
}
private void LateUpdate()
{
if (!(_currentFish == null))
{
SetCameraPosition();
SetCameraDistance();
SetCameraHeight();
SetCameraRoteAround();
}
}
public void AttachToFish(SchoolChild fish)
{
_currentFish = fish;
_cameraTransformVR = TrophyRoomManager.Instance.trophyPlayerVR.vrCameraParent;
_cameraTransformVR.SetParent(_cameraParent);
_cameraTransformVR.localPosition = Vector3.down * VRManager.Instance.cameraHeight;
_cameraTransformVR.localRotation = Quaternion.identity;
TrophyRoomManager.Instance.trophyPlayerVR.ufpsCamera.GetComponent<WaterCamera>().enabled = true;
TrophyRoomManager.Instance.trophyPlayerVR.ufpsCamera.GetComponent<UnderwaterIME>().enabled = true;
_currentCameraPosition = _targetCameraPosition;
_targetCameraDistance = (_currentCameraDistance = _defaultDistance);
_targetCameraHeight = (_currentCameraHeight = _defaultHeight);
_currentCameraRotation = (_targetCameraRotation = _controllerParent.eulerAngles);
base.enabled = true;
}
public void DetachFromFish()
{
base.enabled = false;
_currentFish = null;
_cameraTransformVR.SetParent(TrophyRoomManager.Instance.trophyPlayerVR.transform);
_cameraTransformVR.localPosition = Vector3.zero;
_cameraTransformVR.localRotation = Quaternion.identity;
TrophyRoomManager.Instance.trophyPlayerVR.ufpsCamera.GetComponent<WaterCamera>().enabled = false;
TrophyRoomManager.Instance.trophyPlayerVR.ufpsCamera.GetComponent<UnderwaterIME>().enabled = false;
}
private void CalculateCameraPosition()
{
_currentCameraPosition = Vector3.SmoothDamp(_currentCameraPosition, _targetCameraPosition, ref _cameraPositionVelocity, _cameraPositionSmoothTime);
}
private void CalculateCameraDistance()
{
float axis = UtilitiesInput.GetAxis("MOVE_VERTICAL");
_targetCameraDistance = Mathf.Clamp(_targetCameraDistance - axis * _cameraZoomSpeed * Time.deltaTime, _minDistance, _maxDistance);
_currentCameraDistance = Mathf.SmoothDamp(_currentCameraDistance, _targetCameraDistance, ref _cameraDistanceVelocity, _cameraZoomSmoothTime);
}
private void CalculateCameraRotateArund()
{
float axis = UtilitiesInput.GetAxis("MOVE_HORIZONTAL");
_targetCameraRotation.y -= axis * _cameraRotationSpeed * Time.deltaTime;
_currentCameraRotation = Vector3.SmoothDamp(_currentCameraRotation, _targetCameraRotation, ref _cameraRotationVelocity, _cameraRotationSmoothTime);
}
private void CalculateCameraHeight()
{
float axis = UtilitiesInput.GetAxis("LOOK_VERTICAL");
_targetCameraHeight = Mathf.Clamp(_targetCameraHeight + axis * _cameraHeightSpeed * Time.deltaTime, _minHeight, _maxHeight);
_currentCameraHeight = Mathf.SmoothDamp(_currentCameraHeight, _targetCameraHeight, ref _cameraHeightVelocity, _cameraHeightSmoothTime);
}
private void SetCameraPosition()
{
_controllerParent.position = _currentCameraPosition;
}
private void SetCameraRoteAround()
{
_controllerParent.eulerAngles = _currentCameraRotation;
}
private void SetCameraDistance()
{
Vector3 localPosition = _cameraTransformVR.localPosition;
localPosition.z = 0f - _currentCameraDistance;
_cameraTransformVR.localPosition = localPosition;
}
private void SetCameraHeight()
{
Vector3 localPosition = _cameraTransformVR.localPosition;
localPosition.y = _currentCameraHeight;
_cameraTransformVR.localPosition = localPosition;
}
private void UpdateCameraRotation()
{
if (VRManager.Instance.playerRotateStyle == VRManager.PlayerRotateStyle.STEP)
{
if (UtilitiesInput.GetButtonDown("VR_TURN_LEFT") || OVRInput.GetDown(OVRInput.Button.SecondaryThumbstickLeft, OVRInput.Controller.Gamepad) || UtilitiesInput.isRThumbstickLeft)
{
Vector3 rotationAquariumCamera = new Vector3(_cameraTransformVR.eulerAngles.x, _cameraTransformVR.eulerAngles.y - VRManager.Instance.turnAngle, _cameraTransformVR.eulerAngles.z);
SetRotationAquariumCamera(rotationAquariumCamera);
}
else if (UtilitiesInput.GetButtonDown("VR_TURN_RIGHT") || OVRInput.GetDown(OVRInput.Button.SecondaryThumbstickRight, OVRInput.Controller.Gamepad) || UtilitiesInput.isRThumbstickRight)
{
Vector3 rotationAquariumCamera2 = new Vector3(_cameraTransformVR.eulerAngles.x, _cameraTransformVR.eulerAngles.y + VRManager.Instance.turnAngle, _cameraTransformVR.eulerAngles.z);
SetRotationAquariumCamera(rotationAquariumCamera2);
}
}
else if (VRManager.Instance.playerRotateStyle == VRManager.PlayerRotateStyle.FADE_STEP)
{
if (UtilitiesInput.GetButtonDown("VR_TURN_LEFT") || OVRInput.GetDown(OVRInput.Button.SecondaryThumbstickLeft, OVRInput.Controller.Gamepad) || UtilitiesInput.isRThumbstickLeft)
{
Vector3 eulerAngles = new Vector3(_cameraTransformVR.eulerAngles.x, _cameraTransformVR.eulerAngles.y - VRManager.Instance.turnAngle, _cameraTransformVR.eulerAngles.z);
StartCoroutine(SetRotationFadeAquariumCamera(eulerAngles, VRManager.Instance.fadeDuration));
}
else if (UtilitiesInput.GetButtonDown("VR_TURN_RIGHT") || OVRInput.GetDown(OVRInput.Button.SecondaryThumbstickRight, OVRInput.Controller.Gamepad) || UtilitiesInput.isRThumbstickRight)
{
Vector3 eulerAngles2 = new Vector3(_cameraTransformVR.eulerAngles.x, _cameraTransformVR.eulerAngles.y + VRManager.Instance.turnAngle, _cameraTransformVR.eulerAngles.z);
StartCoroutine(SetRotationFadeAquariumCamera(eulerAngles2, VRManager.Instance.fadeDuration));
}
}
else if (VRManager.Instance.playerRotateStyle == VRManager.PlayerRotateStyle.FREE && Mathf.Abs(UtilitiesInput.lookAxis.x) > 0.3f)
{
Vector3 rotationAquariumCamera3 = new Vector3(_cameraTransformVR.eulerAngles.x, _cameraTransformVR.eulerAngles.y + VRManager.Instance.freeTurnSpeed * Time.deltaTime * UtilitiesInput.lookAxis.x, base.transform.eulerAngles.z);
SetRotationAquariumCamera(rotationAquariumCamera3);
}
}
private void SetRotationAquariumCamera(Vector3 eulerAngles)
{
_cameraTransformVR.eulerAngles = eulerAngles;
}
private IEnumerator SetRotationFadeAquariumCamera(Vector3 eulerAngles, float fadeDuration)
{
if (!HUDManager.Instance)
{
SetRotationAquariumCamera(eulerAngles);
yield break;
}
HUDManager.Instance.FadeDark(1f, fadeDuration);
yield return new WaitForSeconds(fadeDuration);
SetRotationAquariumCamera(eulerAngles);
yield return new WaitForSeconds(0.05f);
HUDManager.Instance.FadeDark(0f, fadeDuration);
}
}