using System; using System.Collections; using AibisDream.FixSystem; using AibisDream.Framework; using AibisDream.Utility; using Cinemachine; using DG.Tweening; using UnityEngine; using UnityEngine.Events; namespace AibisDream { public class EngineSystem : MonoBehaviour { [SerializeField]private SpriteRenderer cover; [Header("系统配置")] public EngineConfig engineConfig; public bool isAvailable; public bool isPullActive; private bool _isSuccess; public float curSpeed; public float targetSpeed = 0.95f; [SerializeField] private float coverMoveDuration = 5f; [SerializeField] private float coverMoveDistance = 2.8f; public UnityEvent updateSpeedEvent = new(); private void Awake() { FixSystemCenter.SystemDic.Register(this); // 注册相机 var virtualCam = transform.Find("Engine Camera").GetComponent(); CameraKit.Instance.RegisterCamera(CameraEnum.Engine, virtualCam); } public IEnumerator StepOnGas(float target, float duration) { // 逐渐加速 yield return DOTween.To(() => curSpeed, x => { curSpeed = x; }, target, duration).WaitForCompletion(); } public void AddAirPress(float speedDelta) { curSpeed = CommonUtil.Limit(curSpeed + speedDelta / engineConfig.pullCount, 1, 0); } private void OnDestroy() { CameraKit.Instance.UnRegisterCamera(CameraEnum.Engine); } private void Update() { updateSpeedEvent.Invoke(curSpeed, GetSpeedScale()); if (curSpeed >= targetSpeed && !_isSuccess) { _isSuccess = true; isPullActive = false; DialogController.Instance?.StartDialogNode("EngineSuccess"); } } private float GetSpeedScale() { return 1 + curSpeed * engineConfig.speedRate; } /// /// 开启系统交互 /// private void EnableSystem() { isAvailable = true; } /// /// 关闭系统交互 /// private void DisableSystem() { isAvailable = false; } /// /// 打开盖板 /// 关闭系统交互 /// /// 动画序列 public Tween OpenCover() { var sq = DOTween.Sequence(); // 盖板上移 var moveDis = new Vector3(0, coverMoveDistance, 0); sq.Join(cover.transform.DOBlendableMoveBy(moveDis, coverMoveDuration)); // 盖板淡出 sq.Join(cover.DOFade(0, coverMoveDuration)); // 为引擎系统解锁 sq.OnComplete(EnableSystem); return sq; } /// /// 关闭盖板 /// /// 动画序列 public Tween CloseCover() { var sq = DOTween.Sequence(); sq.Join(cover.DOFade(1, coverMoveDuration)); var moveDis = new Vector3(0, -coverMoveDistance, 0); sq.Join(cover.transform.DOBlendableMoveBy(moveDis, coverMoveDuration)); // 锁定引擎系统 sq.OnComplete(DisableSystem); return sq; } public void ActivePull() { isPullActive = true; var pull = GetComponentInChildren(); pull.ActiveShine(); } } [Serializable] public struct EngineConfig { [Header("齿轮基础速度")] public float gearSpeed; [Header("齿轮速度倍率")] public float speedRate; [Header("拉满几次到全速")] public float pullCount; [Header("拉绳回缩速度")] public float returnSpeed; } }