Files
JJBB/Assets/Project/Script/SceneMovie/SceneMovieManager.cs

477 lines
15 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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<ObjManager>.Instance.MainPlayer != null)
Singleton<ObjManager>.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<SceneMovie>();
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<SceneMovie>();
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<MissionItemLogic>(
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<GameObject> 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<ObjManager>.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<MoviePosData> m_CheckPosMovies = new List<MoviePosData>();
private readonly List<KillMonsterData> m_CheckKillMonsterMovies = new List<KillMonsterData>();
private readonly List<MovieMissionData> m_MissionMovies = new List<MovieMissionData>();
#endregion
}