1124 lines
37 KiB
C#
1124 lines
37 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using Thousandto.Cfg.Data;
|
|||
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Code.Global;
|
|||
|
using Thousandto.Code.Logic.LocalPlayerBT;
|
|||
|
using Thousandto.Core.Asset;
|
|||
|
using Thousandto.Core.PostEffect;
|
|||
|
using UnityEngine;
|
|||
|
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
|
|||
|
|
|||
|
namespace Thousandto.Code.Logic
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 游戏场景管理系统
|
|||
|
/// </summary>
|
|||
|
public class GameSceneSystem
|
|||
|
{
|
|||
|
#region//私有变量
|
|||
|
private GameScene _preLoadScene = null;
|
|||
|
private GameScene _activedScene = null;
|
|||
|
private int _mapID = -1;
|
|||
|
private float _timeScaleCounter = 0f;
|
|||
|
private int _sceneEnterCount = 0;
|
|||
|
private LoadingArgs _lastRequestLoadingArgs = null;
|
|||
|
private LoadingArgs _currentRequestLoadingArgs = null;
|
|||
|
private bool _isLoading = false;
|
|||
|
private float _frontUpdateTime = 0f;
|
|||
|
private int _hideCameraCounter = 0; //摄像机隐藏计数器,大于0表示摄像机需要隐藏
|
|||
|
private int _showCameraCounter = 0; //摄像机显示计数器,大于0表示摄像机需要显示
|
|||
|
private bool _isFirstEnterMap = true; //是否是第一次进游戏场景
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//场景属性
|
|||
|
//当前激活的场景
|
|||
|
public GameScene ActivedScene
|
|||
|
{
|
|||
|
get { return _activedScene; }
|
|||
|
}
|
|||
|
public GameScene PreLoadScene
|
|||
|
{
|
|||
|
get { return _preLoadScene; }
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//当前被激活场景的公共接口
|
|||
|
|
|||
|
//初始化
|
|||
|
public void Initialize()
|
|||
|
{
|
|||
|
_hideCameraCounter = 0;
|
|||
|
_showCameraCounter = 0;
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_ADD_MAINCAMERA_HIDECOUNTER, OnAddCameraHideCounter);
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_DEC_MAINCAMERA_HIDECOUNTER, OnDecCameraHideCounter);
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_ADD_MAINCAMERA_SHOWCOUNTER, OnAddCameraShowCounter);
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_DEC_MAINCAMERA_SHOWCOUNTER, OnDecCameraShowCounter);
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_TIMELINEEVENT_START, OnTimelineStart);
|
|||
|
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_TIMELINEEVENT_END, OnTimelineEnd);
|
|||
|
}
|
|||
|
|
|||
|
//反初始化
|
|||
|
public void Uninitialize()
|
|||
|
{
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_ADD_MAINCAMERA_HIDECOUNTER, OnAddCameraHideCounter);
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_DEC_MAINCAMERA_HIDECOUNTER, OnDecCameraHideCounter);
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_ADD_MAINCAMERA_SHOWCOUNTER, OnAddCameraShowCounter);
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_DEC_MAINCAMERA_SHOWCOUNTER, OnDecCameraShowCounter);
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_TIMELINEEVENT_START, OnTimelineStart);
|
|||
|
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_TIMELINEEVENT_END, OnTimelineEnd);
|
|||
|
}
|
|||
|
|
|||
|
//开始播放Timeline
|
|||
|
private void OnTimelineStart(object obj, object sender)
|
|||
|
{
|
|||
|
//var localPlayer = GetLocalPlayer();
|
|||
|
//if(localPlayer != null)
|
|||
|
//{
|
|||
|
// localPlayer.Action_Timeline(AnimClipNameDefine.NormalIdle);
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
//Timeline结束
|
|||
|
private void OnTimelineEnd(object obj, object sender)
|
|||
|
{
|
|||
|
var localPlayer = GetLocalPlayer();
|
|||
|
if (localPlayer != null)
|
|||
|
{
|
|||
|
localPlayer.Action_Idle();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void OnAddCameraHideCounter(object o,object sender = null)
|
|||
|
{
|
|||
|
++_hideCameraCounter;
|
|||
|
CheckCameraVisible();
|
|||
|
}
|
|||
|
private void OnDecCameraHideCounter(object o,object sender = null)
|
|||
|
{
|
|||
|
--_hideCameraCounter;
|
|||
|
CheckCameraVisible();
|
|||
|
}
|
|||
|
private void OnAddCameraShowCounter(object o,object sender = null)
|
|||
|
{
|
|||
|
++_showCameraCounter;
|
|||
|
CheckCameraVisible();
|
|||
|
}
|
|||
|
private void OnDecCameraShowCounter(object o,object sender = null)
|
|||
|
{
|
|||
|
--_showCameraCounter;
|
|||
|
CheckCameraVisible();
|
|||
|
}
|
|||
|
private void CheckCameraVisible()
|
|||
|
{
|
|||
|
if (_activedScene == null || _activedScene.SceneCameraControl == null)
|
|||
|
return;
|
|||
|
|
|||
|
if (_showCameraCounter > 0)
|
|||
|
{
|
|||
|
_activedScene.SceneCameraControl.gameObject.SetActive(true);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_hideCameraCounter > 0)
|
|||
|
{
|
|||
|
_activedScene.SceneCameraControl.gameObject.SetActive(false);
|
|||
|
PostEffectManager.Instance.StopRadiaBlur(); //停止径向模糊
|
|||
|
PostEffectManager.Instance.StopAllCameraShake();//停止摄像机震动
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_activedScene.SceneCameraControl.gameObject.SetActive(true);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
public void SetPreLoadScene(GameScene scene)
|
|||
|
{
|
|||
|
_preLoadScene = scene;
|
|||
|
}
|
|||
|
public void ReSetPreLoadScene()
|
|||
|
{
|
|||
|
if (_preLoadScene != null)
|
|||
|
_preLoadScene = null;
|
|||
|
}
|
|||
|
//设置当前激活的场景
|
|||
|
public void SetActivedScene(GameScene activedScene)
|
|||
|
{
|
|||
|
ReSetPreLoadScene();
|
|||
|
_frontUpdateTime = Time.realtimeSinceStartup;
|
|||
|
_activedScene = activedScene;
|
|||
|
}
|
|||
|
//获取当前场景
|
|||
|
public GameScene GetActivedScene()
|
|||
|
{
|
|||
|
return _activedScene;
|
|||
|
}
|
|||
|
//获取当前的地图的数据
|
|||
|
public DeclareMapsetting GetActivedMapSetting()
|
|||
|
{
|
|||
|
return DeclareMapsetting.Get(_mapID);
|
|||
|
}
|
|||
|
//获取当前地图的ID
|
|||
|
public int GetActivedMapID()
|
|||
|
{
|
|||
|
return _mapID;
|
|||
|
}
|
|||
|
|
|||
|
//获取当前角色所在那个分线上
|
|||
|
public int GetLineID()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.LineID;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
//检查当前场景 -- 是否有效
|
|||
|
public bool CheckActivedScene()
|
|||
|
{
|
|||
|
return _activedScene != null;
|
|||
|
}
|
|||
|
|
|||
|
// 进入场景次数
|
|||
|
public int SceneEnterCount
|
|||
|
{
|
|||
|
get { return _sceneEnterCount; }
|
|||
|
set
|
|||
|
{
|
|||
|
_sceneEnterCount = value;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //关于场景的切换的处理,其中包括资源的清理等
|
|||
|
|
|||
|
//切换地图操作
|
|||
|
public void StartChangeToMap(int mapID, int lineID, Vector2? position = null, int transType = 0, int transParam = 0)
|
|||
|
{
|
|||
|
//Debug.LogError("mapID"+mapID);
|
|||
|
DeclareMapsetting mapInfo = DeclareMapsetting.Get(mapID);
|
|||
|
if (mapInfo != null)
|
|||
|
{
|
|||
|
var scene = GameCenter.GameSceneSystem.ActivedScene;
|
|||
|
//换线逻辑
|
|||
|
if (scene != null && scene.MapId == mapID)
|
|||
|
{
|
|||
|
scene.DoChangeLine(mapInfo, lineID, scene.LineID != lineID);
|
|||
|
//向服务器同步玩家坐标位置
|
|||
|
if (position != null)
|
|||
|
{
|
|||
|
var lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
Vector3 pos = scene.GetTerrainPosition(position.Value.x, position.Value.y);
|
|||
|
lp.SetPosition(pos);
|
|||
|
}
|
|||
|
GameCenter.TaskController.ResumeForTransPort();
|
|||
|
//}
|
|||
|
}
|
|||
|
//进入(离开)位面逻辑
|
|||
|
else if (scene != null && scene.MapId != mapID &&
|
|||
|
(string.Equals(scene.LevelName, mapInfo.LevelName) || string.Equals(scene.LevelName, mapInfo.LevelName2)))
|
|||
|
{
|
|||
|
if(mapInfo.Type == (int)MapTypeDef.PlanCopy || scene.Cfg.Type == (int)MapTypeDef.PlanCopy)
|
|||
|
{
|
|||
|
//是否是进出位面
|
|||
|
if(mapInfo.Type == (int)MapTypeDef.PlanCopy)
|
|||
|
{
|
|||
|
//进入位面
|
|||
|
GameCenter.TaskManager.EnterPlaneCopy();
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_ENTET_PLANECOPY);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//退出位面
|
|||
|
GameCenter.TaskManager.LeavePlaneCopy();
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_EXIT_PLANECOPY);
|
|||
|
}
|
|||
|
}
|
|||
|
if(position != null)
|
|||
|
{
|
|||
|
var lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if(lp != null && Vector2.SqrMagnitude(position.Value - lp.Position2d) <= 1f)
|
|||
|
{
|
|||
|
//误差1米内,使用当前位置
|
|||
|
position = lp.Position2d;
|
|||
|
}
|
|||
|
}
|
|||
|
var levelName = string.Empty;
|
|||
|
if(string.Equals(scene.LevelName, mapInfo.LevelName))
|
|||
|
{
|
|||
|
levelName = mapInfo.LevelName;
|
|||
|
}
|
|||
|
else if(string.Equals(scene.LevelName, mapInfo.LevelName2))
|
|||
|
{
|
|||
|
levelName = mapInfo.LevelName2;
|
|||
|
}
|
|||
|
scene.DoEnterPlaneCopy(mapID, scene.MapId, ref _mapID, scene.Name, levelName, mapInfo.CameraName, mapInfo.CameraNameNight, lineID, position);
|
|||
|
}
|
|||
|
else if (_mapID != mapID)
|
|||
|
{
|
|||
|
LoadingArgs args = new LoadingArgs();
|
|||
|
args.MapSetting = mapInfo;
|
|||
|
args.Position = position;
|
|||
|
args.LineID = lineID;
|
|||
|
args.transType = transType;
|
|||
|
args.transParam = transParam;
|
|||
|
if (scene != null)
|
|||
|
{
|
|||
|
args.FrontMapID = scene.MapId;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
args.FrontMapID = 0;
|
|||
|
}
|
|||
|
FLogger.Log("Request:" + args.MapSetting.LevelName);
|
|||
|
if (!_isLoading)
|
|||
|
{
|
|||
|
_isLoading = true;
|
|||
|
_currentRequestLoadingArgs = args;
|
|||
|
_lastRequestLoadingArgs = null;
|
|||
|
//GameCenter.GameCaseSystem.GetCurrentTickCase().ChangeToState(GameStateId.SceneLoading, args);
|
|||
|
GameCenter.GameStateSystem.ChangeState((int)GameStateId.SceneLoading, args);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//当正在切换场景时,接收到另外场景切换请求时的处理.
|
|||
|
if (_currentRequestLoadingArgs.MapSetting != args.MapSetting)
|
|||
|
{
|
|||
|
_lastRequestLoadingArgs = args;
|
|||
|
FLogger.LogError("CurrentState is Loading ,New Loading Request Save To _lastRequestLoadingArgs!" + args.MapSetting.LevelName);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
UnityEngine.Debug.LogError("切换场景失败,找不到地图,返回到登陆界面。 id = " + mapID);
|
|||
|
GameCenter.GameStateSystem.ChangeState((int)GameStateId.Login);
|
|||
|
}
|
|||
|
|
|||
|
_mapID = mapID;
|
|||
|
}
|
|||
|
|
|||
|
//清除MapID信息
|
|||
|
public void ClearMapID()
|
|||
|
{
|
|||
|
_mapID = -1;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 判断在进行Loading时,是否进行了其他的Loading请求
|
|||
|
/// 比如在切换场景时,多人副本被房主开启等.
|
|||
|
/// </summary>
|
|||
|
public bool CheckNewLoading()
|
|||
|
{
|
|||
|
_isLoading = false;
|
|||
|
if (_lastRequestLoadingArgs != null)
|
|||
|
{
|
|||
|
var arg = _lastRequestLoadingArgs;
|
|||
|
_lastRequestLoadingArgs = null;
|
|||
|
if (ActivedScene != null)
|
|||
|
{//当多次切换的时候,如果ActiveScene不为空,那么表示他的FrontMapID肯定不为空
|
|||
|
arg.FrontMapID = ActivedScene.MapId;
|
|||
|
}
|
|||
|
FLogger.LogError("CheckNewLoading is true!Find New Loading Request,Start New Loading Process!!", arg.MapSetting.LevelName);
|
|||
|
GameCenter.GameStateSystem.ChangeState((int)GameStateId.SceneLoading, arg);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//设置持续化信息
|
|||
|
public void SetImmortalInfo(bool isSetImmortal = true)
|
|||
|
{
|
|||
|
//1.清理场景的数据
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
if (isSetImmortal)
|
|||
|
{
|
|||
|
GameCenter.ImmortalResSystem.ClearImmortalAll();
|
|||
|
GameCenter.ImmortalResSystem.SetImmortalResouce();
|
|||
|
}
|
|||
|
_activedScene.Unload();
|
|||
|
_activedScene = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//清空Prefab型资源 -- 这个在加载场景之前处理
|
|||
|
public void SceneSweepPrefab()
|
|||
|
{
|
|||
|
//清理所有不用的PrefabPool对象 --- Prefab实例对象
|
|||
|
SpawnPoolManager.ShareInstance.TrimUnusedPools(true);
|
|||
|
//针对特效粒子进行缓存池复位
|
|||
|
//ParticleSystem.ResetPreMappedBufferMemory();
|
|||
|
}
|
|||
|
|
|||
|
//清空资源型资源 --- 这个在加载场景之后处理
|
|||
|
public void SceneSweepAsset()
|
|||
|
{
|
|||
|
//3.清除资源型对象
|
|||
|
GameCenter.AudioManager.Sweep();
|
|||
|
#if !UNITY_EDITOR
|
|||
|
GameCenter.AnimManager.Sweep();
|
|||
|
#endif
|
|||
|
GameCenter.TextureManager.Sweep();
|
|||
|
GameCenter.VideoManager.Sweep();
|
|||
|
//清理所有Prefab资源 -- 删除资源对象
|
|||
|
PrefabAssetManager.SharedInstance.Sweep();
|
|||
|
GameCenter.LuaSystem.Sweep();
|
|||
|
}
|
|||
|
|
|||
|
public void ReturnToLogin(bool isSwitchAccount = false,bool isToSelectPlayer = false)
|
|||
|
{
|
|||
|
//这里把场景正在加载中的数据进行复位
|
|||
|
_isLoading = false;
|
|||
|
GameCenter.ChatSystem.ForceCacheLocalLeavelMsg();
|
|||
|
GameCenter.ItemContianerSystem.Uninitialize();
|
|||
|
PlayerBT.ChangeState(PlayerBDState.Default);
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_CLOSEREMAINTIME_EQUIP);
|
|||
|
int i = 0;
|
|||
|
i += (isSwitchAccount ? 1 : 0);
|
|||
|
i += (isToSelectPlayer ? 2 : 0);
|
|||
|
GameCenter.GameStateSystem.ChangeState((int)GameStateId.RetToLogin, i);
|
|||
|
_isFirstEnterMap = true;
|
|||
|
}
|
|||
|
|
|||
|
public void ReturnToUpdate()
|
|||
|
{
|
|||
|
//这里把场景正在加载中的数据进行复位
|
|||
|
_isLoading = false;
|
|||
|
GameCenter.ItemContianerSystem.Uninitialize();
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_CLOSEREMAINTIME_EQUIP);
|
|||
|
GameCenter.GameStateSystem.ChangeState((int)GameStateId.RetToUpdate);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//场景中对象实体的操作,查询获取,移除,刷新
|
|||
|
//获取当前角色
|
|||
|
public LocalPlayer GetLocalPlayer()
|
|||
|
{
|
|||
|
return LocalPlayerRoot.LocalPlayer;
|
|||
|
}
|
|||
|
|
|||
|
//获取当前角色等级
|
|||
|
public int GetLocalPlayerLevel()
|
|||
|
{
|
|||
|
if(LocalPlayerRoot.LocalPlayer != null)
|
|||
|
{
|
|||
|
return LocalPlayerRoot.LocalPlayer.Level;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
//获取角色ID
|
|||
|
public ulong GetLocalPlayerID()
|
|||
|
{
|
|||
|
return LocalPlayerRoot.LocalPlayerID;
|
|||
|
}
|
|||
|
//获取主角飞剑
|
|||
|
public LocalFlySword GetLocalFlySword()
|
|||
|
{
|
|||
|
var lp = GetLocalPlayer();
|
|||
|
if (lp != null && _activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<LocalFlySword>(lp.PropMoudle.FlySwordUID);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//获取主角宠物
|
|||
|
public LocalPet GetLocalPet()
|
|||
|
{
|
|||
|
var petList = _activedScene.FindAll<LocalPet>();
|
|||
|
if (petList != null && petList.Count > 0)
|
|||
|
{
|
|||
|
return petList[0];
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//获取当前角色战斗力
|
|||
|
public long GetLocalPlayerFightPower()
|
|||
|
{
|
|||
|
if (LocalPlayerRoot.LocalPlayer != null)
|
|||
|
{
|
|||
|
return LocalPlayerRoot.LocalPlayer.FightPower;
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
//查询场景中的实体
|
|||
|
public T FindEntity<T>(UInt64 code) where T : Entity
|
|||
|
{
|
|||
|
if (LocalPlayerRoot.LocalPlayer != null && LocalPlayerRoot.LocalPlayer.ID == code)
|
|||
|
{
|
|||
|
return LocalPlayerRoot.LocalPlayer as T;
|
|||
|
}
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<T>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查询NPC
|
|||
|
public Npc FindNpc(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<Npc>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查询怪物
|
|||
|
public Monster FindMonster(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<Monster>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查询宠物
|
|||
|
public Pet FindPet(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<Pet>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查询玩家
|
|||
|
public Player FindPlayer(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<Player>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查找采集物
|
|||
|
public Collection FindCollect(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<Collection>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查找其他玩家
|
|||
|
public List<RemotePlayer> FindRemotePlayers()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.FindAll<RemotePlayer>();
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查询一个指定玩家
|
|||
|
public RemotePlayer FindRemotePlayer(UInt64 code)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Find<RemotePlayer>(code);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//查找NPC列表
|
|||
|
public List<Npc> FindNpcs()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.FindAll<Npc>();
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查找怪物列表
|
|||
|
public List<Monster> FindMonsters()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.FindAll<Monster>();
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//查找采集物列表
|
|||
|
public List<Collection> FindCollects()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.FindAll<Collection>();
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//在场景查找所有的实体列表
|
|||
|
public List<T> FindEntityAll<T>() where T : Entity
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.FindAll<T>();
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//获取某个实体的数量
|
|||
|
public int GetEntityCount<T>() where T : Entity
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.GetCount<T>();
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
//获取场景实体的容器
|
|||
|
public EntityContainer GetEntityContainer()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
return _activedScene.Entities;
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//根据id列表从场景中,移除多个实体
|
|||
|
public void RemoveRemoteEntities(List<ulong> idList)
|
|||
|
{
|
|||
|
if (_activedScene != null && _activedScene.Entities != null && idList != null)
|
|||
|
{
|
|||
|
//删除
|
|||
|
for (int i = 0; i < idList.Count; ++i)
|
|||
|
{
|
|||
|
var e = _activedScene.Entities.Find(idList[i]);
|
|||
|
Character c = e as Character;
|
|||
|
if (c == null || !c.IsLocalPlayer())
|
|||
|
{
|
|||
|
_activedScene.Entities.Remove(idList[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//根据id从场景中,移除一个实体
|
|||
|
public void RemoveRemoteEntity(ulong id)
|
|||
|
{
|
|||
|
if (_activedScene != null && _activedScene.Entities != null)
|
|||
|
{
|
|||
|
var e = _activedScene.Entities.Find(id);
|
|||
|
Character c = e as Character;
|
|||
|
if (c == null || !c.IsLocalPlayer())
|
|||
|
{
|
|||
|
_activedScene.Entities.Remove(id);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新本地玩家的战斗属性
|
|||
|
public void RefreshLocalPlayerBattleAttribute(MSG_Player.ResPlayerOnLineAttribute result)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var lp = _activedScene.GetLocalPlayer();
|
|||
|
if (lp != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < result.attributeList.Count; ++i)
|
|||
|
{
|
|||
|
var prop = result.attributeList[i];
|
|||
|
lp.PropMoudle.SetBattleProp((AllBattleProp)prop.type, (int)prop.value, false);
|
|||
|
}
|
|||
|
lp.PropMoudle.SetBattleProp(AllBattleProp.MaxHP, (long)result.maxHp, false);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//刷新本地玩家的战斗属性
|
|||
|
public void RefreshLocalPlayerBattleAttribute(List<MSG_Player.Attribute> attrList)
|
|||
|
{
|
|||
|
if (_activedScene != null && attrList != null && attrList.Count > 0)
|
|||
|
{
|
|||
|
var lp = _activedScene.GetLocalPlayer();
|
|||
|
if (lp != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < attrList.Count; ++i)
|
|||
|
{
|
|||
|
var prop = attrList[i];
|
|||
|
lp.PropMoudle.SetBattleProp((AllBattleProp)prop.type, (int)prop.value);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新本地玩家信息 -- 返回本地新的本地玩家
|
|||
|
public LocalPlayer RefreshLocalPlayer(LocalPlayerInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var lp = _activedScene.GetLocalPlayer();
|
|||
|
if (_activedScene.LoadLocalPlayer(info))
|
|||
|
{
|
|||
|
lp = _activedScene.GetLocalPlayer();
|
|||
|
//GameCenter.CameraControlUtil.FollowToCharacter(lp);
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_LOCAL_PLAYER_REFRESH, lp);
|
|||
|
|
|||
|
}
|
|||
|
if( !GameExtentScript._showPlayerModel )
|
|||
|
{
|
|||
|
GameExtentScript.SetModelActive( lp.ModelTransform, false );
|
|||
|
}
|
|||
|
return lp;
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
//刷新远程玩家信息 -- 如果没有的话,就创建一个
|
|||
|
public void RefreshRemotePlayer(RemotePlayerInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<RemotePlayer>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
var result = _activedScene.LoadRemotePlayer(info);
|
|||
|
if( result && !GameExtentScript._showPlayerModel )
|
|||
|
{
|
|||
|
var root = _activedScene.Find<RemotePlayer>( info.ID ).ModelTransform;
|
|||
|
GameExtentScript.SetModelActive( root, false );
|
|||
|
}
|
|||
|
}
|
|||
|
else if (!entity.IsLocalPlayer())
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新NPC玩家信息 -- 如果没有的话,就创建一个
|
|||
|
public void RefreshNpc( NpcInitInfo info )
|
|||
|
{
|
|||
|
if( _activedScene != null )
|
|||
|
{
|
|||
|
if( info.Cfg == null )
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<Npc>( info.ID );
|
|||
|
if( entity == null )
|
|||
|
{
|
|||
|
var result = _activedScene.LoadNpc( info );
|
|||
|
if( result && !GameExtentScript._showNpcModel )
|
|||
|
{
|
|||
|
var root = _activedScene.Find<Npc>( info.ID ).ModelTransform;
|
|||
|
GameExtentScript.SetModelActive( root, false );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo( info );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新怪物信息 -- 如果没有的话,就创建一个
|
|||
|
public void RefreshMonster(MonsterInitInfo info, bool checkBorn = true)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
if (info.Cfg == null)
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<Monster>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
|
|||
|
var result = _activedScene.LoadMonster( info );
|
|||
|
if( result && !GameExtentScript._showMonsterModel )
|
|||
|
{
|
|||
|
var root = _activedScene.Find<Monster>( info.ID ).ModelTransform;
|
|||
|
GameExtentScript.SetModelActive( root, false );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//public void RefreshBrokenObj(BrokenObjInitInfo info, bool checkBorn = true)
|
|||
|
//{
|
|||
|
// if (_activedScene != null)
|
|||
|
// {
|
|||
|
// if (info.Cfg == null)
|
|||
|
// return;
|
|||
|
|
|||
|
// FProfiler.Begin("GameSceneSystem.RefreshBrokenObj");
|
|||
|
// var entity = _activedScene.Find<BrokenObj>(info.ID);
|
|||
|
// if (entity == null)
|
|||
|
// {
|
|||
|
// //_activedScene.LoadBrokenObj(info);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// entity.SyncInfo(info);
|
|||
|
// }
|
|||
|
// FProfiler.End();
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//刷新宠物信息 -- 如果没有的话,就创建一个
|
|||
|
public void RefreshPet(PetInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
if (info.Cfg == null)
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<Pet>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
var result = _activedScene.LoadPet(info);
|
|||
|
if(result && !GameExtentScript._showPlayerModel )
|
|||
|
{
|
|||
|
var root = _activedScene.Find<Pet>( info.ID );
|
|||
|
GameExtentScript.SetModelActive( root.ModelTransform, false );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新助战宠物
|
|||
|
public void RefreshAssistPet(AssistPetInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
if (info.Cfg == null)
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<AssistPet>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadAssistPet(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void RefreshFlySword(FlySwordInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null && info.ID > 0)
|
|||
|
{
|
|||
|
if (info.Cfg == null)
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<FlySword>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
var result = _activedScene.LoadFlySword(info);
|
|||
|
if (result && !GameExtentScript._showPlayerModel)
|
|||
|
{
|
|||
|
var root = _activedScene.Find<FlySword>(info.ID);
|
|||
|
GameExtentScript.SetModelActive(root.ModelTransform, false);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
public void RefreshMarryChild(MarryChildInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null && info.ID > 0)
|
|||
|
{
|
|||
|
if (info.Cfg == null)
|
|||
|
return;
|
|||
|
|
|||
|
var entity = _activedScene.Find<MarryChild>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
var result = _activedScene.LoadMarryChild(info);
|
|||
|
if (result && !GameExtentScript._showPlayerModel)
|
|||
|
{
|
|||
|
var root = _activedScene.Find<MarryChild>(info.ID);
|
|||
|
GameExtentScript.SetModelActive(root.ModelTransform, false);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新锁定弹道对象
|
|||
|
public void RefreshLockTrajectoryObj(LockTrajectoryObjInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<LockTrajectoryObj>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadLockTrajectoryObj(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//刷新简单技能召唤物信息
|
|||
|
public void RefreshSimpleSkillObject(SimpleSkillObjectInitInfo info)
|
|||
|
{
|
|||
|
if(_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<SimpleSkillObject>(info.ID);
|
|||
|
if(entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadSimpleSkillObject(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新技能对象信息
|
|||
|
public void RefreshSkillObject(SkillObjectInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<SkillObject>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadSkillObject(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//刷新采集物信息 -- 如果没有的话,就创建一个
|
|||
|
public void RefreshCollection(CollectionInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<Collection>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadCollection(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新掉落物品信息
|
|||
|
public void RefreshDropItem(DropItemInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<DropItem>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadDropItem(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新掉落金币信息
|
|||
|
public void RefreshDropGold(DropGoldInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<DropGold>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadDropGold(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新地面buff
|
|||
|
public void RefreshGroundBuff(GroundBuffInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null && info.Cfg != null)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<GroundBuff>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadGroundBuff(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//刷新lua角色
|
|||
|
public void RefreshLuaCharacter(LuaCharInitInfo info)
|
|||
|
{
|
|||
|
if (_activedScene != null && info.ID > 0)
|
|||
|
{
|
|||
|
var entity = _activedScene.Find<LuaCharacter>(info.ID);
|
|||
|
if (entity == null)
|
|||
|
{
|
|||
|
_activedScene.LoadLuaCharacter(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
entity.SyncInfo(info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//场景心跳处理
|
|||
|
//场景的心跳处理
|
|||
|
public void Update(float deltaTime)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
_activedScene.Update(deltaTime);
|
|||
|
}
|
|||
|
|
|||
|
if (_timeScaleCounter > 0f)
|
|||
|
{
|
|||
|
float dt = Time.realtimeSinceStartup - _frontUpdateTime;
|
|||
|
_frontUpdateTime = Time.realtimeSinceStartup;
|
|||
|
_timeScaleCounter -= dt;
|
|||
|
if (_timeScaleCounter <= 0f)
|
|||
|
{
|
|||
|
Time.timeScale = 1f;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//场景的一些其他物件的操作,例如:摄像机...
|
|||
|
|
|||
|
//时间缩放效果,最多放大两倍
|
|||
|
public void DoTimeScale(float scale, float scaleTime)
|
|||
|
{
|
|||
|
if (scale <= 0f || scale >= 2f || scaleTime <= 0f)
|
|||
|
return;
|
|||
|
|
|||
|
_timeScaleCounter = scaleTime;
|
|||
|
Time.timeScale = scale;
|
|||
|
_frontUpdateTime = Time.realtimeSinceStartup;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//发送场景的的网络消息,包括:换线,等
|
|||
|
//发送换线消息
|
|||
|
public void SendSwitchLineMsg(int lineID)
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
if (_activedScene.LineID != lineID)
|
|||
|
{
|
|||
|
MSG_Map.ReqSelectLine msg = new MSG_Map.ReqSelectLine();
|
|||
|
msg.line = lineID;
|
|||
|
msg.Send();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//发送请求线路信息消息
|
|||
|
public void SendGetLineInfoMsg()
|
|||
|
{
|
|||
|
if (_activedScene != null)
|
|||
|
{
|
|||
|
MSG_Map.ReqGetLines msg = new MSG_Map.ReqGetLines();
|
|||
|
msg.Send();
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//开启和关闭背景音乐
|
|||
|
//背景音乐
|
|||
|
public void PlayBGMusic(int mapID = -1)
|
|||
|
{
|
|||
|
if (mapID < 0) mapID = _mapID;
|
|||
|
var map = DeclareMapsetting.Get(mapID);
|
|||
|
if (map != null)
|
|||
|
{
|
|||
|
AudioPlayer.PlayMusic(map.Music);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
//停止背景音乐
|
|||
|
public void StopBGMusic(bool isStopNow = false)
|
|||
|
{
|
|||
|
AudioPlayer.Stop(AudioTypeCode.Music, isStopNow);
|
|||
|
}
|
|||
|
|
|||
|
//第一次进游戏场景
|
|||
|
public void OnFirstEnterMap()
|
|||
|
{
|
|||
|
if (_isFirstEnterMap)
|
|||
|
{
|
|||
|
_isFirstEnterMap = false;
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_FIRSTENTERMAP);
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//信息
|
|||
|
public string Infomation()
|
|||
|
{
|
|||
|
var sb = new StringBuilder();
|
|||
|
sb.AppendFormat("SceneEntities:{0}", _activedScene.Entities.GetCount<Entity>());
|
|||
|
sb.AppendLine();
|
|||
|
sb.AppendFormat("RemoterPlayer:{0}", _activedScene.Entities.GetCount<RemotePlayer>());
|
|||
|
sb.AppendLine();
|
|||
|
sb.AppendFormat("Monster:{0}", _activedScene.Entities.GetCount<Monster>());
|
|||
|
sb.AppendLine();
|
|||
|
sb.AppendFormat("NPC:{0}", _activedScene.Entities.GetCount<Npc>());
|
|||
|
sb.AppendLine();
|
|||
|
sb.AppendFormat("Collection:{0}", _activedScene.Entities.GetCount<Collection>());
|
|||
|
sb.AppendLine();
|
|||
|
sb.AppendFormat("VFX:{0}", -999999/*GameCenter.VFXManager.ActiveCount*/);
|
|||
|
sb.AppendLine();
|
|||
|
return sb.ToString();
|
|||
|
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|