879 lines
30 KiB
C#
879 lines
30 KiB
C#
|
using System;
|
|||
|
using Thousandto.Plugins.Common.UniScene;
|
|||
|
using UnityEngine;
|
|||
|
using Thousandto.Core.Asset;
|
|||
|
using Thousandto.Cfg.Data;
|
|||
|
|
|||
|
using Thousandto.Core.RootSystem;
|
|||
|
using Thousandto.Core.Base;
|
|||
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Code.Global;
|
|||
|
using System.Collections.Generic;
|
|||
|
using Thousandto.Core.PostEffect;
|
|||
|
using Thousandto.Code.Logic.LocalPlayerBT;
|
|||
|
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
|
|||
|
|
|||
|
namespace Thousandto.Code.Logic
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 游戏的逻辑场景类
|
|||
|
/// </summary>
|
|||
|
public class GameScene : BaseScene
|
|||
|
{
|
|||
|
#region member
|
|||
|
private int _lineID = 0;
|
|||
|
private int _frontMapID = 0;
|
|||
|
//切换场景Type(切换场景原因)
|
|||
|
private int _transType = 0;
|
|||
|
//切换场景服务器下发参数
|
|||
|
private int _transParam = 0;
|
|||
|
private FGameObjectVFX _cameraVfxID = null;
|
|||
|
//美术制作场景的根节点
|
|||
|
private Transform _unitySceneRoot = null;
|
|||
|
private static Type grassRlationType = null;
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//属性
|
|||
|
public int LineID
|
|||
|
{
|
|||
|
get { return _lineID; }
|
|||
|
set { _lineID = value; }
|
|||
|
}
|
|||
|
|
|||
|
public int FrontMapID
|
|||
|
{
|
|||
|
get { return _frontMapID; }
|
|||
|
set { _frontMapID = value; }
|
|||
|
}
|
|||
|
|
|||
|
//重写获取本地玩家的接口
|
|||
|
new public LocalPlayer GetLocalPlayer()
|
|||
|
{
|
|||
|
if (base.GetLocalPlayer() != null)
|
|||
|
{
|
|||
|
return base.GetLocalPlayer() as LocalPlayer;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
public int TransType
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _transType;
|
|||
|
}
|
|||
|
|
|||
|
set
|
|||
|
{
|
|||
|
_transType = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public int TransParam
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _transParam;
|
|||
|
}
|
|||
|
|
|||
|
set
|
|||
|
{
|
|||
|
_transParam = value;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//构造函数
|
|||
|
public GameScene()
|
|||
|
{
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//继承基类
|
|||
|
protected override bool OnCreate(bool isPlane, bool cameraBlend)
|
|||
|
{
|
|||
|
base.OnCreate(isPlane, cameraBlend);
|
|||
|
|
|||
|
//清理模型计数的容器
|
|||
|
FGameObjectModel.ClearModelTypeFGOContainer();
|
|||
|
//载入雾效配置
|
|||
|
LoadFogSettings();
|
|||
|
//载入阴影设置
|
|||
|
LoadShadowSettings();
|
|||
|
//载入摄像机配置
|
|||
|
LoadCameraSettings(cameraBlend);
|
|||
|
//载入草
|
|||
|
LoadGrassScript();
|
|||
|
//载入镜头特效
|
|||
|
LoadCameraVfx();
|
|||
|
//设置Shader的全局属性
|
|||
|
SetShaderGlobal();
|
|||
|
//处理摄像机的层切
|
|||
|
SetCameraLayerCull();
|
|||
|
//设置场景特效的等级
|
|||
|
SetSceneEffectLevel();
|
|||
|
return true;
|
|||
|
}
|
|||
|
protected override void OnDestroy()
|
|||
|
{
|
|||
|
//释放镜头特效
|
|||
|
UnLoadCameraVfx();
|
|||
|
//删除草
|
|||
|
//UnLoadGrassScript();
|
|||
|
grassRlationType = null;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region loaders
|
|||
|
public T LoadEntity<T>(EntityInfo baseInfo, ModelLODLevel userLod = ModelLODLevel.Default, MyAction<T> postLoadCallback = null)
|
|||
|
where T : Entity, new()
|
|||
|
{
|
|||
|
bool ret = false;
|
|||
|
T obj = null;
|
|||
|
|
|||
|
if (Entities.Contains(baseInfo.ID) == false)
|
|||
|
{
|
|||
|
var entity = new T();
|
|||
|
try
|
|||
|
{
|
|||
|
if (entity.Initialize(baseInfo, this))
|
|||
|
{
|
|||
|
if (Entities.Add(entity, (entity is LocalPlayer) == false))
|
|||
|
{
|
|||
|
if (postLoadCallback != null)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
postLoadCallback(entity);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
FLogger.DebugLogException(e);
|
|||
|
}
|
|||
|
}
|
|||
|
ret = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (ret == false && entity != null)
|
|||
|
{
|
|||
|
entity.Uninitialize();
|
|||
|
entity = null;
|
|||
|
}
|
|||
|
}
|
|||
|
obj = entity;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
obj = Entities.Find(baseInfo.ID) as T;
|
|||
|
}
|
|||
|
return obj;
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadNpc(NpcInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<Npc>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadMonster(MonsterInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<Monster>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadPet(PetInitInfo baseInfo)
|
|||
|
{
|
|||
|
if (baseInfo.MasterID == 0)
|
|||
|
{
|
|||
|
FLogger.DebugLogError("Load pet failed: host code is 0.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
if(baseInfo.MasterID == GetLocalPlayerID())
|
|||
|
{
|
|||
|
return null != LoadEntity<LocalPet>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return null != LoadEntity<Pet>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadAssistPet(AssistPetInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<AssistPet>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadFlySword(FlySwordInitInfo baseInfo)
|
|||
|
{
|
|||
|
if (baseInfo.MasterID == 0)
|
|||
|
{
|
|||
|
FLogger.DebugLogError("Load fabao failed: host code is 0.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (baseInfo.MasterID == GetLocalPlayerID())
|
|||
|
{
|
|||
|
return null != LoadEntity<LocalFlySword>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return null != LoadEntity<FlySword>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
public bool LoadMarryChild(MarryChildInitInfo baseInfo)
|
|||
|
{
|
|||
|
if (baseInfo.Owner == null)
|
|||
|
{
|
|||
|
FLogger.DebugLogError("Load marrychild failed: host code is 0.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
return null != LoadEntity<MarryChild>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadLocalPlayer(LocalPlayerInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<LocalPlayer>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
LocalPlayerRoot.SetLocalPlayer(e as LocalPlayer);
|
|||
|
Entities.SetLocalPlayer(e);
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
//重新载入主角
|
|||
|
public bool ReloadLocalPlayer(Vector2? position)
|
|||
|
{
|
|||
|
if (LocalPlayerRoot.LocalPlayer != null)
|
|||
|
{
|
|||
|
LocalPlayerRoot.LocalPlayer.ChangeToScene(this, position);
|
|||
|
if (Entities.Add(LocalPlayerRoot.LocalPlayer, false))
|
|||
|
{
|
|||
|
Entities.SetLocalPlayer(LocalPlayerRoot.LocalPlayer);
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadRemotePlayer(RemotePlayerInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<RemotePlayer>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadCollection(CollectionInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<Collection>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
public bool LoadLockTrajectoryObj(LockTrajectoryObjInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<LockTrajectoryObj>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadSimpleSkillObject(SimpleSkillObjectInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<SimpleSkillObject>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadSkillObject(SkillObjectInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<SkillObject>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadDropItem(DropItemInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<DropItem>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadDropGold(DropGoldInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<DropGold>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
public bool LoadGroundBuff(GroundBuffInitInfo baseInfo)
|
|||
|
{
|
|||
|
return null != LoadEntity<GroundBuff>(
|
|||
|
baseInfo,
|
|||
|
ModelLODLevel.Default,
|
|||
|
(e) =>
|
|||
|
{
|
|||
|
|
|||
|
});
|
|||
|
}
|
|||
|
public bool LoadLuaCharacter(LuaCharInitInfo baseInfo)
|
|||
|
{
|
|||
|
bool ret = false;
|
|||
|
LuaCharacter obj = null;
|
|||
|
if (Entities.Contains(baseInfo.ID) == false)
|
|||
|
{
|
|||
|
var entity = new LuaCharacter();
|
|||
|
//绑定lua脚本
|
|||
|
GameCenter.LuaSystem.Adaptor.BindLuaCharacter(entity, baseInfo);
|
|||
|
try
|
|||
|
{
|
|||
|
if (entity.Initialize(baseInfo, this))
|
|||
|
{
|
|||
|
if (Entities.Add(entity, true))
|
|||
|
{
|
|||
|
ret = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (ret == false && entity != null)
|
|||
|
{
|
|||
|
entity.Uninitialize();
|
|||
|
entity = null;
|
|||
|
}
|
|||
|
}
|
|||
|
obj = entity;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
obj = Entities.Find(baseInfo.ID) as LuaCharacter;
|
|||
|
}
|
|||
|
return obj != null;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
//设置摄像机的层切处理
|
|||
|
public void SetCameraLayerCull()
|
|||
|
{
|
|||
|
//如果当前质量等级小于1,那么就表示是最低等级,可见距离也变为原来的0.8
|
|||
|
//float scale = 1f;
|
|||
|
//if (GameCenter.GameSetting.GetSetting(GameSettingKeyCode.QualityLevel) < 1)
|
|||
|
//{
|
|||
|
// scale = 0.8f;
|
|||
|
//}
|
|||
|
|
|||
|
//float[] layerCullDis = new float[32];
|
|||
|
//for (int i = 0; i < layerCullDis.Length; i++) layerCullDis[i] = Cfg.CamLayerCullDistance * scale;
|
|||
|
//layerCullDis[1] = 30f; //传送点
|
|||
|
//layerCullDis[16] = 30f; //场景特效
|
|||
|
//layerCullDis[8] = 2000;
|
|||
|
|
|||
|
//SceneCamera.layerCullSpherical = true;
|
|||
|
//SceneCamera.layerCullDistances = layerCullDis;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//处理场景特效等级
|
|||
|
public void SetSceneEffectLevel()
|
|||
|
{
|
|||
|
//场景中的特效
|
|||
|
var effectGo = FindSceneRootChild("[vfx]");
|
|||
|
if (effectGo != null)
|
|||
|
{
|
|||
|
effectGo.gameObject.SetActive(!GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.TPVFXScene));
|
|||
|
FGameObjectVFXRoot.ApplyVFXLevel(effectGo, GameCenter.GameSetting.GetSetting(GameSettingKeyCode.SceneVFXLevel));
|
|||
|
}
|
|||
|
}
|
|||
|
//载入无效设置
|
|||
|
protected void LoadFogSettings()
|
|||
|
{
|
|||
|
_haveFogSetting = false;
|
|||
|
var haveDay = false;
|
|||
|
if(!string.IsNullOrEmpty(Cfg.FogDayParam))
|
|||
|
{
|
|||
|
var fogParams = Cfg.FogDayParam.Split(';');
|
|||
|
if(fogParams.Length >= 3)
|
|||
|
{
|
|||
|
var colorParams = fogParams[0].Split('_');
|
|||
|
if(colorParams.Length >= 3)
|
|||
|
{
|
|||
|
int r, g, b;
|
|||
|
float min, max;
|
|||
|
if(int.TryParse(colorParams[0], out r) && int.TryParse(colorParams[1], out g) && int.TryParse(colorParams[2], out b) &&
|
|||
|
float.TryParse(fogParams[1], out min) && float.TryParse(fogParams[2], out max))
|
|||
|
{
|
|||
|
_fogDayColor = new Color(r / 255f, g / 255f, b / 255f, 1f);
|
|||
|
_fogDayMinDis = min;
|
|||
|
_fogDayMaxDis = max;
|
|||
|
haveDay = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var haveNight = false;
|
|||
|
if (!string.IsNullOrEmpty(Cfg.FogNightParam))
|
|||
|
{
|
|||
|
var fogParams = Cfg.FogNightParam.Split(';');
|
|||
|
if (fogParams.Length >= 3)
|
|||
|
{
|
|||
|
var colorParams = fogParams[0].Split('_');
|
|||
|
if (colorParams.Length >= 3)
|
|||
|
{
|
|||
|
int r, g, b;
|
|||
|
float min, max;
|
|||
|
if (int.TryParse(colorParams[0], out r) && int.TryParse(colorParams[1], out g) && int.TryParse(colorParams[2], out b) &&
|
|||
|
float.TryParse(fogParams[1], out min) && float.TryParse(fogParams[2], out max))
|
|||
|
{
|
|||
|
_fogNightColor = new Color(r / 255f, g / 255f, b / 255f, 1f);
|
|||
|
_fogNightMinDis = min;
|
|||
|
_fogNightMaxDis = max;
|
|||
|
haveNight = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_haveFogSetting = haveDay && haveNight;
|
|||
|
}
|
|||
|
//载入阴影设置
|
|||
|
protected void LoadShadowSettings()
|
|||
|
{
|
|||
|
bool playerShadowEnable = false;
|
|||
|
ParseShadowParam(Cfg.ShadowParam, ref playerShadowEnable,ref _shadowLightDir, ref _shadowDayStrength, ref _shadowNightStrength);
|
|||
|
ParseShadowParam(Cfg.SceneShadowParam, ref _sceneShadowOpen,ref _sceneShadowLightDir, ref _sceneShadowDayStrength, ref _sceneShadowNightStrength);
|
|||
|
}
|
|||
|
|
|||
|
private void ParseShadowParam(string cfgStr,ref bool enabled,ref Vector3 dir,ref float day,ref float night)
|
|||
|
{
|
|||
|
dir = Vector3.down;
|
|||
|
day = 0.7f;
|
|||
|
night = 0.3f;
|
|||
|
enabled = true;
|
|||
|
var param = cfgStr.Split(';');
|
|||
|
if (param != null && param.Length >= 4)
|
|||
|
{
|
|||
|
int open = 0;
|
|||
|
int.TryParse(param[0], out open);
|
|||
|
enabled = open > 0;
|
|||
|
String[] dirParam = param[1].Split('_');
|
|||
|
if (dirParam != null && dirParam.Length >= 3)
|
|||
|
{
|
|||
|
float x, y, z;
|
|||
|
if (float.TryParse(dirParam[0], out x) && float.TryParse(dirParam[1], out y) && float.TryParse(dirParam[2], out z))
|
|||
|
{
|
|||
|
dir = new Vector3(x, y, z);
|
|||
|
}
|
|||
|
}
|
|||
|
float.TryParse(param[2], out day);
|
|||
|
float.TryParse(param[3], out night);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
protected void LoadCameraSettings(bool cameraBlend)
|
|||
|
{
|
|||
|
GameCenter.CameraControlUtil.LoadCameraSetting(Cfg, SceneCameraControl);
|
|||
|
////需要时开启离屏特效,现在暂时不需要了
|
|||
|
//UnityUtils.RequireComponent<Launcher.ExternalLibs.OffScreenVfxScript>(CameraManager.CamerasRoot.gameObject);
|
|||
|
if (!CameraManager.ChangeCamera(DayCameraName, cameraBlend))
|
|||
|
{
|
|||
|
CameraManager.ChangeCamera(CameraManager.NormalCameraName, cameraBlend);
|
|||
|
}
|
|||
|
var eveneId = GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnablePostEffect) ? Global.LogicEventDefine.EID_EVENT_ENABLE_CAMERA_POSTEFFECT : Global.LogicEventDefine.EID_EVENT_DISABLE_CAMERA_POSTEFFECT;
|
|||
|
var cameraList = CameraManager.SceneCamList;
|
|||
|
for (int i = 0; i < cameraList.Count; ++i)
|
|||
|
{
|
|||
|
GameCenter.PushFixEvent(eveneId, cameraList[i].gameObject);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void LoadGrassScript()
|
|||
|
{
|
|||
|
SetGrassEnable();
|
|||
|
}
|
|||
|
|
|||
|
public static void SetGrassEnable()
|
|||
|
{
|
|||
|
if (grassRlationType == null)
|
|||
|
{
|
|||
|
var assemblys = AppDomain.CurrentDomain.GetAssemblies();
|
|||
|
for (int i = 0; i < assemblys.Length; i++)
|
|||
|
{
|
|||
|
var assembly = assemblys[i];
|
|||
|
grassRlationType = assembly.GetType("Thousandto.Launcher.ExternalLibs.GrassRelationScript");
|
|||
|
if (grassRlationType != null)
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if (grassRlationType == null)
|
|||
|
return;
|
|||
|
System.Reflection.MethodInfo mInfo = grassRlationType.GetMethod("SetEnabled", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public
|
|||
|
| System.Reflection.BindingFlags.InvokeMethod);
|
|||
|
//object reflect = Activator.CreateInstance(grassRlationType);
|
|||
|
bool isEnable = GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnableGrass);
|
|||
|
mInfo.Invoke(null, new object[] { isEnable });
|
|||
|
}
|
|||
|
|
|||
|
public void UnLoadGrassScript()
|
|||
|
{
|
|||
|
var grassGo = FindSceneRootChild("grass");
|
|||
|
if (grassGo != null)
|
|||
|
{
|
|||
|
//GrassAnimateScript.UnInstallScript(grassGo.transform);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void LoadCameraVfx()
|
|||
|
{
|
|||
|
UnLoadCameraVfx();
|
|||
|
|
|||
|
if (GameCenter.GameSetting.GetSetting(GameSettingKeyCode.EnableCameraVFX) > 0)
|
|||
|
{
|
|||
|
_cameraVfxID = new FGameObjectVFX(ModelTypeCode.OtherVFX, Cfg.CameraVfx, true);
|
|||
|
_cameraVfxID.SetParent(CameraManager.CamerasRoot, true);
|
|||
|
_cameraVfxID.SetLayer(LayerUtils.Terrain, true);
|
|||
|
FixCameraVfx(_cameraVfxID, SceneCamera);
|
|||
|
_cameraVfxID.Play(1);
|
|||
|
/* //需要时开启离屏特效,现在暂时不需要了
|
|||
|
if (_cameraVfxID.AllRenderList != null)
|
|||
|
{
|
|||
|
CameraManager.CamerasRoot.SendMessage("OnCameraVfxChanged", _cameraVfxID.AllRenderList);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_cameraVfxID.OnLoadFinishedCallBack = delegate (FGameObjectBase x)
|
|||
|
{
|
|||
|
Debug.LogError("Invoke:OnCameraVfxChanged:" + (_cameraVfxID.AllRenderList == null ? "NULL" : _cameraVfxID.AllRenderList.Count.ToString()));
|
|||
|
CameraManager.CamerasRoot.SendMessage("OnCameraVfxChanged", _cameraVfxID.AllRenderList);
|
|||
|
};
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void Update(float deltaTime)
|
|||
|
{
|
|||
|
base.Update(deltaTime);
|
|||
|
}
|
|||
|
|
|||
|
public void UnLoadCameraVfx()
|
|||
|
{
|
|||
|
if (_cameraVfxID != null)
|
|||
|
{
|
|||
|
_cameraVfxID.Destroy();
|
|||
|
////需要时开启离屏特效,现在暂时不需要了
|
|||
|
//CameraManager.CamerasRoot.SendMessage("OnCameraVfxChanged", string.Empty, SendMessageOptions.DontRequireReceiver);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置Shader的全局参数
|
|||
|
protected void SetShaderGlobal()
|
|||
|
{
|
|||
|
//设置brdf的vfd纹理
|
|||
|
//GameCenter.MaterialManager.SetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_MAGICTEX, "tex_brdf_fvd_01", ImageTypeCode.Shader);
|
|||
|
//设置环境的cube
|
|||
|
//GameCenter.MaterialManager.SetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_ENVCUBE, "tex_reflection_01", ImageTypeCode.Shader);
|
|||
|
//X光线纹理
|
|||
|
//GameCenter.MaterialManager.SetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_XRAYTEX, "tex_xray_sphere", ImageTypeCode.Shader);
|
|||
|
}
|
|||
|
|
|||
|
//恢复Shader的全局参数
|
|||
|
protected void ResetShaderGlobal()
|
|||
|
{
|
|||
|
//GameCenter.MaterialManager.ResetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_MAGICTEX);
|
|||
|
//GameCenter.MaterialManager.ResetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_ENVCUBE);
|
|||
|
//GameCenter.MaterialManager.ResetGlobalTexture(ShaderPropertyNameDefine.CN_SPN_XRAYTEX);
|
|||
|
}
|
|||
|
|
|||
|
public void PlayObjectAnimation(String objectPath, String name)
|
|||
|
{
|
|||
|
Trigger_PlayAnimation(objectPath, name);
|
|||
|
}
|
|||
|
|
|||
|
protected bool Trigger_PlayAnimation(String objectPath, String name)
|
|||
|
{
|
|||
|
for (; ; )
|
|||
|
{
|
|||
|
var go = GameObject.Find(objectPath);
|
|||
|
if (go == null)
|
|||
|
{
|
|||
|
FLogger.DebugLogErrorFormat("Trigger_PlayAnimation: target '{0}' not found!", objectPath);
|
|||
|
break;
|
|||
|
}
|
|||
|
var anim = go.GetComponentInChildren<Animation>();
|
|||
|
if (anim == null)
|
|||
|
{
|
|||
|
var animator = go.GetComponentInChildren<Animator>();
|
|||
|
if (animator != null)
|
|||
|
{
|
|||
|
animator.Play(name);
|
|||
|
return true;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
var clip = anim.GetClip(name);
|
|||
|
if (clip == null)
|
|||
|
{
|
|||
|
FLogger.DebugLogErrorFormat("Trigger_PlayAnimation: animation not found: {0}", name);
|
|||
|
break;
|
|||
|
}
|
|||
|
return anim.Play(name, PlayMode.StopSameLayer);
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
protected override bool OnGameMessage(Message msg)
|
|||
|
{
|
|||
|
if(!GameCenter.LuaSystem.Adaptor.OnGameMessage(msg))
|
|||
|
{
|
|||
|
return base.OnGameMessage(msg);
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//换线
|
|||
|
public void DoChangeLine(DeclareMapsetting cfg, int lineID, bool isRealChange)
|
|||
|
{
|
|||
|
LocalPlayer lp = GetLocalPlayer();
|
|||
|
if (lp == null)
|
|||
|
return;
|
|||
|
lp.DoChangeLine();
|
|||
|
if (isRealChange)
|
|||
|
{
|
|||
|
Msger.PostMessage(MessageId.SwitchLine);
|
|||
|
//换线之后停止挂机
|
|||
|
GameCenter.LuaSystem.Adaptor.EndMandate();
|
|||
|
}
|
|||
|
|
|||
|
_lineID = lineID;
|
|||
|
//更新小地图名字
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_PLYAER_ENTER_SCENE);
|
|||
|
}
|
|||
|
|
|||
|
//进入位面
|
|||
|
public void DoEnterPlaneCopy(int id, int fMapId, ref int activeMapId, string name, string levelName, string dayCameraName, string nightCameraName, int lineId, Vector2? position = null)
|
|||
|
{
|
|||
|
LocalPlayer lp = GetLocalPlayer();
|
|||
|
if (lp == null)
|
|||
|
return;
|
|||
|
//离开老地图
|
|||
|
GameCenter.LuaSystem.Adaptor.OnLeaveScene(true);
|
|||
|
//尝试加载一下地图配置文件,防止寻路点不对
|
|||
|
GameCenter.PathFinderSystem.LoadSingleMapInfo(DeclareMapsetting.Get(id));
|
|||
|
var cameraBlend = true;
|
|||
|
if(position != null && Vector2.SqrMagnitude(lp.Position2d - position.Value) > 100f)
|
|||
|
{
|
|||
|
//位移过大,不做摄像机混合
|
|||
|
cameraBlend = false;
|
|||
|
}
|
|||
|
Load(id, name, levelName, dayCameraName, nightCameraName, true, cameraBlend);
|
|||
|
//LoadPlanCopyMapData(id, name, levelName, dayCameraName, nightCameraName);
|
|||
|
var cameraSwitchTime = 0f;
|
|||
|
if (Cfg.CamSwitchTime > 0)
|
|||
|
{
|
|||
|
cameraSwitchTime = Cfg.CamSwitchTime / 1000f;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var fCfg = DeclareMapsetting.Get(fMapId);
|
|||
|
if (fCfg != null && fCfg.CamSwitchTime > 0)
|
|||
|
{
|
|||
|
cameraSwitchTime = fCfg.CamSwitchTime / 1000f;
|
|||
|
}
|
|||
|
}
|
|||
|
//执行摄像机动画
|
|||
|
var camOffsetY = CameraControlDefine.LockOffsetY;
|
|||
|
var targetDis = CameraControlDefine.CurMaxDis;
|
|||
|
if (lp.IsOnMount)
|
|||
|
{
|
|||
|
if (lp.Skin != null && lp.Skin.SkinPartIsValid(FSkinPartCode.Mount))
|
|||
|
{
|
|||
|
//在坐骑上的时候使用坐骑高度
|
|||
|
var cfg = DeclareHuaxingHorse.Get(lp.Skin.GetSkinPartCfgID(FSkinPartCode.Mount));
|
|||
|
if (cfg != null)
|
|||
|
{
|
|||
|
camOffsetY = cfg.SceneCameraYAdd / 100f;
|
|||
|
CameraControlDefine.DisAddValue = cfg.SceneCameraDisadd / 100f;
|
|||
|
targetDis += CameraControlDefine.DisAddValue;
|
|||
|
CameraControlDefine.PitchAddValue = cfg.SceneCameraPitchadd;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
SceneCameraControl.PlayAnim(CameraControlDefine.LockPitch, CameraControlDefine.LockYaw, targetDis, 0f, camOffsetY, CameraControlDefine.CurFov, cameraSwitchTime);
|
|||
|
|
|||
|
FrontMapID = fMapId;
|
|||
|
LineID = lineId;
|
|||
|
GameCenter.LuaSystem.Adaptor.EndMandate();
|
|||
|
lp.DoChangeLine();
|
|||
|
|
|||
|
//做一次角色清除
|
|||
|
var allEntity = Entities.GetAll();
|
|||
|
var removeList = new List<ulong>();
|
|||
|
for (int i = 0; i < allEntity.Count; ++i)
|
|||
|
{
|
|||
|
var entity = allEntity[i];
|
|||
|
if (entity is Monster)
|
|||
|
{
|
|||
|
var m = entity as Monster;
|
|||
|
if (!m.IsDead())
|
|||
|
{
|
|||
|
DeleteEntity(entity.ID);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (entity.IsLocal() || entity is DropGold || entity is DropItem)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DeleteEntity(entity.ID);
|
|||
|
}
|
|||
|
}
|
|||
|
//更新删除列表
|
|||
|
UpdateDeleateList();
|
|||
|
//设置当前活跃地图id
|
|||
|
activeMapId = id;
|
|||
|
//告诉服务器加载完成
|
|||
|
NetHandler.SendMessage_ReqLoadFinish();
|
|||
|
|
|||
|
if (position != null)
|
|||
|
{
|
|||
|
lp.RayCastToGroundXOZ(new Vector2(position.Value.x, position.Value.y));
|
|||
|
}
|
|||
|
|
|||
|
//重新载入飞剑
|
|||
|
lp.LoadFlySword();
|
|||
|
//重新载入仙娃
|
|||
|
lp.LoadMarryChild();
|
|||
|
//进入新地图
|
|||
|
GameCenter.LuaSystem.Adaptor.OnEnterScene(id, true);
|
|||
|
PlayerBT.crossBD.OnEnterScene();
|
|||
|
var mCfg = DeclareMapsetting.Get(id);
|
|||
|
if (mCfg != null)
|
|||
|
{
|
|||
|
AudioPlayer.PlayMusic(mCfg.Music);
|
|||
|
}
|
|||
|
//刷新buff列表,删除切换场景清除的buff
|
|||
|
GameCenter.BuffSystem.OnChangeScene();
|
|||
|
}
|
|||
|
|
|||
|
#region//私有函数
|
|||
|
//查找场景节点的子节点
|
|||
|
private Transform FindSceneRootChild(string name)
|
|||
|
{
|
|||
|
var root = GetUnitySceneRoot();
|
|||
|
if (root != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < root.childCount; i++)
|
|||
|
{
|
|||
|
var child = root.GetChild(i);
|
|||
|
if (child.name.Trim() == name)
|
|||
|
{
|
|||
|
return child;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
//获取美术制作的Unity场景
|
|||
|
public Transform GetUnitySceneRoot()
|
|||
|
{
|
|||
|
if (_unitySceneRoot == null)
|
|||
|
{
|
|||
|
var root = UnityUtils.FindSceneRoot("SceneRoot");
|
|||
|
if (root != null)
|
|||
|
{
|
|||
|
_unitySceneRoot = root.transform;
|
|||
|
}
|
|||
|
}
|
|||
|
return _unitySceneRoot;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//测试代码
|
|||
|
public static void PreLoadSceneData(int id, String name, String levelName, String pathSuffix = null, String mapInfoSuffix = null)
|
|||
|
{
|
|||
|
GameCenter.GameSceneSystem.ReSetPreLoadScene();
|
|||
|
GameScene scene = new GameScene();
|
|||
|
scene.PreLoadData(id, name, levelName, pathSuffix, mapInfoSuffix);
|
|||
|
GameCenter.GameSceneSystem.SetPreLoadScene(scene);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|