using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class PassManager : MonoBehaviour { public static PassManager Instance = null; [Header("动画事件")] public AniAction aniAction; [Header("相机点位")] public List cameraPoints; [Header("操作步骤")] public List ctrlPartList; [Header("动画部件")] public Animator studentAni; public Animator[] npcAni; [Header("历史操作")] public Transform hisitoryInfoParent; private List historyInfoList=new List(); [Header("关卡提示")] public TextWrite PartTipText; public List PartTipTxtList; public Text errorTip; public Text npcStateTxt; public Text npcHuxiTxt; public Text timeTipTxt; public GameObject timeOutTip; public float startTime = 5f; private float timer = 0f; public bool isTest = false; [HideInInspector] public bool isEnd = false; public AudioSource audioSource; private Dictionary AniActionDict = new Dictionary(); private void Awake() { Instance = this; } private void Start() { } public void GameStart() { StartTimeAction(startTime, () => { ChangeCameraPoint(1); SetTip(1, () => { SetCtrlPart(1); }); }); //audioSource = GetComponent(); InitAniAction(); } private void Update() { if (isTest&&!isEnd) { timer += Time.deltaTime; timeTipTxt.text = (240-timer).ToString("0"); if (timer >= (240)) { //提示通关失败 timeOutTip.gameObject.SetActive(true); isEnd = true; } } } /// /// 动画事件,每关单独做出来 /// private void InitAniAction() { aniAction.InitAniAction(); } #region 流程函数 public void SetNpcSate(string str) { npcStateTxt.text = str; npcHuxiTxt.text = str; } /// /// 错误提示 /// /// public void AddTip(string str) { errorTip.text = str; errorTip.transform.parent.gameObject.SetActive(true); StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); }); } public void ErrorTip() { errorTip.GetComponent().text = "操作有误,请重新考虑并选择"; errorTip.transform.parent.gameObject.SetActive(true); audioSource.clip = Resources.Load("Audio/错误提示"); audioSource.Play(); StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); }); } public void ErrorTip(string str) { errorTip.transform.parent.gameObject.SetActive(true); errorTip.GetComponent().text = str; audioSource.clip = Resources.Load("Audio/错误提示"); audioSource.Play(); StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); }); } public void ChangeCameraPoint(int index) { if (cameraPoints.Count < index) return; Camera.main.transform.DOMove(cameraPoints[index - 1].position, 1f); Camera.main.transform.DORotate(cameraPoints[index - 1].eulerAngles, 1f); } //设置提示 public void SetTip(int index) { if (PartTipTxtList[index] == "") { PartTipText.transform.parent.gameObject.SetActive(false); return; } PartTipText.ChangeText(PartTipTxtList[index - 1]); } public void SetTip(int index, Action action) { PartTipText.ChangeText(PartTipTxtList[index - 1], action); } public void SetTip(string str, Action action) { PartTipText.ChangeText(str, action); } public void SetTip(string str) { PartTipText.ChangeText(str); } /// /// 设置操作步骤部件 /// /// public void SetCtrlPart(int index) { for (int i = 0; i < ctrlPartList.Count; i++) { if (i == index - 1) { ctrlPartList[i].SetActive(true); continue; } ctrlPartList[i].SetActive(false); } } public void HideCtrlPart(int index) { ctrlPartList[index-1].SetActive(false); } public void SetStudentAni(string aniName) { //播放动画 studentAni.Play(aniName); Action action = aniAction.GetAction(aniName); if (action != null) { // 获取AnimatorController //var controller = studentAni.runtimeAnimatorController as AnimatorController; AnimationClip[] clips = studentAni.runtimeAnimatorController.animationClips; AnimationClip clip = null; for (int i = 0; i < clips.Length; i++) { if (clips[i].name == aniName) { clip = clips[i]; } } // 获取名为"Walk"的AnimationClip // AnimationClip clip = controller.animationClips.FirstOrDefault(x => x.name == aniName); //获取动画cilp的时间 float time = clip.length; Debug.Log(time); StartTimeAction(time, () => { action.Invoke(); }); } } public void SetStudentAni(string aniName,float fadetime) { //播放动画 // studentAni.Play(aniName); studentAni.Play(aniName, -1, fadetime); Action action = aniAction.GetAction(aniName); if (action != null) { // 获取AnimatorController //var controller = studentAni.runtimeAnimatorController as AnimatorController; AnimationClip[] clips = studentAni.runtimeAnimatorController.animationClips; AnimationClip clip = null; for (int i = 0; i < clips.Length; i++) { if (clips[i].name == aniName) { clip = clips[i]; } } // 获取名为"Walk"的AnimationClip // AnimationClip clip = controller.animationClips.FirstOrDefault(x => x.name == aniName); //获取动画cilp的时间 float time = clip.length; Debug.Log(time); StartTimeAction(time-fadetime, () => { action.Invoke(); }); } } public void SetNpcAni(string AniName) { for (int i = 0; i < npcAni.Length; i++) { npcAni[i].Play(AniName); } Debug.Log("NPC动画"); } public void AddHisitoryInfo(string info) { for (int i = 0; i < historyInfoList.Count; i++) { if (historyInfoList[i].text == info) { return; } } GameObject go = GameObject.Instantiate(Resources.Load("Prefab/hisitoryText"), hisitoryInfoParent); Text txt = go.GetComponent(); int index = go.transform.GetSiblingIndex() + 1; txt.text = index + ". " + info; historyInfoList.Add(txt); for (int i = 0; i < historyInfoList.Count; i++) { historyInfoList[i].color = new Color(0.65f,0.65f,0.65f,1); } txt.color = new Color(255, 255, 255, 255); } public void PassOver() { AddTip("恭喜通关"); //向平台发送通关 EduCoderTool.WebConnecter.Singleton.SendResultToWeb(true); } public void LoadScene(string sceneName) { SceneManager.LoadScene(sceneName); } #endregion public void PlayAudio(AudioClip clip) { if (clip != null) { audioSource.clip = clip; audioSource.Play(); } } public void PlayLoopAudio(AudioClip clip) { if (clip != null) { audioSource.clip = clip; audioSource.loop = true; audioSource.Play(); } } public void StartTimeAction(float time, Action action) { StartCoroutine(TimeAction(time, action)); } IEnumerator TimeAction(float time, Action action) { yield return new WaitForSeconds(time); action.Invoke(); } }