869 lines
25 KiB
C#
869 lines
25 KiB
C#
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
using System.Text;
|
|||
|
using System.IO;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
|
|||
|
using Thousandto.Core.Base;
|
|||
|
|
|||
|
using MsgTime = System.Single;
|
|||
|
using Thousandto.Core.RootSystem;
|
|||
|
using Thousandto.Core.Framework;
|
|||
|
using Thousandto.Core.Asset;
|
|||
|
|
|||
|
using Thousandto.Cfg.Data;
|
|||
|
using Thousandto.Core.Support;
|
|||
|
|
|||
|
using Thousandto.Plugins.PathGrid;
|
|||
|
using PathEditor.Proxy.Plugin;
|
|||
|
using SceneEditor.Proxy.Plugin;
|
|||
|
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
|
|||
|
|
|||
|
#pragma warning disable 0219
|
|||
|
#pragma warning disable 0168
|
|||
|
#pragma warning disable 0162
|
|||
|
namespace Thousandto.Plugins.Common.UniScene
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 基础场景
|
|||
|
/// </summary>
|
|||
|
public partial class BaseScene : IScene
|
|||
|
{
|
|||
|
|
|||
|
#region constants --常量定义
|
|||
|
public const string CameraBounderRootName = "[CameraBounder]";
|
|||
|
public const string SpawnPointRootName = "[SpawnPoint]";
|
|||
|
public const string MonsterStubRootName = "[MonsterStub]";
|
|||
|
public const string WayPointRootName = "[WayPoint]";
|
|||
|
public const string DynamicBlockerRootName = "[DynamicBlocker]";
|
|||
|
public const string TriggerRootName = "[Trigger]";
|
|||
|
public const string CollectionRootName = "[Collection]";
|
|||
|
public const string CameraRootName = "[SceneCameraRoot]";
|
|||
|
public const string CameraName = "[SceneCamera]";
|
|||
|
private const string SceneRootName = "[SceneRoot]";
|
|||
|
private const string SceneObjectsName = "[SceneObjects]";
|
|||
|
#endregion
|
|||
|
|
|||
|
#region members --成员变量
|
|||
|
protected Transform _root = null;
|
|||
|
protected Transform _sceneObjectsRoot = null;
|
|||
|
protected Transform _wayPointRoot = null;
|
|||
|
protected Transform _dynamicBlockerRoot = null;
|
|||
|
protected Transform _triggerRoot = null;
|
|||
|
protected Messenger _msger = Messenger.SharedInstance;
|
|||
|
|
|||
|
private CameraManager _cameraManager = null;
|
|||
|
private EntityContainer _entityContainer = null;
|
|||
|
private PathGridSystem _navigator = null;
|
|||
|
private int _id = -1;
|
|||
|
private DeclareMapsetting _cfg = null;
|
|||
|
private string _name = string.Empty;
|
|||
|
private string _levelName = string.Empty;
|
|||
|
private string _pathFileName = string.Empty;
|
|||
|
private string _mapInfoFileName = string.Empty;
|
|||
|
private string _dayCameraName = string.Empty;
|
|||
|
private string _nightCameraName = string.Empty;
|
|||
|
private SceneParams _scenesParams = null;
|
|||
|
private float _minMountFlyHeight = 0f;
|
|||
|
private float _maxMountFlyHeight = 0f;
|
|||
|
protected Vector3 _shadowLightDir = Vector3.down;
|
|||
|
protected float _shadowDayStrength = 0.7f;
|
|||
|
protected float _shadowNightStrength = 0.3f;
|
|||
|
protected bool _sceneShadowOpen = false;
|
|||
|
protected Vector3 _sceneShadowLightDir = Vector3.down;
|
|||
|
protected float _sceneShadowDayStrength = 0.7f;
|
|||
|
protected float _sceneShadowNightStrength = 0.3f;
|
|||
|
protected bool _haveFogSetting = false;
|
|||
|
protected Color _fogDayColor = Color.white;
|
|||
|
protected float _fogDayMinDis = 20f;
|
|||
|
protected float _fogDayMaxDis = 200f;
|
|||
|
protected Color _fogNightColor = Color.white;
|
|||
|
protected float _fogNightMinDis = 20f;
|
|||
|
protected float _fogNightMaxDis = 200f;
|
|||
|
|
|||
|
|
|||
|
//删除列表,在每次update的时候进行删除
|
|||
|
protected List<ulong> _deleteEnityList = new List<ulong>(256);
|
|||
|
#endregion
|
|||
|
|
|||
|
#region accessor -- 属性信息
|
|||
|
public int MapId
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _id;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public DeclareMapsetting Cfg
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _cfg;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// NOTE: the name of map is not unique!!!
|
|||
|
public string Name
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _name;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string LevelName
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _levelName;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Transform SceneObjectsRoot
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _sceneObjectsRoot;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Messenger Msger
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _msger;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string DayCameraName
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _dayCameraName;
|
|||
|
}
|
|||
|
}
|
|||
|
public string NightCameraName
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _nightCameraName;
|
|||
|
}
|
|||
|
}
|
|||
|
public Camera SceneCamera
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _cameraManager != null ? _cameraManager.CurCamera : null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public CameraControl SceneCameraControl
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _cameraManager != null ? _cameraManager.SceneCameraControl : null;
|
|||
|
}
|
|||
|
}
|
|||
|
public CameraManager CameraManager
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _cameraManager;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public EntityContainer Entities
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _entityContainer;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public PathGridSystem navigator
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _navigator;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Transform DynamicBlockerRoot
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _dynamicBlockerRoot;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Transform TriggerRoot
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _triggerRoot;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public float MinMountFlyHeight
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _minMountFlyHeight;
|
|||
|
}
|
|||
|
}
|
|||
|
public float MaxMountFlyHeight
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _maxMountFlyHeight;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Vector3 ShadowLightDir
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _shadowLightDir;
|
|||
|
}
|
|||
|
}
|
|||
|
public float ShadowDayStrength
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _shadowDayStrength;
|
|||
|
}
|
|||
|
}
|
|||
|
public float ShadowNightStrength
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _shadowNightStrength;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool SceneShadowOpen
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _sceneShadowOpen;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Vector3 SceneShadowLightDir
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _sceneShadowLightDir;
|
|||
|
}
|
|||
|
}
|
|||
|
public float SceneShadowDayStrength
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _sceneShadowDayStrength;
|
|||
|
}
|
|||
|
}
|
|||
|
public float SceneShadowNightStrength
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _sceneShadowNightStrength;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//public bool HaveFogSetting
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// return _haveFogSetting;
|
|||
|
// }
|
|||
|
//}
|
|||
|
public Color FogDayColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogDayColor;
|
|||
|
}
|
|||
|
}
|
|||
|
public float FogDayMinDis
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogDayMinDis;
|
|||
|
}
|
|||
|
}
|
|||
|
public float FogDayMaxDis
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogDayMaxDis;
|
|||
|
}
|
|||
|
}
|
|||
|
public Color FogNightColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogNightColor;
|
|||
|
}
|
|||
|
}
|
|||
|
public float FogNightMinDis
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogNightMinDis;
|
|||
|
}
|
|||
|
}
|
|||
|
public float FogNightMaxDis
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _fogNightMaxDis;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region ctor --构造函数
|
|||
|
public BaseScene()
|
|||
|
{
|
|||
|
var root = new GameObject(SceneRootName);
|
|||
|
_root = root.transform;
|
|||
|
_root.parent = AppRoot.Transform;
|
|||
|
_entityContainer = new EntityContainer();
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//场景的心跳方法
|
|||
|
public void UpdateDeleateList()
|
|||
|
{
|
|||
|
if (_deleteEnityList.Count > 0)
|
|||
|
{
|
|||
|
for (int i = 0; i < _deleteEnityList.Count; ++i)
|
|||
|
{
|
|||
|
Entities.Remove(_deleteEnityList[i]);
|
|||
|
}
|
|||
|
_deleteEnityList.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Update(float deltaTime)
|
|||
|
{
|
|||
|
//更新删除列表
|
|||
|
UpdateDeleateList();
|
|||
|
_msger.Tick(deltaTime);
|
|||
|
_entityContainer.Update(deltaTime);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//删除角色
|
|||
|
public void DeleteEntity(ulong code)
|
|||
|
{
|
|||
|
_deleteEnityList.Add(code);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//LocalPlayer 对自己角色的操作
|
|||
|
|
|||
|
//获取玩家
|
|||
|
public Entity GetLocalPlayer()
|
|||
|
{
|
|||
|
if (_entityContainer != null)
|
|||
|
{
|
|||
|
return _entityContainer.LocalPlayer;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//获取玩家ID
|
|||
|
public ulong GetLocalPlayerID()
|
|||
|
{
|
|||
|
if (_entityContainer != null)
|
|||
|
{
|
|||
|
return _entityContainer.LocalPlayerID;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//对Entity的一些查询操作
|
|||
|
|
|||
|
public T Find<T>(UInt64 code) where T : Entity
|
|||
|
{
|
|||
|
Entity retval = null;
|
|||
|
if (_entityContainer != null)
|
|||
|
{
|
|||
|
retval = _entityContainer.Find(code);
|
|||
|
}
|
|||
|
return retval as T;
|
|||
|
}
|
|||
|
|
|||
|
public Entity FindEntity(UInt64 code)
|
|||
|
{
|
|||
|
Entity retval = null;
|
|||
|
if (_entityContainer != null)
|
|||
|
{
|
|||
|
retval = _entityContainer.Find(code);
|
|||
|
}
|
|||
|
return retval;
|
|||
|
}
|
|||
|
|
|||
|
public List<T> FindAll<T>() where T : Entity
|
|||
|
{
|
|||
|
return Entities.FindAll<T>();
|
|||
|
}
|
|||
|
|
|||
|
public int GetCount<T>() where T : Entity
|
|||
|
{
|
|||
|
return Entities.GetCount<T>();
|
|||
|
}
|
|||
|
|
|||
|
public int GetCount(MyFunc<Entity, bool> func)
|
|||
|
{
|
|||
|
return Entities.GetCount(func);
|
|||
|
}
|
|||
|
|
|||
|
public List<Entity> FindAll(MyFunc<Entity, bool> predicate)
|
|||
|
{
|
|||
|
return _entityContainer.FindAll(predicate);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//消息的一些处理
|
|||
|
protected virtual bool OnGameMessage(Message msg)
|
|||
|
{
|
|||
|
if (msg.ToId != 0)
|
|||
|
{
|
|||
|
var e = Entities.Find(msg.ToId);
|
|||
|
if (e != null)
|
|||
|
{
|
|||
|
if (e.HandleGameMessage(msg))
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
FLogger.DebugLogFormat("Message: {0} not handle, target[{1}] not found!", msg.MsgId.ToString(), msg.ToId);
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
private bool HandleGameMessage(BaseMessage msg)
|
|||
|
{
|
|||
|
return OnGameMessage(msg as Message);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //设置场景根GameObject有效
|
|||
|
|
|||
|
public void EnableSceneObjects(bool enable = true)
|
|||
|
{
|
|||
|
if (_sceneObjectsRoot != null)
|
|||
|
{
|
|||
|
_sceneObjectsRoot.gameObject.SetActive(enable);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Load & UnLoad -- 场景的加载和卸载操作
|
|||
|
|
|||
|
protected virtual bool OnCreate(bool isPlane, bool cameraBlend)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool OnReCreate()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual void OnDestroy()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
private void LoadSceneParams()
|
|||
|
{
|
|||
|
_cfg = DeclareMapsetting.Get(_id);
|
|||
|
LoadSceneParams(_cfg);
|
|||
|
//var planes = setting.GetBitPlanes();
|
|||
|
//if (planes != null)
|
|||
|
//{
|
|||
|
// for (int j = 0; j < planes.Count; ++j)
|
|||
|
// {
|
|||
|
// var s = DeclareMapsetting.Get(planes[j].id);
|
|||
|
// LoadSceneParams(s);
|
|||
|
// }
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
private void LoadSceneParams(DeclareMapsetting setting)
|
|||
|
{
|
|||
|
if (setting == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var levelName = setting.LevelName;
|
|||
|
var originName = setting.Name;
|
|||
|
|
|||
|
_minMountFlyHeight = setting.FlyMinHeight;
|
|||
|
_maxMountFlyHeight = setting.FlyMaxHeight;
|
|||
|
|
|||
|
_scenesParams = new SceneParams();
|
|||
|
_scenesParams.m_id = setting.MapId;
|
|||
|
|
|||
|
|
|||
|
// load path gird data;
|
|||
|
//PathGirdData girdData = Navigator.LoadPathGridData(setting.MapGrid);
|
|||
|
//_scenesParams.m_pathGirdData = girdData;
|
|||
|
PathGridSystem.instance.LoadPathGridData(setting.MapGrid);
|
|||
|
_scenesParams.m_pathGirdData = PathGridSystem.instance.PathGridData;
|
|||
|
|
|||
|
// load scene objects;
|
|||
|
//string mapName = FileUtils.MapInfoDirPath + "/" + setting.MapInfo.Replace(MapInfoConstDefine.FileExtName, MapInfoConstDefine.XmlExtName);
|
|||
|
string mapName = setting.MapInfo.Replace("_MapInfo.bytes", "");
|
|||
|
GameObject go = MapInfoDataReader.LoadScene(mapName);
|
|||
|
_scenesParams.m_sceneObjectName = go.name;
|
|||
|
_scenesParams.m_sceneObjects = go;
|
|||
|
_scenesParams.m_sceneObjects.name = go.name + "_" + setting.MapId.ToString();
|
|||
|
_scenesParams.m_sceneObjects.SetActive(false);
|
|||
|
_scenesParams.m_sceneObjects.transform.parent = _root;
|
|||
|
}
|
|||
|
|
|||
|
public PathEditor.Proxy.Plugin.PathGirdData GetSceneGirdData()
|
|||
|
{
|
|||
|
if (_scenesParams == null)
|
|||
|
return null;
|
|||
|
return _scenesParams.m_pathGirdData;
|
|||
|
}
|
|||
|
|
|||
|
public MapInfoBody GetMapBody()
|
|||
|
{
|
|||
|
if (_scenesParams == null)
|
|||
|
return null;
|
|||
|
return _scenesParams.m_mapBody;
|
|||
|
}
|
|||
|
|
|||
|
public GameObject GetSceneObjects()
|
|||
|
{
|
|||
|
if (_scenesParams == null)
|
|||
|
return null;
|
|||
|
GameObject retval = null;
|
|||
|
if (_scenesParams.m_sceneObjects != null)
|
|||
|
{
|
|||
|
_scenesParams.m_sceneObjectName = _scenesParams.m_sceneObjects.name;
|
|||
|
_scenesParams.m_sceneObjects.name = SceneObjectsName;
|
|||
|
}
|
|||
|
retval = _scenesParams.m_sceneObjects;
|
|||
|
retval.SetActive(true);
|
|||
|
return retval;
|
|||
|
}
|
|||
|
|
|||
|
private void CacheSubRoots()
|
|||
|
{
|
|||
|
_wayPointRoot = _sceneObjectsRoot.Find(WayPointRootName);
|
|||
|
_dynamicBlockerRoot = _sceneObjectsRoot.Find(DynamicBlockerRootName);
|
|||
|
_triggerRoot = _sceneObjectsRoot.Find(TriggerRootName);
|
|||
|
}
|
|||
|
//测试代码
|
|||
|
public bool PreLoadData(int id, String name, String levelName, String pathSuffix = null, String mapInfoSuffix = null)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_id = id;
|
|||
|
_name = name;
|
|||
|
_levelName = levelName;
|
|||
|
_pathFileName = levelName;
|
|||
|
_mapInfoFileName = levelName;
|
|||
|
LoadSceneParams();
|
|||
|
string pathDatakey = String.Format("{0}_{1}", levelName, pathSuffix);
|
|||
|
if (!String.IsNullOrEmpty(pathSuffix))
|
|||
|
{
|
|||
|
_pathFileName += "_" + pathSuffix;
|
|||
|
}
|
|||
|
if (!String.IsNullOrEmpty(mapInfoSuffix))
|
|||
|
{
|
|||
|
_mapInfoFileName += "_" + mapInfoSuffix;
|
|||
|
}
|
|||
|
|
|||
|
_navigator = PathGridSystem.instance;
|
|||
|
_navigator.Initialize(this);
|
|||
|
|
|||
|
_msger.ClearMsgPool();
|
|||
|
_msger.RegisterCallback(HandleGameMessage);
|
|||
|
|
|||
|
GameObject go = GetSceneObjects();
|
|||
|
if (go != null)
|
|||
|
{
|
|||
|
_sceneObjectsRoot = go.transform;
|
|||
|
_sceneObjectsRoot.parent = _root;
|
|||
|
}
|
|||
|
PathLandSystem lanNav = _navigator as PathLandSystem;
|
|||
|
lanNav.LoadWayPointData(this);
|
|||
|
|
|||
|
_entityContainer.Initialize(_root, _navigator.Get2DSize());
|
|||
|
CacheSubRoots();
|
|||
|
return true;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
FLogger.LogException(ex);
|
|||
|
FLogger.LogTime(ex.Message);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
// name: name by GD
|
|||
|
// levelName: unity level name
|
|||
|
// level suffix, could be null
|
|||
|
public bool Load(int id, string name, string levelName, string dayCameraName, string nightCameraName, bool isPlane, bool cameraBlend)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_id = id;
|
|||
|
_name = name;
|
|||
|
_levelName = levelName;
|
|||
|
_pathFileName = levelName;
|
|||
|
_mapInfoFileName = levelName;
|
|||
|
_dayCameraName = dayCameraName;
|
|||
|
_nightCameraName = nightCameraName;
|
|||
|
LoadSceneParams();
|
|||
|
_navigator = PathGridSystem.instance;
|
|||
|
_navigator.Initialize(this);
|
|||
|
|
|||
|
_msger.ClearMsgPool();
|
|||
|
_msger.RegisterCallback(HandleGameMessage);
|
|||
|
GameObject go = GetSceneObjects();
|
|||
|
if (go != null)
|
|||
|
{
|
|||
|
_sceneObjectsRoot = go.transform;
|
|||
|
_sceneObjectsRoot.parent = _root;
|
|||
|
SceneObject[] allSceneObjects = go.GetComponentsInChildren<SceneObject>();
|
|||
|
for (int i = 0; i < allSceneObjects.Length; ++i)
|
|||
|
{
|
|||
|
allSceneObjects[i].Initlaize(this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
PathLandSystem lanNav = _navigator as PathLandSystem;
|
|||
|
lanNav.LoadWayPointData(this);
|
|||
|
|
|||
|
_entityContainer.Initialize(_root, _navigator.Get2DSize());
|
|||
|
CacheSubRoots();
|
|||
|
if (_cameraManager == null)
|
|||
|
{
|
|||
|
_cameraManager = new CameraManager();
|
|||
|
_cameraManager.Initialize();
|
|||
|
}
|
|||
|
OnCreate(isPlane, cameraBlend);
|
|||
|
return true;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
FLogger.LogException(ex);
|
|||
|
FLogger.LogTime(ex.Message);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Unload()
|
|||
|
{
|
|||
|
if (String.IsNullOrEmpty(_name))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
OnDestroy();
|
|||
|
Message exitSceneMsg = new Message();
|
|||
|
exitSceneMsg.MsgId = MessageId.ExitScene;
|
|||
|
Entities.ForEach(
|
|||
|
(key, value) =>
|
|||
|
{
|
|||
|
exitSceneMsg.ToId = key;
|
|||
|
value.HandleGameMessage(exitSceneMsg);
|
|||
|
}
|
|||
|
);
|
|||
|
|
|||
|
if (_scenesParams.m_sceneObjects != null)
|
|||
|
{
|
|||
|
_scenesParams.m_sceneObjects.SetActive(false);
|
|||
|
_scenesParams.m_sceneObjects.transform.parent = null;
|
|||
|
UnityEngine.Object.Destroy(_scenesParams.m_sceneObjects);
|
|||
|
}
|
|||
|
_msger.UnregisterCallback(HandleGameMessage);
|
|||
|
_wayPointRoot = null;
|
|||
|
_dynamicBlockerRoot = null;
|
|||
|
_triggerRoot = null;
|
|||
|
if (_entityContainer != null)
|
|||
|
{
|
|||
|
_entityContainer.Uninitialize();
|
|||
|
_entityContainer = null;
|
|||
|
}
|
|||
|
|
|||
|
// [SceneObjects]
|
|||
|
if (_sceneObjectsRoot != null)
|
|||
|
{
|
|||
|
GameObject.Destroy(_sceneObjectsRoot.gameObject);
|
|||
|
_sceneObjectsRoot = null;
|
|||
|
}
|
|||
|
// [SceneRoot]
|
|||
|
if (_root != null)
|
|||
|
{
|
|||
|
GameObject.Destroy(_root.gameObject);
|
|||
|
_root = null;
|
|||
|
}
|
|||
|
// [SceneCameraRoot] don't destroy, re-use it
|
|||
|
if (_navigator != null)
|
|||
|
{
|
|||
|
_navigator.Uninitialize();
|
|||
|
_navigator = null;
|
|||
|
}
|
|||
|
|
|||
|
_cameraManager.Uninitialize();
|
|||
|
_cameraManager = null;
|
|||
|
_id = -1;
|
|||
|
_name = String.Empty;
|
|||
|
_levelName = String.Empty;
|
|||
|
_pathFileName = String.Empty;
|
|||
|
_mapInfoFileName = String.Empty;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //查找 寻路点
|
|||
|
//查找线路点
|
|||
|
public WayPointNode FindWayPointByName(String name)
|
|||
|
{
|
|||
|
if (_wayPointRoot != null)
|
|||
|
{
|
|||
|
WayPointPlanData pd = _wayPointRoot.GetComponent<WayPointPlanData>();
|
|||
|
if (pd != null && pd.m_pointInfo != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < pd.m_pointInfo.Length; ++i)
|
|||
|
if (pd.m_pointInfo[i].name == name)
|
|||
|
return pd.m_pointInfo[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
//查找线路点
|
|||
|
public WayPointNode FindWayPointById(int id)
|
|||
|
{
|
|||
|
if (_wayPointRoot != null)
|
|||
|
{
|
|||
|
WayPointPlanData pd = _wayPointRoot.GetComponent<WayPointPlanData>();
|
|||
|
if (pd != null && pd.m_pointInfo != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < pd.m_pointInfo.Length; ++i)
|
|||
|
if (pd.m_pointInfo[i].index == id)
|
|||
|
return pd.m_pointInfo[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
//获取最近的线路点
|
|||
|
public WayPointNode GetNearestWayPoint(ref Vector3 pos)
|
|||
|
{
|
|||
|
if (_wayPointRoot != null)
|
|||
|
{
|
|||
|
WayPointPlanData pd = _wayPointRoot.GetComponent<WayPointPlanData>();
|
|||
|
if (pd != null)
|
|||
|
{
|
|||
|
Vector2 tempPos = Vector2.zero;
|
|||
|
tempPos.x = pos.x;
|
|||
|
tempPos.y = pos.z;
|
|||
|
int index = pd.GetNearestIndexBypos(ref tempPos);
|
|||
|
if (index != -1)
|
|||
|
return pd.m_pointInfo[index];
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//静态函数
|
|||
|
//获取地形位置
|
|||
|
public Vector3 GetTerrainPosition(float x, float z)
|
|||
|
{
|
|||
|
float height = 0;
|
|||
|
GetHeightOnTerrain(x, z, out height);
|
|||
|
return new Vector3(x, height, z);
|
|||
|
}
|
|||
|
|
|||
|
//获取地形高度
|
|||
|
public bool GetHeightOnTerrain(float aX, float aZ, out float aHeight)
|
|||
|
{
|
|||
|
if (_scenesParams != null && _scenesParams.m_pathGirdData != null)
|
|||
|
{
|
|||
|
aHeight = _scenesParams.m_pathGirdData.GetHeight(aX, aZ);
|
|||
|
return true;
|
|||
|
}
|
|||
|
aHeight = 0;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//获取地形高度
|
|||
|
public float GetHeightOnTerrain(float aX, float aZ)
|
|||
|
{
|
|||
|
if (_scenesParams != null && _scenesParams.m_pathGirdData != null)
|
|||
|
{
|
|||
|
return _scenesParams.m_pathGirdData.GetHeight(aX, aZ);
|
|||
|
}
|
|||
|
return 0f;
|
|||
|
}
|
|||
|
|
|||
|
//获取地形位置
|
|||
|
public static Vector3 GetTerrainPositionByRay(float x, float z)
|
|||
|
{
|
|||
|
float height = 0;
|
|||
|
GetHeightOnTerrainByRay(x, z, out height);
|
|||
|
return new Vector3(x, height, z);
|
|||
|
}
|
|||
|
|
|||
|
//获取地形高度
|
|||
|
public static bool GetHeightOnTerrainByRay(float aX, float aZ, out float aHeight)
|
|||
|
{
|
|||
|
Ray ray = new Ray();
|
|||
|
ray.origin = new Vector3(aX, 200.0f, aZ);
|
|||
|
ray.direction = Vector3.down;
|
|||
|
RaycastHit hit;
|
|||
|
LayerMask layerMask = LayerUtils.TerrainPath_Mask;
|
|||
|
Physics.Raycast(ray, out hit, 1000.0f, layerMask);
|
|||
|
if (hit.collider != null)
|
|||
|
{
|
|||
|
aHeight = hit.point.y + 0.1f;
|
|||
|
return true;
|
|||
|
}
|
|||
|
aHeight = 0;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 修正摄像机特效以适应不同大小的屏幕
|
|||
|
/// </summary>
|
|||
|
/// <param name="vfx"></param>
|
|||
|
/// <param name="cam"></param>
|
|||
|
public static void FixCameraVfx(FGameObjectVFX vfx, Camera cam)
|
|||
|
{
|
|||
|
if (cam != null && vfx != null)
|
|||
|
{
|
|||
|
//这里以制作16:9为标准,来对特效z值进行调整
|
|||
|
var z = Math.Min(0, (cam.aspect * 9 - 16) * (-0.02f));
|
|||
|
vfx.SetLocalPosition(new Vector3(0, 0, z));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|