using System.Collections; using System.Collections.Generic; using Games.LogicObj; using Games.Mission; using Games.Scene; using GCGame.Table; using UnityEngine; public delegate int SceneMovieOverEvent(); public class SceneMovieManager { public enum TriggerType { MissionFinish, MissionAccept, MissionComplate, MissionFail, EnterFuben, MoveToPos, KillMonster } private GameObject _MovieGameObject; public bool _PlayingMovie = false; private bool _playonOverLoad = true; private int _SceneMovieId; private float _waitSceneMovieTime; public int MissionID = -1; public bool StartMovie; public void MissionStateChange(int missionID, int missionState) { for (var i = 0; i < m_CheckPosMovies.Count; i++) m_CheckPosMovies[i].OnAddMission(missionID, missionState); for (var i = 0; i < m_MissionMovies.Count; i++) if (m_MissionMovies[i].MissionStateChange(missionID, missionState)) { m_MissionMovies.RemoveAt(i); return; } } public int PlayMessageTip() { var fuben = TableManager.GetFubenByID(GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterCopySceneID, 0); if (fuben != null) if (fuben.MessageTip != -1) PlayHelpMessageRoot.ShowHelpMessage(fuben.MessageTip, true); return 1; } public void LoadSceneOver() { m_CheckKillMonsterMovies.Clear(); m_CheckPosMovies.Clear(); var sceneMovies = TableManager.GetSceneMovie(); foreach (var sceneMove in sceneMovies.Values) { if (sceneMove.TriggerType == (int) TriggerType.MoveToPos) { if (sceneMove.GetTriggerParambyIndex(1) != GameManager.gameManager.RunningScene) continue; var moviePosData = new MoviePosData(); moviePosData.Init(sceneMove); m_CheckPosMovies.Add(moviePosData); } if (sceneMove.TriggerType == (int) TriggerType.KillMonster) { if (sceneMove.GetTriggerParambyIndex(1) != GameManager.gameManager.RunningScene) continue; var killMonsterData = new KillMonsterData(); killMonsterData.Init(sceneMove); m_CheckKillMonsterMovies.Add(killMonsterData); } } } public bool CheckPlaySceneMovie(bool playonOverLoad = true, float waitTime = 5) { if (_PlayingMovie || _MovieGameObject != null) return false; if (_waitSceneMovieTime > 0 && Time.realtimeSinceStartup - _waitSceneMovieTime < waitTime) return true; if (_waitSceneMovieTime > 0 && Time.realtimeSinceStartup - _waitSceneMovieTime > waitTime) { ClearUp(); return false; } if (StartMovie) return true; if (GameManager.gameManager.PlayerDataPool.EnterSceneCache.BeforeEnterCopySceneID == 0) return false; var fuben = TableManager.GetFubenByID(GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterCopySceneID, 0); if (fuben != null) { var sceneMovie = TableManager.GetSceneMovieByID(fuben.SceneMovieID, 0); if (sceneMovie != null) { _waitSceneMovieTime = Time.realtimeSinceStartup; _playonOverLoad = playonOverLoad; PlaySceneMovie(fuben.SceneMovieID); if (fuben.MessageTip != -1) Instance.MovieOverEvent += PlayMessageTip; return true; } if (fuben.MessageTip != -1) PlayHelpMessageRoot.ShowHelpMessage(fuben.MessageTip, true); } _waitSceneMovieTime = 0; return false; } public event SceneMovieOverEvent MovieOverEvent; public void PlaySceneMovie(int id) { if (_PlayingMovie) return; var tableMovie = TableManager.GetSceneMovieByID(id, 0); if (tableMovie == null) { if (StartMovie == false) ClearUp(); return; } var profession = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession; if (Singleton.Instance.MainPlayer != null) Singleton.Instance.MainPlayer.StopMove(); GameManager.gameManager.AutoSearch.Stop(); StartMovie = true; _SceneMovieId = id; if (GameManager.gameManager.ActiveScene.IsCopyScene()) { var req = new ReqPauseCopy(); req.nilparam = 1; req.SendMsg(); } LoadAsset(tableMovie.GetResPathbyIndex(profession), LoadMovieFinish); } public void PlaySceneMovie() { if (_MovieGameObject == null) { if (StartMovie) ClearUp(); return; } _MovieGameObject.SetActive(true); var sceneMovie = _MovieGameObject.GetComponent(); if (sceneMovie != null) sceneMovie.InitMove(); _MovieGameObject = null; } public void LoadMovieFinish(string assetName, Object resObj, Hashtable hashParam) { if (resObj == null || StartMovie == false) { ClearUp(); return; } var instanceObj = (GameObject) Object.Instantiate(resObj); if (_playonOverLoad == false) { _MovieGameObject = instanceObj; _MovieGameObject.SetActive(false); return; } var sceneMovie = instanceObj.GetComponent(); if (sceneMovie != null) sceneMovie.InitMove(); } public void ClearUp() { MissionID = -1; _waitSceneMovieTime = 0; _MovieGameObject = null; _playonOverLoad = true; var result = 0; if (MovieOverEvent != null) { result = MovieOverEvent.Invoke(); MovieOverEvent = null; } if (result == 0) { var req = new ReqResumeCopy(); req.nilparam = 1; req.SendMsg(); } StartMovie = false; _SceneMovieId = -1; ReleaseAsset(); } public void PlayMovieOver(SceneMovie sceneMovie) { if (sceneMovie != null) { sceneMovie.gameObject.SetActive(false); Object.Destroy(sceneMovie.gameObject); } ReleaseAsset(); if (MissionID != -1 && MissionDialogAndLeftTabsLogic.Instance() && GameManager.gameManager.ActiveScene.IsCopyScene() == false) MissionDialogAndLeftTabsLogic.Instance()._MissionContainer.ForeachActiveItem( missionItem => { var missionBase = TableManager.GetMissionBaseByID(missionItem.MissionID, 0); if (missionBase == null || MissionID != missionItem.MissionID) return; if (missionBase.MissionType == (int) MISSIONTYPE.MISSION_MAIN) missionItem.OnItemClick(); }); if (_SceneMovieId != -1) { var tableMovie = TableManager.GetSceneMovieByID(_SceneMovieId, 0); if (tableMovie != null && tableMovie.FindMissionId != -1) GameManager.gameManager.MissionManager.MissionPathFinder(tableMovie.FindMissionId); } ClearUp(); } #region //走到定点 private class MoviePosData { private bool hasMission; //是否满足检查条件 private bool isInit; private int missionID; private int movieID; private Vector3 Pos; public void Init(Tab_SceneMovie sceneMovieTab) { missionID = sceneMovieTab.GetTriggerParambyIndex(0); var missionState = GameManager.gameManager.MissionManager.GetMissionState(missionID); hasMission = missionState == (int) MissionState.Mission_Accepted; isInit = false; movieID = sceneMovieTab.Id; Pos = Vector3.zero; // LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_MODEL, // sceneMovieTab.GetResPathbyIndex(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession), // null, null); } public void OnAddMission(int missionid, int missionState) { if (missionID == missionid) hasMission = missionState == (int) MissionState.Mission_Accepted; } public bool Update(Obj_MainPlayer mainplayer) { if (hasMission) { if (isInit == false) { var movieTab = TableManager.GetSceneMovieByID(movieID, 0); if (movieTab != null) { var pos = Vector3.zero; pos.x = movieTab.GetTriggerParambyIndex(2); pos.z = movieTab.GetTriggerParambyIndex(3); if (ActiveScene.GetTerrainPosition(ref pos)) Pos = pos; } isInit = true; } if (Pos != Vector3.zero) { var distance = Vector3.Distance(mainplayer.Position, Pos); if (distance < 2f) { mainplayer.StopMove(); GameManager.gameManager.AutoSearch.Stop(); Instance.PlaySceneMovie(movieID); return true; } } } return false; } } #endregion #region // 杀怪动画 private class KillMonsterData { private int KillCount; private int movieID; private int NeedKills; private int RoleBaseID; public void Init(Tab_SceneMovie sceneMovieTab) { movieID = sceneMovieTab.Id; RoleBaseID = sceneMovieTab.GetTriggerParambyIndex(0); NeedKills = sceneMovieTab.GetTriggerParambyIndex(2); KillCount = 0; // LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_MODEL, // sceneMovieTab.GetResPathbyIndex(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession), // null, null); } public bool OnKillMonster(int roleID) { if (RoleBaseID == roleID) { KillCount++; if (KillCount >= NeedKills) { Instance.PlaySceneMovie(movieID); return true; } } return false; } } #endregion #region //任务相关的动画 private class MovieMissionData { private int missionID; private int movieID; private MissionState state; public void Init(Tab_SceneMovie sceneMovieTab) { missionID = sceneMovieTab.GetTriggerParambyIndex(0); movieID = sceneMovieTab.Id; switch (sceneMovieTab.TriggerType) { case 1: state = MissionState.Mission_Accepted; break; case 2: state = MissionState.Mission_Completed; break; case 3: state = MissionState.Mission_Failed; break; } } public bool MissionStateChange(int mission, int missionState) { if (missionID == mission && missionState == (byte) state) { Instance.PlaySceneMovie(movieID); return true; } return false; } } #endregion #region 电影资源管理 public string currentAsset; private void ReleaseAsset() { if (!string.IsNullOrEmpty(currentAsset)) { LoadAssetBundle.Instance.UnloadAssetWithPathFix(LoadAssetBundle.BUNDLE_PATH_MODEL, currentAsset); currentAsset = string.Empty; } } private void LoadAsset(string assetName, LoadBundleAssetCallback callback) { if (currentAsset != assetName) { ReleaseAsset(); currentAsset = assetName; } LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_MODEL, currentAsset, callback, null, true); } #endregion #region instance private static SceneMovieManager _Instance; public static SceneMovieManager Instance { get { if (_Instance == null) _Instance = new SceneMovieManager(); return _Instance; } } public SceneMovieManager() { if (m_MissionMovies.Count <= 0) { var sceneMovies = TableManager.GetSceneMovie(); foreach (var sceneMove in sceneMovies.Values) if (sceneMove.TriggerType <= (int) TriggerType.MissionFail) { var missionMovie = new MovieMissionData(); missionMovie.Init(sceneMove); m_MissionMovies.Add(missionMovie); } } } public void OnKillMonster(int roleBase) { for (var i = 0; i < m_CheckKillMonsterMovies.Count; i++) if (m_CheckKillMonsterMovies[i].OnKillMonster(roleBase)) { m_CheckKillMonsterMovies.RemoveAt(i); return; } } public void OnAddMission(int missionID, int mission) { var missionState = GameManager.gameManager.MissionManager.GetMissionState(missionID); for (var i = 0; i < m_CheckPosMovies.Count; i++) m_CheckPosMovies[i].OnAddMission(missionID, missionState); } private int frameSpace; public void Update() { if (frameSpace > 0) { frameSpace--; return; } frameSpace = 15; var mainplayer = Singleton.Instance.MainPlayer; if (mainplayer == null) return; if (_PlayingMovie) return; for (var i = 0; i < m_CheckPosMovies.Count; i++) if (m_CheckPosMovies[i].Update(mainplayer)) { m_CheckPosMovies.RemoveAt(i); return; } } private readonly List m_CheckPosMovies = new List(); private readonly List m_CheckKillMonsterMovies = new List(); private readonly List m_MissionMovies = new List(); #endregion }