477 lines
15 KiB
C#
477 lines
15 KiB
C#
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
|
|
} |