源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

2528 wiersze
70 KiB

require("game.scene.sceneobj.SceneEffect")
require("game.scene.sceneobj.AlphaObj")
MapView = MapView or BaseClass(BaseController)
local MapView = MapView
local lua_resM = lua_resM
local string_find = string.find
local Material_New = Material.New
local math_floor = math.floor
local GameMath_GetDistance = GameMath.GetDistance
MapView.DefaultMapRes = 1001
MapView.NoAreaLoadEffect =
{
-- ["scene_tiaoyue"] = true,
["effect_gate_001"] = true,
}
MapView.NoLoadModel =
{
-- ["scene_tiaoyue"] = true,
["XSCCZ_TT03_05"] = true,
}
MapView.CustomEffect = {
[1001] = {name = "1001effect", customEffect = true, layer = 1, x = 0, y = 0, z = 0, bound = {off_x = 0, off_y = 0,off_z=0, size_x = 50, size_y = 50,size_z = 50}, speed = 1, euler_x = 0, euler_y = 0, euler_z = 0, effectScale_x = 1, effectScale_y = 1, effectScale_z = 1, level = 1},
[1003] = {name = "1003effect", customEffect = true, layer = 1, x = 0, y = 0, z = 0, bound = {off_x = 0, off_y = 0,off_z=0, size_x = 50, size_y = 50,size_z = 50}, speed = 1, euler_x = 0, euler_y = 0, euler_z = 0, effectScale_x = 1, effectScale_y = 1, effectScale_z = 1, level = 1},
[1005] = {name = "1005_effect_1", customEffect = true, layer = 1, x = 0, y = 0, z = 0, bound = {off_x = 0, off_y = 0,off_z=0, size_x = 50, size_y = 50,size_z = 50}, speed = 1, euler_x = 0, euler_y = 0, euler_z = 0, effectScale_x = 1, effectScale_y = 1, effectScale_z = 1, level = 1},
}
MapView.CustomEffectBox =
{
-- ["scene_fountain01"] = 1000,
-- ["xsc_shui_worldwaterdark"] = 900000,
-- ["scene1004_worldwater"] = 900000,
-- ["scene1004_poolwater"] = 900000,
-- ["scene1002worldwater"] = 900000,
-- ["shamo_shui_1_2"] = 900000,
-- ["shamo_shui_1_1"] = 900000,
}
MapView.LoadBigScene =
{
--[1000] = true,
--[1002] = true,
--[1003] = true,
--[1004] = true,
--[1005] = true,
--[1006] = true,
--[5801] = true,
}
MapView.FullScreenEffect =
{
-- name = "1000effect", layer = 1, x = 0, y = 0,z = 0,bound = {off_x = 0, off_y = 0,off_z=0, size_x = 30000, size_y = 30000,size_z = 30000}, speed = 1, euler_x = 0, euler_y = 0, euler_z = 0, effectScale_x =1, effectScale_y = 1, effectScale_z = 1, level = 1,
}
MapView.WaveList = {
-- ["screenwave"] = false,
-- ["screenwave3"] = false,
-- ["haidi_g11_2"] = false,
}
MapView.MustAreaLoadEffect =
{
-- ["scene_zudangmen"] = true
}
--不使用模型合批的地图
MapView.NoCombineModel =
{
-- [5801] = true,
}
MapView.HideEffectScene =
{
-- [6610] = {
-- ["shamo_shui_1_1"] = true,
-- ["shamo_shui_1_2"] = true,
-- ["scene_firebig01"] = true,
-- ["scene_firebig01 (1)"] = true,
-- ["scene_waterfall01"] = true,
-- ["scene_sunshine04 (4)"] = true,
-- },
-- [6611] = {
-- ["shamo_shui_1_1"] = true,
-- ["shamo_shui_1_2"] = true,
-- ["scene_firebig01"] = true,
-- ["scene_firebig01 (1)"] = true,
-- ["scene_waterfall01"] = true,
-- ["scene_sunshine04 (4)"] = true,
-- },
-- [6612] = {
-- ["shamo_shui_1_1"] = true,
-- ["shamo_shui_1_2"] = true,
-- ["scene_firebig01"] = true,
-- ["scene_firebig01 (1)"] = true,
-- ["scene_waterfall01"] = true,
-- ["scene_sunshine04 (4)"] = true,
-- },
-- [6613] = {
-- ["shamo_shui_1_1"] = true,
-- ["shamo_shui_1_2"] = true,
-- ["scene_firebig01"] = true,
-- ["scene_firebig01 (1)"] = true,
-- ["scene_waterfall01"] = true,
-- ["scene_sunshine04 (4)"] = true,
-- },
}
--全加载地图
MapView.AllLoadScene = {
[1001] = true,
}
--不使用动态剔除的场景
MapView.NoDisibleLoadScene = {
-- [1001] = true,
}
MapView.EnterSceneLoad = {
-- [1001] = true,
-- [1002] = true,
-- [1006] = true,
-- [1008] = true,
-- [1009] = true,
}
MapView.FindWayVector2One = Vector2(0,0)
MapView.FindWayVector2Second = Vector2(0,0)
function MapView:__init()
MapView.Instance = self
self.mapLoaded = false
self.curMapData = nil
self.async_load_map_obj = nil
self.effect_list = {}
self.move_obj_list = {}
self.specialModel_list = {}
self.load_prefab_temp_target = {}
self.preload_prefab_temp_target = {}
self.preload_scene_id = nil
self.model_list = {}
self.area_load_mode = true
self.load_model_count = nil
self.enter_scene_want_load_count = 0
self.alpha_model_list = {}
self.material_obj_list = {}
self.material_ab_list = {}
self.last_cache_model_check_time = 0
self.model_cache_map = {}
self.model_id_res_map = {}
self.open_model_cache_state = true
self.open_abres_immediately_delete_mode = false
self.combine_mini_model = {}
self.model_root_map = {}
self.model_local_state = {}
self.combine_model_state = false
self.min_combine_count = 5
self.timeout_enter_scene = false
self.regiest_model_new_mode = true
self.open_big_scene_mode = false
self.have_combine_model = {}
self.open_dynamic_visible_model = false
self.cache_effect_obj = {}
self.cache_effect_mode = false
self.zone_height = {}
self.zone_block = {}
self.zone_type = {}
self.area_type_cache = {}
self.has_water_effect = {}
if SystemRuntimePlatform.IsIphone() then
self.open_model_cache_state = false
self.open_abres_immediately_delete_mode = true
end
if tonumber(AppConst.EnglineVer) > 70 then
mapMgr.logicWidth = SceneObj.LogicRealRatio.x
mapMgr.logicHeight = SceneObj.LogicRealRatio.y
end
local account_change = function()
self:ForceChangeMap(true)
end
local role_change = function()
self:ForceChangeMap(false)
end
GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT, account_change)
GlobalEventSystem:Bind(EventName.CHANGE_ROLE, role_change)
local timeout_enter_scene = function()
self.timeout_enter_scene = true
SapManager.Instance:WaitLoadTerrainFinish(false)
end
GlobalEventSystem:Bind(EventName.TIMEOUT_ENTER_SCENE,timeout_enter_scene)
local func = function()
local data = {}
local effect_count = 0
for k,v in pairs(self.effect_list) do
effect_count = effect_count + 1
end
local model_count = 0
for k,v in pairs(self.model_list) do
model_count = model_count + 1
end
local model_cache_map_count = 0
for k,v in pairs(self.model_cache_map) do
model_cache_map_count = model_cache_map_count + 1
end
data.effect_count = effect_count
data.model_count = model_count
data.model_cache_map_count = model_cache_map_count
GlobalEventSystem:Fire(EventName.SENT_MODULE_DEBUG_DATA,"mapview", data)
end
GlobalEventSystem:Bind(EventName.CHECK_MODULE_DEBUG_DATA,func)
local callfunc = function(module_name,func)
self.set_root_visible_data_tab = self.set_root_visible_data_tab or {
["mapview@showbuhongpei"] = {node_name = "buhongpei", bool = true},
["mapview@hidebuhongpei"] = {node_name = "buhongpei", bool = false},
["mapview@showmodelcom"] = {node_name = "model_com_root", bool = true},
["mapview@hidemodelcom"] = {node_name = "model_com_root", bool = false},
["mapview@showsplitmodel"] = {node_name = "splitmodel", bool = true},
["mapview@hidesplitmodel"] = {node_name = "splitmodel", bool = false},
["mapview@showdongzuo"] = {node_name = "dongzuo", bool = true},
["mapview@hidedongzuo"] = {node_name = "dongzuo", bool = false},
["mapview@showway"] = {node_name = "xunlu", bool = true},
["mapview@hideway"] = {node_name = "xunlu", bool = false},
["mapview@showterrain"] = {node_name = "special", bool = true},
["mapview@hideterrain"] = {node_name = "special", bool = false},
["mapview@showshui"] = {node_name = "shui", bool = true},
["mapview@hideshui"] = {node_name = "shui", bool = false},
["mapview@showfog"] = {node_name = "fog", bool = true},
["mapview@hidefog"] = {node_name = "fog", bool = false},
["mapview@showaction"] = {node_name = "action", bool = true},
["mapview@hideaction"] = {node_name = "action", bool = false},
["mapview@showwater"] = {node_name = "water", bool = true},
["mapview@hidewater"] = {node_name = "water", bool = false},
["mapview@showspecial"] = {node_name = "special", bool = true},
["mapview@hidespecial"] = {node_name = "special", bool = false},
}
if module_name and func and self.set_root_visible_data_tab[module_name.."@"..func] then
--简单的节点修改就直接在上面添加走这里,免得看起来太累赘
local temp = self.set_root_visible_data_tab[module_name.."@"..func]
self.set_root_show_call(GameObject.Find(temp.node_name) or self[temp.node_name],temp.bool)
elseif module_name == "mapview" and func == "clear" then
self:ClearData()
elseif module_name == "mapview" and func == "combine" then
self:CombineModel()
elseif module_name == "mapview" and func == "hidescene" then
self.model_root = GameObject.Find("model")
self.set_root_show_call(self.model_root,false)
if self.model_parent and self.model_parent ~= GameObject.Find("root").transform then
self.set_root_show_call(self.model_parent,false)
end
elseif module_name == "mapview" and func == "showscene" then
self.set_root_show_call(self.model_root,true)
if self.model_parent and self.model_parent ~= GameObject.Find("root").transform then
self.set_root_show_call(self.model_parent,true)
end
elseif module_name == "mapview" and func == "hidesky" then
self.sky_root = GameObject.Find("Sky")
self.sky_root_2 = GameObject.Find("sky")
self.set_root_show_call(self.sky_root,false)
self.set_root_show_call(self.sky_root_2,false)
elseif module_name == "mapview" and func == "showsky" then
self.set_root_show_call(self.sky_root,true)
self.set_root_show_call(self.sky_root_2,true)
elseif module_name == "mapview" and func == "hiderootall" then
self:SetAllRootShow(false)
elseif module_name == "mapview" and func == "showrootall" then
self:SetAllRootShow(true)
end
end
self.rootshowcall = callfunc
self.set_root_show_call = function( root,bool )
if not IsNull(root) and not IsNull(root.gameObject) then
root.gameObject:SetActive(bool)
end
end
GlobalEventSystem:Bind(EventName.DO_MODULE_DEBUG_FUNC,callfunc)
end
function MapView:SetAllRootShow( bool )
if not self.rootshowcall or not self.set_root_show_call then
return
end
if bool then
if SceneManager.Instance:GetSceneId() ~= 1001 then
self.rootshowcall("mapview","showscene")
end
self.rootshowcall("mapview","showsky")
else
if SceneManager.Instance:GetSceneId() ~= 1001 then
self.rootshowcall("mapview","hidescene")
end
self.rootshowcall("mapview","hidesky")
end
-------------------------
if self.set_root_visible_data_tab then
for k,v in pairs(self.set_root_visible_data_tab) do
if string.find(k, bool and "show" or "hide") then
local obj = self[v.node_name]
if IsNull(obj) then
obj = GameObject.Find(v.node_name)
if not IsNull(obj) then
self[v.node_name] = obj
end
end
self.set_root_show_call(obj , bool)
end
end
end
end
function MapView:CheckCombineModel()
self.support_model_combine = false
if tonumber(AppConst.EnglineVer) >= 74 and self:CheckIOSCombine() then
if self.curResId then
local no_combine = MapView.NoCombineModel[tonumber(self.curResId)]
if not no_combine then
self.support_model_combine = true
end
else
self.support_model_combine = true
end
end
if not self.regiest_model_new_mode then
self.support_model_combine = false
end
end
function MapView:CheckIOSCombine()
if SystemRuntimePlatform.IsIphone() then
if RoleManager.Instance.mainRoleInfo.level == 1 and SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then
return true
else
return false
end
else
return true
end
end
function MapView:getInstance()
if MapView.Instance == nil then
MapView.New()
end
return MapView.Instance
end
function MapView:GetResID( is_minimap )
if is_minimap then
return Config.ConfigMiniMap[tonumber(self.curMapId)] or self.curResId
end
return self.curResId
end
function MapView:GetResIDByScene( scene, func )
local scene_id = tonumber(scene)
local res_id = Config.ConfigMiniMap[scene_id]
if res_id then
func(res_id)
return
end
local load_call_back = function(objs)
if objs and objs[0] then
local txt = objs[0]
mapMgr:LoadOtherMap(scene_id,txt)
local mapdata = mapMgr:MapByScene(scene_id)
func(mapdata.resId)
if scene_id ~= self.curMapId then
mapMgr:ClearMap(scene_id)
end
end
end
lua_resM:loadTextAsset(self.load_prefab_temp_target,"mapdata" .. scene_id,tonumber(scene_id),load_call_back,ASSETS_LEVEL.HIGHT)
end
function MapView:GetMapSize()
if self.curMapData then
return co.TableXY(self.curMapData.mapWidth,self.curMapData.mapHeight)
else
return co.TableXY(0,0)
end
end
function MapView:Update( cam_pos )
--print("-------Update-------")
for index,obj in pairs(self.move_obj_list) do
obj:Update()
end
self:CheckOuttimeCacheMode()
end
function MapView:Load( mapId, load_map_func, load_effect_finish )
print("tanar: [MapView 420]=> Load: ",mapId)
self.wait_clear_map = false
local call_out_succeed = false
local load_terrain_succeed = function()
if call_out_succeed then
return
end
self:DeletePreLoadMap()
self.mapLoaded = true
call_out_succeed = true
load_map_func()
self:ProcessSpecialModel()
self:ProcessSkyModel()
if not self.curResId then
return
end
self.area_load_mode = true
-- if MapView.NoDisibleLoadScene[tonumber(self.curResId)] then
-- self.open_dynamic_visible_model = false
-- else
-- self.open_dynamic_visible_model = true
-- end
-- if SceneManager.Instance:IsStarFightScene() then
-- self.open_dynamic_visible_model = false
-- end
if not SystemRuntimePlatform.IsIphone() then
--使用全加载模式
self.open_dynamic_visible_model = false
end
ShaderTools.ClearMaterialData()
self:CheckCombineMiniModel()
self:RegiestEffectList()
--模型创建方式
-- if not MapView.EnterSceneLoad[tonumber(self.curResId)] then
-- if self.regiest_model_new_mode then
-- self:RegiestModelListNew()
-- else
-- self:RegiestModelList()
-- end
-- end
self:RegiestMoveObjList()
self:RegiestAlphaModelList()
self:RegisterElevatorModelList()
load_effect_finish(1)
--[[
if not self.load_model_count or self.enter_scene_want_load_count == 0 then
load_effect_finish(1)
else
self.load_effect_finish_func = load_effect_finish
local timeout_finfish = function()
if self.load_effect_finish_func then
self.load_effect_finish_func(1)
self.load_effect_finish_func = nil
self.timeout_enter_scene = true
SapManager.Instance:WaitLoadTerrainFinish(false)
end
end
self.check_load_model_event = setTimeout(timeout_finfish,25)
end
]]
-- if not G_DEBUG_MODE then
-- self:LoadSpiltModelList() --全加载
self:RegiestModelListNew() --SAP
-- end
SapManager:getInstance():ForceCheckFarModelLoad()
--新手场景特殊处理
if self.curResId and self.curResId == 1001 then
Shader.SetGlobalFloat("_GlobalSceneAlpha", 1.0)
end
end
local load_finish = function( same_scene )
-- if G_DEBUG_MODE then
-- load_terrain_succeed()
-- return
-- end
-- if Config.ConfigSceneWaveModel[self.curResId] then
-- self:LoadWaterMaterial()
-- end
local load_scene_call_back
load_scene_call_back = function(objs)
if mapId ~= self.curMapId then
return
end
if objs then
self.async_load_map_obj = UnitySceneManager.LoadSceneAsync(self:GetLoadSceneRes(tostring(self.curResId)))
self.async_load_map_obj.allowSceneActivation = true
local load_into = function()
if self.check_load_event then
GlobalTimerQuest:CancelQuest(self.check_load_event)
self.check_load_event = nil
end
if self.async_load_map_obj then
self.async_load_map_obj = nil
end
load_terrain_succeed()
end
local try_load_time = 0
local check_load = function()
if self.async_load_map_obj then
local progress = self.async_load_map_obj.progress
--尝试加载资源去触发场景加载回调,别问
if progress > 0.88 and Time.time - try_load_time > 1 then
try_load_time = Time.time
GlobalEventSystem:Fire(EventName.OPEN_WORLD_LEVEL_VIEW)
GlobalEventSystem:Fire(EventName.CLOSE_WORLD_LEVEL_VIEW)
end
local max_progress = SystemRuntimePlatform.IsWindowsEditor() and 0.89 or 1
if progress >= max_progress then
load_into()
elseif self.open_big_scene_mode then
load_effect_finish(progress)
end
end
end
if self.check_load_event then
GlobalTimerQuest:CancelQuest(self.check_load_event)
end
self.check_load_event = GlobalTimerQuest:AddPeriodQuest(check_load, 0.05, -1)
local time_out = function()
self.init_terrain_timeout_handle = nil
if not call_out_succeed then
self.load_terrain_timeout = true
end
print("tanar: MapView [525] =========== ")
load_into()
end
self.init_terrain_timeout_handle = setTimeout(time_out,15)
else
local load_again = function()
lua_resM:loadPrefabs(self.load_prefab_temp_target,"terrain_scene_" .. self:GetLoadSceneRes(self.curResId),{}, load_scene_call_back, false, ASSETS_LEVEL.HIGHT)
end
setTimeout(load_again,0.3)
end
end
if not same_scene then
lua_resM:loadPrefabs(self.load_prefab_temp_target,"terrain_scene_" .. self:GetLoadSceneRes(self.curResId),{}, load_scene_call_back, false, ASSETS_LEVEL.HIGHT)
else
setTimeout(load_terrain_succeed,0.1)
end
local time_out = function()
self.load_terrain_timeout_handle = nil
if not call_out_succeed then
self.load_terrain_timeout = true
end
load_terrain_succeed()
end
self.load_terrain_timeout_handle = setTimeout(time_out,25)
end
self:LoadMapData(mapId, load_finish)
end
function MapView:LoadMapData( mapId, load_finish)
self.curMapData = nil
local load_call_back
load_call_back = function(objs)
if objs and objs[0] then
local txt = objs[0]
mapMgr:LoadMap(mapId,txt)
local same_scene = false
local newCurMapData = mapMgr:CurMap()
if self.curResId == newCurMapData.resId then
same_scene = true
end
if self.curResId then
self:ClearData(same_scene)
end
self.curResId = newCurMapData.resId
self.curMapData = newCurMapData
self.curMapId = mapId
self:CheckCombineModel()
if self.scene_effect_container == nil then
self.scene_effect_container = UiFactory.createChild(panelMgr:GetParent("SceneContainer"), UIType.EmptyObject, "effect_container")
end
if load_finish then
load_finish(same_scene)
load_finish = nil
end
else
local loadagain = function()
lua_resM:loadTextAsset(self.load_prefab_temp_target,"mapdata" .. mapId,tonumber(mapId),load_call_back,ASSETS_LEVEL.HIGHT)
end
setTimeout(loadagain,1)
end
end
lua_resM:loadTextAsset(self.load_prefab_temp_target,"mapdata" .. mapId,tonumber(mapId),load_call_back,ASSETS_LEVEL.HIGHT)
local check_load_finish = function()
if load_finish then
GameError.Instance:SendErrorToPHP("load map data error when want to change scene " .. mapId)
end
end
self.load_mapdata_handle = setTimeout(check_load_finish,15)
end
--- area_type:AreaDataIndex
function MapView:SetDynamicArea(area_id,area_type)
if self.curMapData then
--动态区域改变清理缓存
self.zone_block = {}
self.zone_type = {}
self.curMapData:SetDynamicArea(area_id,area_type)
end
end
function MapView:GetSceneCenterPos()
if not self.curMapData then
Debugger.LogWarning("GetSceneCenterPos when map not load")
return Vector3(0,0,0)
end
return Vector3(self.curMapData.mapWidth/MainCamera.PixelsToUnits/2, self.curMapData.mapHeight/MainCamera.PixelsToUnits/2, 0)
end
function MapView:DetectFirstUnblockPoint(pos,dir,max_dist)
if not self.curMapData then
print(debug.traceback())
Debugger.LogWarning("DetectFirstUnblockPoint when map not load")
return nil
end
dir.y = -dir.y
local p = self.curMapData:DetectFirstUnblockPoint(pos,dir,max_dist)
return p
end
function MapView:FindWay(pos1,pos2,range)
if not self.curMapData then
print(debug.traceback())
Debugger.LogWarning("FindWay when map not load")
return nil
end
MapView.FindWayVector2One.x = pos1.x
MapView.FindWayVector2One.y = pos1.y
MapView.FindWayVector2Second.x = pos2.x
MapView.FindWayVector2Second.y = pos2.y
local objs = self.curMapData:FindWay(MapView.FindWayVector2One,MapView.FindWayVector2Second,range)
if objs then
local ret = {}
for i=1,objs.Length do
local ret_obj = co.TableXY(objs[objs.Length-i].x,objs[objs.Length-i].y)
table.insert(ret,ret_obj)
end
return ret
end
return objs
end
function MapView:IsStraightLine(pos1,pos2)
if not self.curMapData then
print(debug.traceback())
-- Debugger.LogWarning("IsStraightLine when map not load")
return false
end
return self.curMapData:IsStraightLine(pos1,pos2)
end
function MapView:DetectLastUnblockPoint(pos,dir,dist,jump_state)
if not self.curMapData then
print(debug.traceback())
-- Debugger.LogWarning("DetectLastUnblockPoint when map not load")
return pos
end
--dir.y = -dir.y
jump_state = false
local point = nil
point = self.curMapData:DetectLastUnblockPoint(pos,dir,dist,jump_state)
return point
end
function MapView:GetZoneHeight(x, y)
if not self.curMapData then
return -1
end
x = math_floor(x)
y = math_floor(y)
local index = x .. "-" .. y
local cache = self.zone_height[index]
if cache then
return cache
end
local height = self.curMapData:GetZoneHeight(x+1,y+1)/100
self.zone_height[index] = height
return height
end
function MapView:IsBlockXY(x, y)
if not self.curMapData then
return nil
end
x = math_floor(x)
y = math_floor(y)
local index = x .. "-" .. y
local cache = self.zone_block[index]
if cache ~= nil then
return cache
end
local block = self.curMapData:IsBlock(x,y,false)
self.zone_block[index] = block
return block
end
-- AreaDataIndex:area_type
function MapView:IsAreaType(x, y, area_type)
if not self.curMapData then
return false
end
-- if area_type == AreaDataIndex.JumpType then
-- return false
-- end
x = math_floor(x)
y = math_floor(y)
local index = x .. "-" .. y .. "-" .. area_type
local cache = self.zone_type[index]
if cache ~= nil then
return cache
end
local result = false
local cur_type = self.curMapData:GetAreaType(x,y)
if bit.band(cur_type,area_type) ~= 0 then
result = true
end
self.zone_type[index] = result
return result
end
function MapView:GetAreaType(x, y)
if not self.curMapData then
return
end
x = math_floor(x)
y = math_floor(y)
local index = x .. "-" .. y
local _type = self.area_type_cache[index]
if _type == nil then
_type = self.curMapData:GetAreaType(x,y)
self.area_type_cache[index] = _type
end
return _type
end
function MapView:PreLoadMapRes( scene_id, callback )
if not scene_id then
return
end
local func = function(res_id)
if tonumber(res_id) == tonumber(self.curResId) then
--前后场景地图资源一样不需走预加载
if callback then
callback()
end
return
end
self.preload_scene_id = res_id
lua_resM:loadPrefabs(self.preload_prefab_temp_target,"terrain_scene_" .. self:GetLoadSceneRes(res_id),{}, callback, false, ASSETS_LEVEL.HIGHT)
end
self:GetResIDByScene( scene_id, func )
end
function MapView:DeletePreLoadMap()
if self.preload_scene_id then
lua_resM:clearReference(self.preload_prefab_temp_target)
self.preload_scene_id = nil
end
end
function MapView:ClearData(same_scene)
self.action_obj_list = {}
-- self:CancelFarModelTimer()
self:UnRegiestEffectList()
self:UnRegiestSpecialModelList()
self:UnRegiestModelList()
self:UnRegiestMoveObjList()
self:UnRegiestAlphaModelList()
self:UnRegiestElevatorModelList()
self.mapLoaded = false
for k,effect in pairs(self.effect_list) do
effect:DeleteMe()
end
for k,v in pairs(self.specialModel_list) do
v:DeleteMe()
end
for k,obj in pairs(self.move_obj_list) do
obj:DeleteMe()
end
for k,v in pairs(MapView.WaveList) do
MapView.WaveList[k] = false
end
self.effect_last_show_state = nil
MainCamera.Instance:DestoryScreenEffectCamere()
if not same_scene then
lua_resM:clearReference(self.load_prefab_temp_target)
self.material_ab_list = {}
for k,cache_list in ipairs(self.model_cache_map) do
for index,info in ipairs(cache_list) do
destroy(info.obj)
end
end
self.model_cache_map = {}
for index,obj in ipairs(self.material_obj_list) do
destroy(obj)
end
self.material_obj_list = {}
for index,abname in ipairs(self.material_ab_list) do
resMgr:UnloadAssetBundle(abname,true,1)
end
for index,obj in pairs(self.model_list) do
destroy(obj)
end
for index,obj in pairs(self.model_root_map) do
destroy(obj)
end
self.model_list = {}
self.model_root_map = {}
self.combine_mini_model = {}
self.combine_model_state = false
self.open_big_scene_mode = false
self.model_parent = nil
self.have_combine_model = {}
if self.model_com_root then
destroy(self.model_com_root)
self.model_com_root = nil
end
local node = GameObject.Find("dongzuo")
if node then
node:SetActive(false)
end
end
if self.curMapId then
mapMgr:ClearMap(self.curMapId)
end
if self.load_mapdata_handle then
GlobalTimerQuest:CancelQuest(self.load_mapdata_handle)
self.load_mapdata_handle = nil
end
if self.check_load_model_event then
GlobalTimerQuest:CancelQuest(self.check_load_model_event)
self.check_load_model_event = nil
end
if self.bind_mainrole_move_event then
GlobalTimerQuest:CancelQuest(self.bind_mainrole_move_event)
self.bind_mainrole_move_event = nil
end
self.zone_block = {}
self.zone_height = {}
self.zone_type = {}
self.area_type_cache = {}
self.effect_list = {}
self.specialModel_list = {}
self.move_obj_list = {}
self.model_id_res_map = {}
self.has_water_effect = {}
self.load_model_count = nil
self.enter_scene_want_load_count = 0
self.timeout_enter_scene = false
self.load_terrain_timeout = false
if self.load_terrain_timeout_handle then
GlobalTimerQuest:CancelQuest(self.load_terrain_timeout_handle)
self.load_terrain_timeout_handle = nil
end
if self.init_terrain_timeout_handle then
GlobalTimerQuest:CancelQuest(self.init_terrain_timeout_handle)
self.init_terrain_timeout_handle = nil
end
self.cache_effect_obj = {}
if self.scene_effect_container then
destroy(self.scene_effect_container)
self.scene_effect_container = nil
end
if self.load_terrain_force_check_handle then
TimerQuest.CancelQuest(GlobalTimerQuest, self.load_terrain_force_check_handle)
self.load_terrain_force_check_handle = nil
end
self.regiest_model_finish = false
end
--全屏特效显示隐藏
function MapView:UpdateFullScreenEffect( posx, posy )
if IsTableEmpty(self.effect_list) then
return
end
local cur_map_id = tonumber(self.curResId)
--目前只有1001需要
if cur_map_id and cur_map_id == 1001 then
local hide_max_x, hide_max_y = 0, 29170 --超过这个边界需要隐藏
local cur_show_state = true
if (hide_max_x > 0 and posx > hide_max_x) or (hide_max_y > 0 and posy > hide_max_y) or self:IsAreaType(posx/SceneObj.LogicRealRatio.x, posy/SceneObj.LogicRealRatio.y, AreaDataIndex.IndoorType) then
cur_show_state = false
end
if self.effect_last_show_state ~= nil and self.effect_last_show_state == cur_show_state then
return
end
self.effect_last_show_state = cur_show_state
for k,v in pairs(self.effect_list) do
if v.fullScreen or v.customEffect then
v:SetActive(cur_show_state)
end
end
end
end
function MapView:RegiestEffectList()
local scene_effect = Config.ConfigSceneEffect.EffectInfo[tonumber(self.curMapId)]
local area_load = true
if scene_effect then
-- if SystemRuntimePlatform.IsIphone() then
-- area_load = true
-- end
for effect_id,effect in pairs(scene_effect) do
if area_load and not MapView.NoAreaLoadEffect[effect.name] then
if not effect.disabled then
if effect.fullScreen then
self.effect_list[effect_id] = SceneEffect.New(effect,MainCamera:getInstance().camera_gameObject,tonumber(self.curMapId))
self:RegiestMoveEvent()
else
effect.id = effect_id
local obj =
{
id = effect_id,
type = SapManager.ObjType.Effect,
pos = co.TableXYZ(effect.x,effect.z,effect.y),
bound_offset = co.TableXYZ(effect.bound.off_x * effect.effectScale_x,effect.bound.off_z * effect.effectScale_z, effect.bound.off_y * effect.effectScale_y),
size = co.TableXY(effect.bound.size_x * effect.effectScale_x,effect.bound.size_z * effect.effectScale_z,effect.bound.size_y * effect.effectScale_y),
data = {id = effect_id,obj = effect},
}
local custom_size = MapView.CustomEffectBox[effect.name]
if custom_size then
obj.size = co.TableXY(custom_size,custom_size,custom_size)
end
if self.area_load_mode then
SapManager:getInstance():RegisterObj(obj)
else
self:CreateEffect(obj.data)
end
end
end
end
end
end
local loadback = function(transform)
local hide_effect = MapView.HideEffectScene[self.curMapId]
if hide_effect then
for effect_name,state in pairs(hide_effect) do
local effect = transform:Find(effect_name)
if effect then
effect.gameObject:SetActive(false)
end
end
end
if not self.cache_effect_mode then
SapManager.Instance:WaitLoadParticleFinish(false)
return
end
if MapView.NoDisibleLoadScene[tonumber(self.curResId)] then
SapManager.Instance:WaitLoadParticleFinish(false)
return
end
if scene_effect and not IsNull(transform) then
for effect_id,effect in pairs(scene_effect) do
if not effect.obj_name then
--旧版配置不支持
SapManager.Instance:WaitLoadParticleFinish(false)
return
end
effect.id = effect_id
local obj =
{
id = effect_id,
type = SapManager.ObjType.CacheEffect,
pos = co.TableXYZ(effect.x,effect.z,effect.y),
bound_offset = co.TableXYZ(effect.bound.off_x * effect.effectScale_x,effect.bound.off_z * effect.effectScale_z, effect.bound.off_y * effect.effectScale_y),
size = co.TableXY(effect.bound.size_x * effect.effectScale_x,effect.bound.size_z * effect.effectScale_z,effect.bound.size_y * effect.effectScale_y),
data = {id = effect_id,obj = effect},
}
local custom_size = MapView.CustomEffectBox[effect.name]
if custom_size then
obj.size = co.TableXY(custom_size,custom_size,custom_size)
end
SapManager:getInstance():RegisterObj(obj)
end
local length = transform.childCount
if length > 0 then
for i = 0,length -1 do
local trans = transform:GetChild(i)
if trans and trans.gameObject then
trans.gameObject:SetActive(false)
self.cache_effect_obj[trans.name] = trans.gameObject
end
end
end
end
local next_frame = function()
SapManager.Instance:WaitLoadParticleFinish(false)
end
setTimeout(next_frame,0.01)
end
if MapView.CustomEffect[tonumber(self.curResId)] then
local effect_data = MapView.CustomEffect[tonumber(self.curResId)]
local data = {
id = self.curMapId,
obj = effect_data,
}
if self.cache_effect_mode then
SapManager.Instance:WaitLoadParticleFinish(true)
end
self.effect_list[data.id] = SceneEffect.New(data.obj,self.scene_effect_container,tonumber(self.curMapId),loadback)
self.effect_last_show_state = nil
end
end
function MapView:CreateCacheEffect( data )
if data and data.obj then
local name = data.obj.obj_name
local game_object = self.cache_effect_obj[name]
if game_object then
game_object:SetActive(true)
end
end
end
function MapView:DeleteCacheEffect( name )
if name then
local game_object = self.cache_effect_obj[name]
if game_object then
game_object:SetActive(false)
end
end
end
function MapView:UnRegiestEffectList()
if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
-- return
end
if self.mapLoaded and self.area_load_mode then
local scene_effect = Config.ConfigSceneEffect.EffectInfo[tonumber(self.curMapId)]
if scene_effect then
for effect_id,effect in pairs(scene_effect) do
SapManager:getInstance():UnRegisterObj(SapManager.ObjType.Effect,effect_id)
end
end
end
end
function MapView:CreateEffect( data )
if not self.mapLoaded then
LogError("want to create effect but map not load finfish, id = " .. data.id )
return
end
if self.scene_effect_container then
self.effect_list[data.id] = SceneEffect.New(data.obj,self.scene_effect_container,tonumber(self.curMapId))
end
end
function MapView:RefreshEffect()
if not self.mapLoaded then --特效设置为true就不走画质和帧率的再次刷新
return
end
local scene_effect = Config.ConfigSceneEffect.EffectInfo[tonumber(self.curMapId)]
if not scene_effect then
return
end
local settingLv = lua_settingM:GetEffectLevel()
for k,v in pairs(self.effect_list) do
local config = scene_effect[k] or MapView.FullScreenEffect
if config then
if config.level <= settingLv then
v:SetActive(true)
else
v:SetActive(false)
end
end
end
end
function MapView:DeleteEffect( obj_id )
local effect = self.effect_list[obj_id]
if effect then
effect:DeleteMe()
self.effect_list[obj_id] = nil
end
end
function MapView:RegiestSpecialModelList()
if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
return
end
local scene_effect = Config.ConfigSceneSpecialModel.SpecialModelInfo[tonumber(self.curMapId)]
if scene_effect then
for effect_id,effect in pairs(scene_effect) do
effect.id = effect_id
local obj =
{
id = effect_id,
type = SapManager.ObjType.SpecialModel,
pos = co.TableXYZ(effect.x,effect.z,effect.y),
bound_offset = co.TableXYZ(effect.bound.off_x * effect.effectScale_x,effect.bound.off_z * effect.effectScale_z, effect.bound.off_y * effect.effectScale_y),
size = co.TableXY(effect.bound.size_x * effect.effectScale_x,effect.bound.size_z * effect.effectScale_z,effect.bound.size_y * effect.effectScale_y),
data = {id = effect_id,obj = effect},
}
local custom_size = MapView.CustomEffectBox[effect.name]
if custom_size then
obj.size = co.TableXY(custom_size,custom_size,custom_size)
end
if self.area_load_mode then
SapManager:getInstance():RegisterObj(obj)
else
self:CreateEffect(obj.data)
end
end
end
end
function MapView:UnRegiestSpecialModelList()
if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
return
end
if self.mapLoaded and self.area_load_mode then
local scene_effect = Config.ConfigSceneSpecialModel.SpecialModelInfo[tonumber(self.curMapId)]
if scene_effect then
for effect_id,effect in pairs(scene_effect) do
SapManager:getInstance():UnRegisterObj(SapManager.ObjType.SpecialModel,effect_id)
end
end
end
end
function MapView:CreateSpecialModel( data )
if not self.mapLoaded then
LogError("want to create effect but map not load finfish, id = " .. data.id )
return
end
if self.scene_effect_container then
self.specialModel_list[data.id] = SceneEffect.New(data.obj,self.scene_effect_container,tonumber(self.curMapId))
end
end
function MapView:DeleteSpecialModel( obj_id )
local effect = self.specialModel_list[obj_id]
if effect then
effect:DeleteMe()
self.specialModel_list[obj_id] = nil
end
end
function MapView:RegiestMoveObjList()
local obj_config = Config.ConfigSceneMoveObj[self.curResId]
if obj_config then
for index, data in ipairs(obj_config) do
local pos = data.active_info.pos
local osize = data.active_info.size
local offset = data.active_info.offset
local modelobj =
{
id = index,
type = SapManager.ObjType.MoveObj,
pos = co.TableXYZ(pos.x* MainCamera.PixelsToUnits, pos.y* MainCamera.PixelsToUnits, pos.z* MainCamera.PixelsToUnits),
bound_offset = co.TableXYZ(offset.x* MainCamera.PixelsToUnits,offset.y* MainCamera.PixelsToUnits),
size = co.TableXY(osize.x * MainCamera.PixelsToUnits,osize.y * MainCamera.PixelsToUnits),
data = {id = index,obj = data},
}
SapManager:getInstance():RegisterObj(modelobj)
end
end
end
function MapView:UnRegiestMoveObjList()
local obj_config = Config.ConfigSceneMoveObj[self.curResId]
if obj_config then
for index, data in ipairs(obj_config) do
SapManager:getInstance():UnRegisterObj(SapManager.ObjType.MoveObj,index)
end
end
end
function MapView:CreateMoveObj( data )
local obj = MoveObj.New( data,self.curMapId,self.scene_effect_container )
obj:CreateModel()
if not self.move_obj_list[data.id] then
self.move_obj_list[data.id] = obj
else
LogError("want to create same moveobj id = " .. data.id )
end
end
function MapView:DeleteMoveObj( index )
local obj = self.move_obj_list[index]
if obj then
obj:DeleteMe()
obj = nil
end
self.move_obj_list[index] = nil
end
function MapView:RegiestModelList()
local model_root = GameObject.Find("splitmodel")
local model_config = Config["model" .. self.curResId]
if model_root and model_config then
self.model_parent = model_root.transform
SetGlobalPosition3D(self.model_parent,0, 0, 0)
SetLocalScale(self.model_parent,1,1,1)
self.model_parent.localEulerAngles = Vector3(0, 0, 0)
self.load_model_count = 0
for index, data in pairs(model_config) do
local info = {
id = index,
obj = data,
}
if not self.area_load_mode or self.combine_mini_model[data[1]] then
if not self.combine_model_state then
self:CreateModel(info,self.model_parent)
end
elseif self:IsLocalFile(data[1]) then
self:CreateModel(info,self.model_parent)
else
self:RegiestModel(info)
end
end
end
self.regiest_model_finish = true
end
function MapView:RegiestModel(info)
local data = info.obj
local index = info.id
local is_far = false
local pos_x = (data[3]) * MainCamera.PixelsToUnits
local pos_y = (data[5]) * MainCamera.PixelsToUnits
local pos_z = (data[4]) * MainCamera.PixelsToUnits
local max_size = math.max(math.max(data[15],data[17]),data[16]) * MainCamera.PixelsToUnits * 3
local bound_offset = co.TableXYZ(data[12]* MainCamera.PixelsToUnits,data[14]* MainCamera.PixelsToUnits, data[13]* MainCamera.PixelsToUnits)
--远景包围盒适配
local is_check_detail = false
local check_type = false
local offset = 0
if data[4] < -1 and max_size < 2000 then
is_check_detail = true
else
if Config.ConfigDetailMapViewCheckModel[self.curResId] then
if Config.ConfigDetailMapViewCheckModel[self.curResId][data[2]] then
is_check_detail = true
check_type = Config.ConfigDetailMapViewCheckModel[self.curResId][data[2]].type
end
end
end
if is_check_detail then
if check_type == 1 then
if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then --高端机采用更精确算法
pos_x = (data[3]) * MainCamera.PixelsToUnits
pos_y = (data[4]) * MainCamera.PixelsToUnits
pos_z = (data[5]) * MainCamera.PixelsToUnits
is_far = true
bound_offset = co.TableXYZ(data[12]* MainCamera.PixelsToUnits,data[13]* MainCamera.PixelsToUnits, data[14]* MainCamera.PixelsToUnits)
else
is_far = false
max_size = max_size * 3
bound_offset = co.TableXYZ(data[12]* MainCamera.PixelsToUnits,data[13]* MainCamera.PixelsToUnits, data[14]* MainCamera.PixelsToUnits + 2000)
end
elseif check_type == 2 then
is_far = false
max_size = max_size * 3
bound_offset = co.TableXYZ(data[12]* MainCamera.PixelsToUnits,data[13]* MainCamera.PixelsToUnits, data[14]* MainCamera.PixelsToUnits + 2000)
end
end
local modelobj =
{
id = index,
type = SapManager.ObjType.Model,
pos = co.TableXYZ(pos_x, pos_y, pos_z),
-- rot = Quaternion.Euler(data[6], data[7], data[8]), --这是一个四元数
bound_offset = bound_offset,
size = co.TableXYZ(max_size,max_size,max_size),
data = {id = index,obj = data},
is_far = is_far
}
SapManager:getInstance():RegisterObj(modelobj)
end
function MapView:RegiestModelListNew()
local model_root = GameObject.Find("splitmodel")
local model_config = Config["model" .. self.curResId]
if model_config then
--场景基础资源包加载超时失败,改成挂在通用根节点
if not model_root then
model_root = GameObject.Find("root")
end
self.model_parent = model_root.transform
SetGlobalPosition3D(self.model_parent,0, 0, 0)
SetLocalScale(self.model_parent,1,1,1)
self.model_parent.localEulerAngles = Vector3(0, 0, 0)
self.load_model_count = 0
SapManager.Instance:WaitLoadTerrainFinish(true)
local same_res_map = {}
for index, data in pairs(model_config) do
if not MapView.NoLoadModel[data[1]] then
local res = data[1]
if not same_res_map[res] then
same_res_map[res] = {}
end
table.insert(same_res_map[res],index)
end
end
for res,list in pairs(same_res_map) do
if not self.area_load_mode or self.combine_mini_model[res] then
if not self.combine_model_state or (self.combine_mini_model[res] and self.open_dynamic_visible_model) then
self:CreateModelList(res,list,model_config)
end
elseif self:IsLocalFile(res) then
self.combine_mini_model[res] = true
self:CreateModelList(res,list,model_config)
else
for key,index in pairs(list) do
local info = {
id = index,
obj = model_config[index],
}
self:RegiestModel(info)
end
end
end
end
self.regiest_model_finish = true
end
function MapView:CreateModelList(res,list,model_config)
self.enter_scene_want_load_count = self.enter_scene_want_load_count + 1
local cache_list = self.model_cache_map[res]
local map_res = self.curResId
local load_res = function( objs, cache )
if objs and ( cache or objs[0]) and self.mapLoaded then
if map_res ~= self.curResId then
if not cache and objs[0] then
destroy(objs[0])
end
return
end
for k,index in pairs(list) do
local last_model = self.model_list[index]
if not last_model then
if cache then
if #cache_list > 1 then
local info = table.remove(cache_list,#cache_list)
if info and not IsNull(info.obj) then
info.obj:SetActive(true)
self:InitObj( info.obj,nil,model_config[index],single_parent,index, res )
end
else
if cache_list[1] and not IsNull(cache_list[1].obj) then
cache_list[1].time = os.time()
cache_list[1].obj:SetActive(true)
self:InitObj( nil, cache_list[1].obj,model_config[index],single_parent,index, res )
cache_list[1].obj:SetActive(false)
end
end
else
self:InitObj( nil,objs[0],model_config[index],single_parent,index, res )
end
end
if self.open_dynamic_visible_model then
local info = {
id = index,
obj = model_config[index],
}
self:RegiestModel(info)
end
end
else
print("------load res error--------",res)
end
self.load_model_count = (self.load_model_count or 0) + 1
if self.support_model_combine then
self:CombineModelList(res,list)
end
local next_frame = function()
self:CheckTerrainLoadFinish()
end
if self.combine_model_state then
setTimeout(next_frame,0.01)
else
next_frame()
end
end
if cache_list then
if #cache_list > 0 then
load_res(true,true)
return
end
end
local ab_name = "terrain_prefab_" .. res
lua_resM:loadPrefabs(self.load_prefab_temp_target,ab_name,res, load_res, true, ASSETS_LEVEL.NORMAL)
end
function MapView:InitObj( cache_model,obj,data,parent,id,model_name )
local model = cache_model or newObject(obj)
model.name = data[2]
if parent then
model.transform:SetParent(parent)
end
SetLocalScale(model.transform, data[9], data[10], data[11])
model.transform.localEulerAngles = Vector3(data[6], data[7], data[8])
SetGlobalPosition3D(model.transform,data[3], data[5], data[4])
self:LoadModelLight(model,data)
self.model_list[id] = model
self.model_id_res_map[id] = model_name
self.model_local_state[data[1]] = true
end
function MapView:CombineModelList(res,list)
local single_parent = self:GetSingleParent(res)
for k,v in pairs(list) do
if not IsNull(self.model_list[v]) then
self.model_list[v].transform:SetParent(single_parent)
else
logWarn("CombineModelList Error:" .. res)
end
end
if self.combine_mini_model[res] and not self.combine_model_state and self.support_model_combine then
local root = self.model_root_map[res]
if not IsNull(root) then
Util.StaticBatchingUtilityCombine(root)
--GameError.Instance:SendErrorMsg("---CombineModelList---" .. res)
-- GameError.Instance:SendErrorMsg("---CombineModelList---" .. res)
end
end
if self.open_dynamic_visible_model then
for k,index in pairs(list) do
local model = self.model_list[index]
if not IsNull(model) then
model:SetActive(false)
self.have_combine_model[index] = true
else
print("model is null:" .. res .. "-" .. index)
end
end
end
end
function MapView:GetSingleParent(model_name)
if not self.support_model_combine then
return self.model_parent
end
local single_parent = self.model_root_map[model_name] or GameObject.Find("splitmodel/" .. model_name .. "_com")
if self.load_terrain_timeout and not single_parent then
single_parent = GameObject.Find("root/" .. model_name .. "_com")
end
if not single_parent then
if IsNull(self.model_parent) then
self.model_parent = GameObject.Find("root").transform
end
if IsNull(self.model_com_root) then
self.model_com_root = UiFactory.createChild(self.model_parent, UIType.EmptyObject, "scene_model_root")
end
self.model_com_root.layer = LayerMask.NameToLayer("Default")
local model_root = UiFactory.createChild(self.model_com_root.transform, UIType.EmptyObject, model_name .. "_com")
model_root.layer = LayerMask.NameToLayer("Default")
single_parent = model_root.transform
SetGlobalPosition3D(single_parent,0, 0, 0)
SetLocalScale(single_parent,1,1,1)
single_parent.localEulerAngles = Vector3(0, 0, 0)
if self.support_model_combine then
self.model_root_map[model_name] = model_root
end
else
if IsNull(single_parent) then
single_parent = self.model_parent
self.timeout_enter_scene = true
else
single_parent = single_parent.transform
end
end
return single_parent
end
function MapView:CreateModel(info,parent)
parent = parent or self.model_parent
if not info or not parent then
return
end
local visible_model = self.model_list[info.id]
if not IsNull(visible_model) then
visible_model:SetActive(true)
return
end
self.enter_scene_want_load_count = self.enter_scene_want_load_count + 1
local data = info.obj
local model_name = data[1]
local single_parent = self:GetSingleParent(model_name)
local map_res = self.curResId
local load_res = function( objs, cache )
if objs and ( cache or objs[0]) and self.mapLoaded then
if map_res ~= self.curResId then
if cache then
destory(objs)
end
return
end
if cache then
objs:SetActive(true)
self:InitObj(objs,nil,data,single_parent,info.id,model_name)
else
self:InitObj(nil,objs[0],data,single_parent,info.id,model_name)
end
else
print("------load res error--------",model_name)
end
self.load_model_count = (self.load_model_count or 0) + 1
local next_frame = function()
self:CheckTerrainLoadFinish()
end
if self.combine_model_state then
setTimeout(next_frame,0.01)
else
next_frame()
end
end
local function load_call_back(objs, cache)
local load = function()
load_res(objs, cache)
end
--避免模型在缓存中时直接返回打乱模型注册流程,延迟一帧加载
--setTimeout(load,0.01)
load()
end
local ab_name = "terrain_prefab_" .. model_name
local cache_list = self.model_cache_map[model_name]
if cache_list then
if #cache_list > 0 then
local length = #cache_list
local info = table.remove(cache_list,length)
if info and not IsNull(info.obj) then
load_call_back(info.obj,true)
return
end
end
end
lua_resM:loadPrefabs(self.load_prefab_temp_target,ab_name,model_name, load_call_back, true, ASSETS_LEVEL.NORMAL)
end
function MapView:CheckTerrainLoadFinish()
if self.regiest_model_finish and not self.timeout_enter_scene and self.load_effect_finish_func then
if self.load_model_count >= self.enter_scene_want_load_count then
--静态合批
if not self.regiest_model_new_mode and self.support_model_combine and not self.combine_model_state then
self:CombineModel()
end
self.combine_model_state = true
--模型水效果
local wave_info = Config.ConfigSceneWaveModel[self.curResId]
if wave_info then
for objname,data in pairs(wave_info) do
self:LoadScreenWaveObj(objname,data.material,data.effect,data.add)
end
end
--地图加载完成回调
if self.load_effect_finish_func then
self.load_effect_finish_func(1)
self.load_effect_finish_func = nil
end
SapManager.Instance:WaitLoadTerrainFinish(false)
else
local per = self.load_model_count/self.enter_scene_want_load_count
if self.load_effect_finish_func then
self.load_effect_finish_func(per)
end
if per >= 0.95 and not self.load_terrain_force_check_handle and self.load_effect_finish_func then
local cur_map = self.curResId
local force_check = function()
self.load_terrain_force_check_handle = nil
if self.load_effect_finish_func and cur_map == self.curResId then
self.load_effect_finish_func(1)
self.load_effect_finish_func = nil
SapManager.Instance:WaitLoadTerrainFinish(false)
end
end
self.load_terrain_force_check_handle = setTimeout(force_check,5)
end
end
end
end
function MapView:CombineModel()
for name,root in pairs(self.model_root_map) do
if self.combine_mini_model[name] then
if not IsNull(root) then
Util.StaticBatchingUtilityCombine(root)
-- print("------combine_mini_model--------",name)
else
-- print("------StaticBatchingUtilityCombine empty root --------",name)
end
else
-- print("------not combine_mini_model--------",name)
end
end
end
function MapView:LoadModelLight(model,data)
if model.gameObject then
local mesh = model.gameObject:GetComponentInChildren(typeof(UnityEngine.MeshRenderer)) or model.gameObject:GetComponentInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
if tonumber(data[26]) == 1 then
mesh.lightmapIndex = tonumber(data[27])
if not mesh.isPartOfStaticBatch then
mesh.lightmapScaleOffset = Vector4(data[28],data[29],data[30],data[31])
end
self:ReplaceMaterial(mesh.sharedMaterial)
mesh.gameObject.isStatic = true
else
self:ReplaceMaterial(mesh.sharedMaterial)
mesh.gameObject.isStatic = false
end
-- local wave_info = Config.ConfigSceneWaveModel[self.curResId]
-- if wave_info then
-- local wave_data = wave_info[data[2]]
-- if wave_data then
-- self:LoadScreenWaveObj( data[2], wave_data.material,wave_data.effect,wave_data.add )
-- end
-- end
end
end
function MapView:ProcessSpecialModel()
local specObj = GameObject.Find("special")
if specObj == nil then
return
end
local childCount = specObj.transform.childCount
for i = 0, childCount - 1 do
local child = specObj.transform:GetChild(i)
local mesh = child.gameObject:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
if mesh ~= nil then
self:ReplaceMaterial(mesh.sharedMaterial)
end
end
end
function MapView:ProcessSkyModel()
local skyObj = GameObject.Find("Sky")
if skyObj == nil then
return
end
local childCount = skyObj.transform.childCount
for i = 0, childCount - 1 do
local child = skyObj.transform:GetChild(i)
local mesh = child.gameObject:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
if mesh ~= nil and mesh.sharedMaterial then
self:ReplaceMaterial(mesh.sharedMaterial)
--mesh.sharedMaterial.renderQueue = 2800
end
end
end
function MapView:ReplaceMaterial(mat)
if mat == nil or mat.shader == nil then
return
end
ShaderTools.ChangeMaterial(mat)
end
function MapView:DeleteModel(id)
if not id then
LogWarning("MapView DeleteModel ID is nil")
return
end
local model = self.model_list[id]
if self.have_combine_model[id] and not IsNull(model) then
model:SetActive(false)
return
end
if not IsNull(model) then
local model_res = self.model_id_res_map[id]
if model_res then
if self.open_model_cache_state then
if not self.model_cache_map[model_res] then
self.model_cache_map[model_res] = {}
end
local info = {obj = model, time = os.time()}
table.insert(self.model_cache_map[model_res],info)
model:SetActive(false)
else
self:DestoryModel(model,model_res)
end
end
end
self.model_list[id] = nil
end
function MapView:DestoryModel(model,name)
destroy(model)
if self.open_abres_immediately_delete_mode then
resMgr:UnloadAssetBundle("terrain_prefab_" .. name,true,1)
end
end
function MapView:UnRegiestModelList()
if self.mapLoaded then
local model_root = GameObject.Find("splitmodel")
local model_config = Config["model" .. self.curResId]
if model_root and model_config then
for id,obj in pairs(model_config) do
if not self.combine_mini_model[obj[1]] or self.open_dynamic_visible_model then
SapManager:getInstance():UnRegisterObj(SapManager.ObjType.Model,id)
end
end
end
end
end
function MapView:RegiestMoveEvent( )
local onMainRoleMove = function(posx,posy)
if not self.last_elevator_event_time or Time.time - self.last_elevator_event_time > 0.07 then
self.last_elevator_event_time = Time.time
self:UpdateElevatorModel(posx,posy)
end
if not self.last_move_event_time or Time.time - self.last_move_event_time > 0.3 then
self.last_move_event_time = Time.time
self:UpdateAlphaModel(posx,posy)
self:UpdateFullScreenEffect(posx,posy)
self:TriggerStory(posx,posy)
end
end
if not self.bind_mainrole_move_event then
self.bind_mainrole_move_event = GlobalEventSystem:Bind(ObjectEventType.MAINROLE_MOVE_EVENT_IMME,onMainRoleMove)
end
end
function MapView:RegisterElevatorModelList( )
local elevator_cfg = Config.ConfigSceneElevatorModel[self.curResId]
if elevator_cfg then
self:RegiestMoveEvent()
self.elevator_vo_list = elevator_cfg
--调试
self:OnDebugElevatorMolde()
end
end
function MapView:OnDebugElevatorMolde( )
-- for k,vo in pairs(self.elevator_vo_list) do
-- if vo.is_debug_show then
-- self:CreateDebugConfigObj(k, vo)
-- end
-- end
end
function MapView:CreateDebugConfigObj( k, vo )
local res = "mrsd_xuanzhong_001"
self.debug_obj_list = self.debug_obj_list or {}
local function load_call_back( objs, is_gameObject )
if not objs or not objs[0] then
return
end
local gameObject = is_gameObject and objs[0] or newObject(objs[0])
local key = k..vo.obj_name
gameObject.name = key
self.debug_obj_list[key] = gameObject
local scale = vo.range/140
SetLocalScale(gameObject.transform, scale)
gameObject.transform:SetParent(panelMgr:GetParent("SceneObjContainer").transform)
SetGlobalPosition3D(gameObject.transform,vo.start_pos.x/100,vo.start_pos.y/100,vo.ele_start_pos.y)
end
lua_resM:loadPrefab(self, res, res, load_call_back, nil, ASSETS_LEVEL.LOW)
end
function MapView:UnRegiestElevatorModelList()
self.elevator_vo_list = {}
if self.debug_obj_list then
for k,go in pairs(self.debug_obj_list) do
destroy(go)
go = nil
end
self.debug_obj_list = false
end
end
function MapView:UpdateElevatorModel( posx, posy )
if not self.elevator_vo_list or #self.elevator_vo_list == 0 then
return
end
local main_role = Scene.Instance.main_role
if not main_role then
return
end
if main_role:IsInState(PoseState.ELEVATOR) or main_role:IsGhostMode() then
return
end
local temp_elevator_vo = false
local x, y = posx, posy
for k,vo in pairs(self.elevator_vo_list) do
local range = vo.range * vo.range
if GameMath_GetDistance(x, y, vo.start_pos.x, vo.start_pos.y, false) <= range then
temp_elevator_vo = vo
break
end
end
if temp_elevator_vo then
main_role:DoElevator(temp_elevator_vo)
return true
end
end
function MapView:RegiestAlphaModelList()
local info = Config.ConfigSceneAlphaModel[self.curResId]
if info then
self.alpha_model_list = {}
for index,config in pairs(info) do
local data = {
task_list = config.task_list,
name = config.name,
minx = config.minx,
miny = config.miny,
maxx = config.maxx,
maxy = config.maxy,
alpha = config.alpha,
time = config.time,
obj = nil,
destory = false,
}
table.insert(self.alpha_model_list,data)
end
self:RegiestMoveEvent()
if RoleManager and RoleManager.Instance.mainRoleInfo then
self:UpdateAlphaModel(RoleManager.Instance.mainRoleInfo.pos_x,RoleManager.Instance.mainRoleInfo.pos_y)
end
end
end
function MapView:UnRegiestAlphaModelList()
for index,data in ipairs(self.alpha_model_list) do
if data.obj then
data.obj:DeleteMe()
data.destory = true
data.obj = nil
end
end
self.alpha_model_list = {}
end
function MapView:UpdateAlphaModel(posx,posy)
if #self.alpha_model_list > 0 then
for index,data in pairs(self.alpha_model_list) do
local is_task_math = true
if data.task_list then
is_task_math = TaskModel:getInstance():IsBetweenTaskListState(data.task_list)
end
if is_task_math then
if data.minx < posx and data.maxx > posx and data.miny < posy and data.maxy > posy then
if not data.obj then
data.obj = AlphaObj.New(data.name,data.alpha,data.time)
if data.obj.load_succeed then
data.destory = false
else
data.obj:DeleteMe()
data.obj = nil
end
end
else
if data.obj and not data.destory then
local callback = function()
if data.obj then
data.obj:DeleteMe()
data.obj = nil
end
end
data.obj:HideEffect( callback )
data.destory = true
end
end
end
end
end
end
function MapView:TriggerStory(posx, posy)
local scene_story_config = Config.Story[self.curMapId]
if scene_story_config then
local story_id = TaskModel:getInstance():GetTriggerStoryId()
local story_cfg = scene_story_config[story_id]
if story_cfg and story_cfg.trigger_range then
local main_role = Scene.Instance.main_role
if not main_role then
return
end
local range = story_cfg.trigger_range * story_cfg.trigger_range
if GameMath_GetDistance(posx, posy, story_cfg.trigger_pos.x, story_cfg.trigger_pos.y, false) <= range then
main_role:DoStory(story_cfg)
end
end
end
end
function MapView:LoadScreenWaveObj( objname, material, effect, add_mat )
-- if self.has_water_effect[objname] then
-- return
-- end
-- local obj = GameObject.Find("splitmodel/" .. objname) or GameObject.Find("special/" .. objname)
-- if not obj then
-- return
-- end
-- --组队副本不开水纹效果
-- if SceneManager.Instance:IsTeamDungeonScene() then
-- return
-- end
-- self.has_water_effect[objname] = true
-- local mesh_renderer = obj:GetComponentInChildren(typeof(UnityEngine.MeshRenderer)) or game_object:GetComponentInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
-- if not add_mat then
-- local ori_mat = MapView.WaveList[material]
-- if not ori_mat then
-- print("material not load succeed:" .. material)
-- return
-- end
-- local mat = Material_New(ori_mat)
-- mat:SetFloat("_Noise_Power", effect or Config.ConfigSceneWaveModel.DefaultWave)
-- SetMaterialTexture(mat,GetMaterialTexture(mesh_renderer.material))
-- mesh_renderer.material = mat
-- mesh_renderer.material.renderQueue = 1999
-- table.insert(self.material_obj_list,mat)
-- else
-- local mats = mesh_renderer.sharedMaterials
-- local lua_mats = {}
-- local mats_len = mats.Length
-- local wave_index = nil
-- for i = 0, mats_len - 1 do
-- lua_mats[i + 1] = mats[i]
-- if IsNull(mats[i]) or string_find(mats[i].name, material, 1, true) then
-- wave_index = i + 1
-- end
-- end
-- if not wave_index then
-- wave_index = mats_len + 1
-- end
-- local wave_effect = lua_mats[wave_index]
-- if not wave_effect then
-- local ori_mat = MapView.WaveList[material]
-- if not ori_mat then
-- print("material not load succeed:" .. material)
-- return
-- end
-- wave_effect = Material_New(ori_mat)
-- wave_effect:SetFloat("_Noise_Power", effect or Config.ConfigSceneWaveModel.DefaultWave)
-- lua_mats[wave_index] = wave_effect
-- mesh_renderer.sharedMaterials = lua_mats
-- mesh_renderer.material.renderQueue = 1999
-- table.insert(self.material_obj_list,wave_effect)
-- end
-- end
end
function MapView:CheckOuttimeCacheMode()
if os.time() - self.last_cache_model_check_time < 10 or SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
return
end
self.last_cache_model_check_time = os.time()
for res,cache_list in pairs(self.model_cache_map) do
for i = #cache_list,1,-1 do
if os.time() - cache_list[i].time > 60 then
local info = table.remove(cache_list,i)
self:DestoryModel(info.obj,res)
end
end
end
end
function MapView:ForceChangeMap( load_empty_map )
local clear_map = function()
self:ClearData()
self.curMapId = nil
self.curResId = nil
end
if load_empty_map and LoginModel.Instance.reconnect_on_game then
local res = "empty"
local load_call_back = function()
if self.wait_clear_map then
UnitySceneManager.LoadSceneAsync(res)
clear_map()
self.wait_clear_map = false
end
end
self.wait_clear_map = true
lua_resM:loadPrefabs(self.load_prefab_temp_target,"terrain_scene_" .. res,{}, load_call_back, true, ASSETS_LEVEL.HIGHT)
else
clear_map()
end
end
function MapView:LoadWaterMaterial()
--加载模型水纹材质
for material,value in pairs(MapView.WaveList) do
local ab_name = "terrain_material_" .. material
local function callback(objs)
if objs and objs[0] then
MapView.WaveList[material] = objs[0]
end
end
lua_resM:loadMateaial(self.load_prefab_temp_target,ab_name, material, callback, ASSETS_LEVEL.HIGHT)
end
end
function MapView:CheckCombineMiniModel()
if self.combine_model_state or not self.support_model_combine then
return
end
if not self.curResId then
return
end
local model_root = GameObject.Find("splitmodel")
local model_config = Config["model" .. self.curResId]
if model_root and model_config then
local res_count_map = {}
for index, data in pairs(model_config) do
local resname = data[1]
if not res_count_map[resname] then
res_count_map[resname] = 0
end
res_count_map[resname] = res_count_map[resname] + 1
end
self.combine_mini_model = {}
for resname,count in pairs(res_count_map) do
if count > self.min_combine_count then
self.combine_mini_model[resname] = true
end
end
end
end
function MapView:IsLocalFile( res )
--新手村地图全加载
if MapView.AllLoadScene[self.curResId] then
Scene.Instance.load_scene_timeout_max = true
return true
end
do return false end
if SystemRuntimePlatform.IsIphone() then
return false
end
if SceneManager.Instance:IsStarFightScene() then
Scene.Instance.load_scene_timeout_max = true
return true
end
--角色第一次进场景全加载
if Scene.Instance.is_first_enter_game or Scene.Instance.is_first_enter_scene then
-- return true
end
if not self.support_model_combine then
return false
end
if MapView.NoCombineModel[tonumber(self.curResId)] then
return false
end
--关闭全加载
if true then
return false
end
if not AppConst.UpdateMode then
return true
end
if tonumber(AppConst.EnglineVer) < 89 then
return false
end
if self.model_local_state[res] then
return true
elseif self.model_local_state[res] == false then
return false
end
local res_file = "rdata/terrain_prefab_" .. res
local dir_str = "/client/unitybundle/"
if SystemRuntimePlatform.IsIphone() then
dir_str = "/client/iosbundle/"
elseif SystemRuntimePlatform.IsAndroid() then
dir_str = "/client/androidbundle/"
end
res_file = dir_str .. Util.GetAssetsBundlePath(res_file)
if Util.FileNeedUpdate(res_file) then
self.model_local_state[res] = false
return false
end
return true
end
--设置屏蔽/非屏蔽特效
function MapView:SetHideRefreshEffect(state)
if not self.mapLoaded then
return
end
local scene_effect = Config.ConfigSceneEffect.EffectInfo[tonumber(self.curMapId)]
if not scene_effect then
return
end
for k,v in pairs(self.effect_list) do
local config = scene_effect[k] or MapView.FullScreenEffect
if config then
v:SetActive(not state)
end
end
end
function MapView:GetLoadSceneRes( res_id )
if MapView.LoadBigScene[tonumber(res_id)] then
self.open_big_scene_mode = true
return res_id .. "_all"
else
return res_id
end
end
-- --创建场景模型
-- function MapView:LoadSpiltModelList( )
-- local model_config = Config["model" .. self.curResId]
-- if model_config then
-- --场景基础资源包加载超时失败,改成挂在通用根节点
-- -- local model_root = GameObject.Find("splitmodel")
-- -- if not model_root then
-- -- model_root = GameObject.Find("root")
-- -- end
-- -- self.model_parent = model_root.transform
-- -- SetGlobalPosition3D(self.model_parent,0, 0, 0)
-- -- SetLocalScale(self.model_parent,1,1,1)
-- -- self.model_parent.localEulerAngles = Vector3(0, 0, 0)
-- self.load_model_count = 0
-- SapManager.Instance:WaitLoadTerrainFinish(true)
-- --排序
-- local temp_model_config = {}
-- local main_pos = MainCamera:getInstance():GetCameraPos()
-- if main_pos then
-- main_pos.x = main_pos.x/100
-- main_pos.y = main_pos.y/100
-- for k,v in pairs(model_config) do
-- v.key = k
-- -- table.insert(temp_model_config, v)
-- temp_model_config[#temp_model_config+1] = v
-- end
-- local sort_func = function(a,b)
-- local di = GameMath.GetDistance(main_pos.x, main_pos.y, a[3], a[5])
-- local dj = GameMath.GetDistance(main_pos.x, main_pos.y, b[3], b[5])
-- return di < dj
-- end
-- table.sort(temp_model_config, sort_func)
-- else
-- temp_model_config = model_config
-- end
-- local near_same_res_map = {}
-- local far_same_res_map = {}
-- local near_max_index = 15
-- local near_cur_index = 1
-- self.enter_scene_want_load_count = 0
-- for index, data in pairs(temp_model_config) do
-- if near_cur_index <= near_max_index then
-- if not near_same_res_map[data[1]] then
-- near_same_res_map[data[1]] = {}
-- self.enter_scene_want_load_count = self.enter_scene_want_load_count + 1
-- near_cur_index = near_cur_index + 1
-- end
-- table.insert(near_same_res_map[data[1]], data.key)
-- else
-- if not far_same_res_map[data[1]] then
-- far_same_res_map[data[1]] = {}
-- self.enter_scene_want_load_count = self.enter_scene_want_load_count + 1
-- end
-- table.insert(far_same_res_map[data[1]], data.key)
-- end
-- end
-- --创建近景
-- for res,list in pairs(near_same_res_map) do
-- self.combine_mini_model[res] = true
-- self:OnLoadSplitModel(res,list,model_config)
-- end
-- --创建远景
-- -- for res,list in pairs(far_same_res_map) do
-- -- self.combine_mini_model[res] = true
-- -- self:OnLoadSplitModel(res,list,model_config)
-- -- end
-- --分帧创建远景
-- local far_step_res_map = {}
-- for k,v in pairs(far_same_res_map) do
-- local vo ={res = k, list = v}
-- table.insert(far_step_res_map, vo)
-- end
-- self.far_model_index = 1
-- local function on_period( )
-- local vo = far_step_res_map[self.far_model_index]
-- if vo then
-- self.combine_mini_model[vo.res] = true
-- self:OnLoadSplitModel(vo.res,vo.list,model_config)
-- self.far_model_index = self.far_model_index + 1
-- else
-- self:CancelFarModelTimer()
-- end
-- end
-- self:CancelFarModelTimer()
-- self.on_far_model_timer = GlobalTimerQuest:AddPeriodQuest(on_period, 0.01)
-- end
-- self.regiest_model_finish = true
-- end
-- function MapView:CancelFarModelTimer( )
-- if self.on_far_model_timer then
-- GlobalTimerQuest:CancelQuest(self.on_far_model_timer)
-- self.on_far_model_timer = nil
-- end
-- end
-- function MapView:OnLoadSplitModel(res,list,model_config)
-- local cache_list = self.model_cache_map[res]
-- local map_res = self.curResId
-- local load_res = function( objs, cache )
-- if objs and ( cache or objs[0]) and self.mapLoaded then
-- if map_res ~= self.curResId then
-- if not cache and objs[0] then
-- destroy(objs[0])
-- end
-- return
-- end
-- local single_parent = self:GetSingleParent(res)
-- for k,index in pairs(list) do
-- local last_model = self.model_list[index]
-- if not last_model then
-- if cache then
-- if #cache_list > 1 then
-- local info = table.remove(cache_list,#cache_list)
-- if info and not IsNull(info.obj) then
-- info.obj:SetActive(true)
-- self:InitObj( info.obj,nil,model_config[index],single_parent,index, res )
-- end
-- else
-- if cache_list[1] and not IsNull(cache_list[1].obj) then
-- cache_list[1].time = os.time()
-- cache_list[1].obj:SetActive(true)
-- self:InitObj( nil, cache_list[1].obj,model_config[index],single_parent,index, res )
-- cache_list[1].obj:SetActive(false)
-- end
-- end
-- else
-- self:InitObj( nil,objs[0],model_config[index],single_parent,index, res )
-- end
-- end
-- end
-- else
-- print("------load res error--------",res)
-- end
-- self.load_model_count = (self.load_model_count or 0) + 1
-- if self.support_model_combine then
-- self:CombineModelList(res,list)
-- end
-- local next_frame = function()
-- self:OnSplitModelFinish()
-- end
-- if self.combine_model_state then
-- setTimeout(next_frame,0.01)
-- else
-- next_frame()
-- end
-- end
-- if cache_list then
-- if #cache_list > 0 then
-- load_res(true,true)
-- return
-- end
-- end
-- local ab_name = "terrain_prefab_" .. res
-- lua_resM:loadPrefab(self.load_prefab_temp_target,ab_name,res, load_res, false, ASSETS_LEVEL.NORMAL)
-- end
-- function MapView:OnSplitModelFinish( )
-- if self.load_model_count and self.enter_scene_want_load_count and self.load_model_count >= self.enter_scene_want_load_count then
-- --静态合批
-- if self.support_model_combine and not self.combine_model_state then
-- self:CombineModel()
-- end
-- self.combine_model_state = true
-- SapManager.Instance:WaitLoadTerrainFinish(false)
-- end
-- end
function MapView:ResetSceneActionObjHeight( )
-- local cfg = Config.ConfigSceneElevatorModel[self.curMapId]
-- if not cfg then
-- return
-- end
-- for index, vo in pairs(cfg) do
-- local obj = self:GetSceneActionObj(vo.obj_name)
-- if not IsNull(obj) then
-- SetGlobalPositionY(obj.transform, vo.obj_start_y)
-- if obj.activeSelf == false then
-- obj:SetActive(true)
-- end
-- end
-- end
end
function MapView:GetSceneActionObj( obj_name )
if not obj_name or obj_name == "" then
return
end
self.action_obj_list = self.action_obj_list or {}
if self.action_obj_list[obj_name] then
return self.action_obj_list[obj_name]
end
local obj = GameObject.Find(obj_name)
if not IsNull(obj) then
self.action_obj_list[obj_name] = obj
return obj
end
end
function MapView:ObjectPlayAction( obj_name, action_name )
local obj = self:GetSceneActionObj(obj_name)
if not IsNull(obj) then
local animator = obj:GetComponent(typeof(UnityEngine.Animator))
if animator then
animator:CrossFade(action_name,0)
end
end
end