using System; using System.Collections; using System.Collections.Generic; using Unity.Mathematics; using UnityEngine; namespace DS { public class CameraHandler : MonoBehaviour { public Transform cameraTransform; public Transform targetTransform; public Transform cameraPivotTransform; private Transform _myTransform; private Vector3 _cameraTransformPosition; private LayerMask _ignoreLayers; private Vector3 cameraFollowVelocity = Vector3.zero; private bool _cursorLocked = false; public static CameraHandler singleton; public float lookSpeed = 0.1f; public float followSpeed = 0.1f; public float pivotSpeed = 0.03f; private float _targetPosition; private float _defaultPosition; private float _lookAngle; private float _pivotAngle; public float minimumPivot = -35; public float maximumPivot = 35; public float cameraSphereRadius = 0.2f; public float cameraCollisionOffSet = 0.2f; public float minimumCollisionOffSet = 0.2f; private void Awake() { singleton = this; _myTransform = transform; _defaultPosition = cameraTransform.localPosition.z; _ignoreLayers = ~(1 << 8 | 1 << 9 | 1 << 10); } private void Update() { UpdateCursorLock(); } private void UpdateCursorLock() { if (Input.GetMouseButtonDown(0)) { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; _cursorLocked = true; } if (Input.GetKeyDown(KeyCode.Escape)) { Cursor.lockState = CursorLockMode.None; Cursor.visible = true; _cursorLocked = false; } } public void FollowTarget(float delta) { Vector3 targetPosition = Vector3.SmoothDamp(_myTransform.position, targetTransform.position, ref cameraFollowVelocity, delta / followSpeed); _myTransform.position = targetPosition; HandleCameraCollisions(delta); } public void HandleCameraRotation(float delta, float mouseInputX, float mouseInputY) { if (!_cursorLocked) return; _lookAngle += (mouseInputX * lookSpeed) / delta; _pivotAngle -= (mouseInputY * pivotSpeed) / delta; _pivotAngle = Mathf.Clamp(_pivotAngle, minimumPivot, maximumPivot); Vector3 rotation = Vector3.zero; rotation.y = _lookAngle; Quaternion targetRotation = Quaternion.Euler(rotation); _myTransform.rotation = targetRotation; rotation = Vector3.zero; rotation.x = _pivotAngle; targetRotation = Quaternion.Euler(rotation); cameraPivotTransform.localRotation = targetRotation; } public void HandleCameraCollisions(float delta) { _targetPosition = _defaultPosition; RaycastHit hit; Vector3 direction = cameraTransform.position - cameraPivotTransform.position; direction.Normalize(); if (Physics.SphereCast(cameraPivotTransform.position,cameraSphereRadius,direction,out hit,Mathf.Abs(_targetPosition))) { float dis = Vector3.Distance(cameraPivotTransform.position, hit.point); _targetPosition = -(dis - cameraCollisionOffSet); } if (Mathf.Abs(_targetPosition) < minimumCollisionOffSet) { _targetPosition = -minimumCollisionOffSet; } _cameraTransformPosition.z = Mathf.Lerp(cameraTransform.localPosition.z, _targetPosition, delta / 0.2f); cameraTransform.localPosition = _cameraTransformPosition; } } }