using System; using System.Collections; using AibisDream.FixSystem; using AibisDream.Framework; using AibisDream.Utility; using Cinemachine; using DG.Tweening; using UnityEngine; namespace AibisDream { public class ClinicSystem : MonoBehaviour { [HideInInspector] public CharacterViewer character; private Transform _pumpHead; private GameObject _coolingScreen; public Vector3 pumpUpPos; public Vector3 pumpDownPos; public float pumpDuration; private readonly ClinicData _clinicData = new(); private void Awake() { FixSystemCenter.SystemDic.Register(this); GameLoopManager.FixDataContainer.Register(_clinicData); character = transform.GetComponentInChildren(); character.CharacterChangeEvent += OnCharacterChange; _clinicData.LoadEvent += LoadData; _pumpHead = transform.Find("正图").Find("近景").Find("桌上泵头"); _coolingScreen = transform.Find("正图").Find("近景").Find("桌面泵机运作时亮灯").gameObject; // 注册Camera var virtualCam = transform.Find("Clinic Camera").GetComponent(); CameraKit.Instance.RegisterCamera(CameraEnum.Clinic, virtualCam); } private void LoadData(ClinicData data) { StartCoroutine(LoadDataAsync(data)); } private IEnumerator LoadDataAsync(ClinicData data) { yield return character.CharacterInit(data.characterName); character.SwitchFace(data.faceName); character.SwitchPose(data.poseName); if (data.isShow) character.CharacterShow(); if (data.hasDevice) { character.AddLinkDevice(); } else { character.RemoveLinkDevice(); } } public IEnumerator Indoor(float duration) { // 加载诊所场景 gameObject.SetActive(true); // 开始界面淡出 yield return MainUIController.Instance.TVFadeOutSync(duration); } public IEnumerator Quit(float duration) { // 黑屏出现 yield return MainUIController.Instance.FadeInSync(duration); gameObject.SetActive(false); } public void StartTablePump() { _pumpHead.DOLocalMove(pumpDownPos, pumpDuration).SetLoops(-1, LoopType.Yoyo) .SetEase(Ease.Linear); // 点亮屏幕 _coolingScreen.SetActive(true); } public void StopTablePump() { _pumpHead.DOKill(); _pumpHead.DOLocalMove(pumpUpPos, 0.5f); // 熄灭屏幕 _coolingScreen.SetActive(false); } private void OnDestroy() { character.CharacterChangeEvent -= OnCharacterChange; _clinicData.LoadEvent -= LoadData; GameLoopManager.FixDataContainer.Unregister(); FixSystemCenter.SystemDic.Unregister(); CameraKit.Instance.UnRegisterCamera(CameraEnum.Clinic); } private void OnCharacterChange(CharacterData characterData) { CommonUtil.CopyFields(characterData, _clinicData); } } public class ClinicData : IData { public string characterName; public string faceName; public string poseName; public bool hasDevice; public bool isShow; public event Action LoadEvent; public void Load() { LoadEvent?.Invoke(this); } } }