using System; using System.Collections; using AibisDream.FixSystem; using AibisDream.Framework; using AibisDream.Utility; using Cinemachine; using UnityEngine; namespace AibisDream { public class ClinicSystem : MonoBehaviour { [HideInInspector] public CharacterViewer character; private GameObject _coolingScreen; 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; // 注册Camera var clinicCam = transform.Find("Clinic Camera").GetComponent(); var coolingCam = transform.Find("Cooling Camera").GetComponent(); CameraKit.Instance.RegisterCamera(CameraEnum.Clinic, clinicCam); CameraKit.Instance.RegisterCamera(CameraEnum.CoolingMachine, coolingCam); } 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); } 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); } } }