trouble-in-terror-town/Assets/Scripts/Player/Character/Controller/CinemachineObjectRotator.cs

100 lines
4.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
namespace TTTSC.Player.Character.Controller
{
public class CinemachineObjectRotator : MonoBehaviour
{
public bool enableTargetRotation;
CinemachineVirtualCamera _virtualCamera;
PlayerInputReceiver _playerInputReceiver;
public TargetRotationModes rotateWithCameraRotationMode;
public TargetRotationModes hotizontalRotationMode;
public TargetRotationModes verticalRotationMode;
public Transform cameraTransform;
public List<Transform> horizontalRotationTargets, verticalRotationTargets, rotateWithCameraTargets;
CinemachinePOV _cinemachinePOV;
protected void Awake()
{
_virtualCamera = GetComponent<CinemachineVirtualCamera>();
_cinemachinePOV = _virtualCamera.GetCinemachineComponent<CinemachinePOV>();
_playerInputReceiver = FindObjectOfType<PlayerInputReceiver>();
}
public enum TargetRotationModes
{
disabled,
rotateFollowTarget,
rotateLookTarget,
rotateSpecificTargets
}
private void LateUpdate()
{
float rotationX;
float rotationY;
switch (enableTargetRotation)
{
case true:
rotationX = _cinemachinePOV.m_HorizontalAxis.Value;
switch (hotizontalRotationMode)
{
case TargetRotationModes.rotateFollowTarget:
_virtualCamera.Follow.rotation = Quaternion.Euler(_virtualCamera.Follow.up * rotationX);
break;
case TargetRotationModes.rotateLookTarget:
_virtualCamera.LookAt.rotation = Quaternion.Euler(_virtualCamera.LookAt.up * rotationX);
break;
case TargetRotationModes.rotateSpecificTargets:
if (horizontalRotationTargets.Count > 0)
{
for (int i = 0; i < horizontalRotationTargets.Count; i++)
{
horizontalRotationTargets[i].rotation = Quaternion.Euler(horizontalRotationTargets[i].up * rotationX);
}
}
break;
}
rotationY = _cinemachinePOV.m_VerticalAxis.Value;
switch (verticalRotationMode)
{
case TargetRotationModes.rotateFollowTarget:
_virtualCamera.Follow.rotation = Quaternion.Euler(_virtualCamera.Follow.right * rotationY);
break;
case TargetRotationModes.rotateLookTarget:
_virtualCamera.LookAt.rotation = Quaternion.Euler(_virtualCamera.LookAt.right * rotationY);
break;
case TargetRotationModes.rotateSpecificTargets:
foreach (Transform target in verticalRotationTargets)
{
target.rotation = Quaternion.Euler(target.right * rotationY);
}
break;
}
switch (rotateWithCameraRotationMode)
{
case TargetRotationModes.rotateFollowTarget:
_virtualCamera.Follow.rotation = cameraTransform.rotation;
break;
case TargetRotationModes.rotateLookTarget:
_virtualCamera.LookAt.rotation = cameraTransform.rotation;
break;
case TargetRotationModes.rotateSpecificTargets:
foreach (Transform target in rotateWithCameraTargets)
{
target.rotation = cameraTransform.rotation;
}
break;
}
break;
}
}
}
}