AK056/Assets/Plugins/PrimeTween/Demo/Scripts/CameraController.cs
2025-05-08 13:38:55 +08:00

58 lines
2.1 KiB
C#

#if PRIME_TWEEN_INSTALLED && UNITY_UGUI_INSTALLED
using PrimeTween;
using UnityEngine;
using UnityEngine.EventSystems;
namespace PrimeTweenDemo {
public class CameraController : Clickable {
[SerializeField] HighlightedElementController highlightedElementController;
[SerializeField] SwipeTutorial swipeTutorial;
[SerializeField] Camera mainCamera;
[SerializeField, Range(0f, 1f)] float cameraShakeStrength = 0.4f;
float currentAngle;
Vector2? inputBeginPos;
bool isAnimating;
float curRotationSpeed;
void OnEnable() {
currentAngle = transform.localEulerAngles.y;
isAnimating = true;
Tween.Custom(this, 0, 5, 2, (target, val) => target.curRotationSpeed = val);
}
void Update() {
if (isAnimating) {
currentAngle += curRotationSpeed * Time.deltaTime;
transform.localEulerAngles = new Vector3(0f, currentAngle);
}
if (highlightedElementController.current == null && InputController.GetDown() && !EventSystem.current.IsPointerOverGameObject()) {
inputBeginPos = InputController.screenPosition;
}
if (InputController.GetUp()) {
inputBeginPos = null;
}
if (inputBeginPos.HasValue) {
var deltaMove = InputController.screenPosition - inputBeginPos.Value;
if (Mathf.Abs(deltaMove.x) / Screen.width > 0.05f) {
isAnimating = false;
inputBeginPos = null;
currentAngle += Mathf.Sign(deltaMove.x) * 45f;
Tween.LocalRotation(transform, new Vector3(0f, currentAngle), 1.5f, Ease.OutCubic);
swipeTutorial.Hide();
}
}
}
public override void OnClick() => ShakeCamera();
public void ShakeCamera() {
Shake();
}
internal Sequence Shake(float startDelay = 0) {
return Tween.ShakeCamera(mainCamera, cameraShakeStrength, startDelay: startDelay);
}
}
}
#endif