源战役客户端
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 

1790 рядки
61 KiB

BaseView = BaseView or BaseClass(UIPartical)
local BaseView = BaseView
local LuaViewManager = LuaViewManager
local lua_viewM = lua_viewM
local GlobalTimerQuest = GlobalTimerQuest
local SetLocalScale = SetLocalScale
local destroy = destroy
local GameObject = GameObject
local UiFactory = UiFactory
local UIZDepth = UIZDepth
local GlobalEventSystem = GlobalEventSystem
local AddClickEvent = AddClickEvent
local EventSystem = EventSystem
local GetChildTransforms = GetChildTransforms
local GetChildGameObjects = GetChildGameObjects
local GetChildImages = GetChildImages
local GetChildTexts = GetChildTexts
BaseView.Class_Type = "BaseView"
BaseView.OpenEvent = "BaseView.OpenEvent"
BaseView.CloseEvent = "BaseView.CloseEvent"
BaseView.DestroyEvent = "BaseView.DestroyEvent"
BaseView.CreateView = "BaseView.CreateView"
BaseView.ChangeVisible = "BaseView.ChangeVisible"
--3D模型背景资源
BaseView.ModelBgRes = {
[1] = "effect_beibao_1_1", --蓝色网格
[2] = "effect_beibao_1_2", --青色网格
[3] = "effect_beibao_1_3", --紫色网格
[4] = "effect_beibao_2_1", --青色方块
[5] = "effect_beibao_3_1", --蓝色线条
[6] = "effect_beibao_3_2", --紫色线条
}
--界面打开/关闭界面缩放参数
BaseView.OpenCloseScaleCfg =
{
--打开界面缩放动画参数
[1] = {start_scale = 0.9, end_scale = 1, time = 0.3},
--关闭界面缩放动画参数
[2] = {start_scale = 1, end_scale = 0.9, time = 0.3},
}
OpenMode = {
OpenOnly = 1,
OpenToggle = 2,
OpenDefault = 1,
}
BaseView.LittleMoveDir =
{
Top = 1,
Bottom = 2,
Left = 3,
Right = 4,
}
CloseMode = {
CloseVisible = 1,
CloseDestroy = 2,
CloseDefault = 2,
}
BaseView.ShowAnimType = {
Fading = 1, -- 淡入淡出
-- BlackScreen = 2, -- 黑屏切换
}
function BaseView:__init()
GlobalEventSystem:FireNextFrame(BaseView.CreateView,self)
end
function BaseView:__defineVar()
return {
_class_type = self, -- 界面类型,通过判断_class_type.Class_Type识别baseview baseitem
_iid = _in_obj_ins_id, -- 界面对象标识id
_use_delete_method = false, -- 是否调用过delete函数
_need_wait_blur_bg_loaded = false, -- 是否需要等待模糊背景加载完毕
base_file = "" , -- 模块资源名称
layout_file = "", -- 界面预设名字
preLoad_list = false, -- 打开界面之前需要预加载的资源,除了本模块UI资源外的
hide_maincancas = false, -- 是否隐藏主界面
use_background = false, -- 窗口背景,用灰色半透明背景
background_alpha = 0.85, -- 窗口背景的透明度
click_bg_toClose = false, -- 点击背景是否关闭该窗口
background_wnd = false, -- 背景蒙版窗口
destroy_imm = true, -- 销毁窗口时采用立即销毁模式
delay_delete_time = 3, -- 非立即销毁的界面,关闭后延迟销毁的等待时间
change_scene_close = false, -- 切换场景是否关闭
reenter_scene_close = false, -- 重新进入场景是否关闭
change_scene_hide = false, -- 切换场景是否隐藏(不与change_scene_close、reenter_scene_close同时使用)
preparing_res = false, -- 异步加载进行中
is_delete = false , -- 是否已经删除
is_set_order_sorting = true, -- 是否需要设置深度,自动管理 canvas.sortingOrder
is_set_zdepth = false, -- 是否设置z深度,当需要盖住下层的UI界面上的模型时,要设true
open_mode = OpenMode.OpenDefault, -- 打开模式
close_mode = CloseMode.CloseDefault, -- 关闭模式
hide_item_use_view = false, -- 打开的时候是否关闭itemuseview
isPop = false, -- 是否可见
wait_for_hide = false, -- 等待加载完隐藏
layer_name = "UI", -- 窗口层次
append_to_ctl_queue = false, -- 添加进入控制队列,打开下层界面时自动关闭上层,关闭下层自动打开上层
is_delay_callback = true, -- 是否延迟调用load_callback和open_callback
load_callback = false, -- 加载的回调函数
open_callback = false, -- 窗口打开时回调
close_callback = false, -- 窗口关闭时回调
destroy_callback = false, -- 销毁的回调函数
show_loading = false, -- 是否显示加载界面
is_loaded = false, -- 是否已经加载完
cache_findChild = false, -- 缓存FindChild的接口
gameObject = false, -- ugui窗口对象
transform = false, -- 窗口transform
use_local_view = false, -- 使用本地界面模式,将预设挂接在编辑器对应的canva层次上才能开启
is_guide_module = false, --是否是新手引导模块
is_hide_skill_black_bg = false, --是否隐藏羁绊技能的黑色遮罩
ReOpen_callback = nil, --重新打开界面,刷新事件
close_fog = nil, --开启界面的时候是否关闭场景FOG效果(如果出现场景中模型or特效和UI上效果显示不一样,开启)使用时候需要 use_background == true
blur_activity_bg = false, -- UI背景遮罩的高斯模糊效果
blur_camera_type = false, -- 模糊背景的摄像机类型
blur_screenshot = nil, -- 模糊背景截图 nil:使用通用黑色蒙版 false:等待渲染返回 成功会返回Texture图片,而不是Sprite
blur_anim_time = 0.2, -- 模糊动画时间
full_screen = false, --全屏模式
-- 界面打开后的内部布局动画
ani_right = false, --右侧动画
ani_left = false, --左侧动画
adjust_mid = false, --中间布局调整
ani_list = false,
-- 打开/关闭界面时的展示动画
use_show_anim = false, --是否启用打开界面的切换动画
use_hide_anim = false, --是否启用关闭界面的切换动画
ignore_use_anim = false, --是否忽略动换动画
do_show_animation = false , --当前已经处理过了动画的状态,true表示处理过show动画, false表示处理过close动画
-------------------------
mask_open_sound = false,--是否屏蔽开界面声音
mask_close_sound = false,--是否屏蔽关界面声音
move_node_list = false, --移动到背景节点列表
show_back_camera = false, --打开后渲染摄像机
back_item_contaner_list = false, --处理view下面的item的back ui 显示和隐藏
fire_change_visible_event = false, --用于界面显示隐藏通知,常用于模型动作修正
need_movie_type = true, -- 是否需要播放开启关闭界面动画(针对非黑屏大界面的)
jump_close = false,--用于某些界面跳转了之后就需要关掉界面
model_activity_bg = false, -- 3d背景模式,带镜面反射,一级全屏界面才需要
model_activity_bg_pos = false, -- 3d背景的偏移坐标,默认是居中的,如果你的模型不是居中的话就要调整坐标
model_activity_bg_type = 2, -- 3d背景的默认样式类型
little_move_tween_list = false, --界面4方向缓动动画数组
little_move_event = false, --界面4方向缓事件监听
little_move_table = false, --界面4方向缓动动画数据
little_move_load_view_time_id = false, --界面打开时,缓动处理延时定时器
little_move_is_show_anim = false, --界面打开时,是否已经显示过进入动画
hide_clear_role_model = true, --隐藏时删除模型
need_culling_mask_ground = false, --打开界面是否需要摄像机剔除ground层(加载模型较多的界面可加上,取消渲染ground稍微增加性能)
force_no_ctl_queue = false,--强制不加入堆栈
open_guide_close = false, --打开引导界面时(功能开放界面),是否关闭界面(复用change_scene_close的设置)
}
end
--打开界面之前需要预加载的资源
function BaseView:AddPreLoadList(abName, assetNameList, type)
if not self.preLoad_list then
self.preLoad_list = {}
end
table.insert(self.preLoad_list,{type, abName, assetNameList})
end
--[[
获取子对象的transform
特别注意此方法是从根节点开始搜寻子对象 所以要写全路径 比如:"input/Text"
]]
function BaseView:GetChild(name)
if self.cache_findChild and self.transform then
return self.cache_findChild(self.transform,name)
end
end
function BaseView:GetChildComponent(name,com)
return self:GetChild(name):GetComponent(com)
end
--获取多个孩子transform
function BaseView:GetChildTransforms(names)
return GetChildTransforms(self.transform, names)
end
--获取多个孩子go
function BaseView:GetChildGameObjects(names)
return GetChildGameObjects(self.transform, names)
end
--获取多个孩子image
function BaseView:GetChildImages(names)
return GetChildImages(self.transform, names)
end
--获取多个孩子text
function BaseView:GetChildTexts(names)
return GetChildTexts(self.transform, names)
end
--是否真正打开 判断依据是调用了open以及资源加载已经完成
function BaseView:HasOpen()
return self.isPop and self.is_loaded and not self.wait_for_hide
end
function BaseView:Open()
print("[ BaseView Open ]: source = ",self._class_type._source, "layout_file = ",self.layout_file)
self.isPop = true
self.wait_for_hide = false
self.is_in_close_anim = false
self._use_delete_method = false
self:RemoveDestroyTimer()
-- -- 如果设备不支持高斯模糊后处理,则强制不渲染
-- if self.blur_activity_bg then
-- if MainCamera.Instance:GetRenderSupport() then
-- self.blur_screenshot = false
-- local function blur_screenshot_callback(screenshot)
-- self.blur_screenshot = screenshot
-- self:SetBackgroundWnd()
-- end
-- MainCamera.Instance:GetCameraBlurScreenShot(blur_screenshot_callback, self.blur_camera_type)
-- else
-- self.blur_screenshot = false
-- self.blur_activity_bg = false
-- end
-- end
if self.open_mode == OpenMode.OpenOnly then
BaseView.OpenOnly(self)
elseif self.open_mode == OpenMode.OpenToggle then
BaseView.OpenToggle(self)
end
local auto_close_view = function()
self:Close()
end
local auto_change_scene_close_view = function()
if SceneManager:getInstance():IsDailyCircleDungeon() then--如果现实进入镜像场景,则关掉该界面
self.is_in_daily_circle_dungeon = true
elseif self.is_in_daily_circle_dungeon then --如果当前场景不是镜像场景,并且又是镜像场景出来的。也不关掉界面
self.is_in_daily_circle_dungeon = false
else
self:Close()
end
end
if self.change_scene_close and not self.change_scene_close_event_id then
self.change_scene_close_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.SCENE_CHANGED,auto_change_scene_close_view)
end
--复用切场景关闭的设置(或者是有背景的界面, 或者是全屏界面)
self.open_guide_close = ( self.use_background and self.open_guide_close ~= nil) or self.open_guide_close or (self.open_guide_close ~= nil and self.change_scene_close or false)
if self.open_guide_close and not self.open_guide_close_id then
self.open_guide_close_id = EventSystem.Bind(GlobalEventSystem,EventName.OPEN_GUIDE_CLOSE_VIEW,auto_close_view)
end
if self.reenter_scene_close and not self.reenter_close_event_id then
self.reenter_close_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.SCENE_REENTER,auto_close_view)
end
if not self.change_scene_close and not self.change_scene_close and self.change_scene_hide and not self.change_scene_hide_event_id and not self.change_scene_complete_event_id then
local auto_hide_view = function()
self:Hide()
end
local auto_show_view = function()
self:CancelHide()
end
self.change_scene_hide_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.OPEN_SCENE_LOAD_VIEW,auto_hide_view)
self.change_scene_complete_event_id = EventSystem.Bind(GlobalEventSystem,EventName.SCENE_LOAD_VIEW_COMPLETE,auto_show_view)
end
if self.use_background and self.hide_maincancas and not self.all_close_event_id then
self.all_close_event_id = EventSystem.Bind(GlobalEventSystem,EventName.CLOSE_ALL_VIEW,auto_close_view)
end
local function on_jump_close()
if self._use_delete_method then return end
self:Close()
end
if self.jump_close and not self.jump_close_event_id then
self.jump_close_event_id = EventSystem.Bind(GlobalEventSystem,EventName.JUMP_CLOSE_EVENT,on_jump_close)
end
local function onOrientationChange( )
self:SetIpxMode()
end
if not self.orientation_change_id then
self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
end
if self.is_guide_module and not self.trigger_guide_id then
local function onTriggerGuideHandler()
if not self.is_loaded then
return
end
if self.AddToStageHandler then
self:AddToStageHandler()
end
end
self.trigger_guide_id = EventSystem.Bind(GlobalEventSystem,EventName.TRIGGER_GUIDE_TYPE,onTriggerGuideHandler)
end
EventSystem.Fire(GlobalEventSystem,BaseView.OpenEvent, self.layer_name, self)
-- if (self.key_back_to_close == true or (self.use_background and self.hide_maincancas)) and self.key_back_to_close_id == nil then
-- local function on_force_close( )
-- if BaseView.LastTabIndex and BaseView.LastTabIndex > 0 then
-- GlobalEventSystem:Fire(EventName.KEY_BACK_CHANGE)
-- else
-- self:Close()
-- end
-- end
-- BaseView.KeyBackWinCount = BaseView.KeyBackWinCount and BaseView.KeyBackWinCount + 1 or 1
-- self.key_back_to_close_id = GlobalEventSystem:Bind(EventName.KEY_BACK_CLOSE, on_force_close)
-- end
end
function BaseView:OpenOnly()
self.is_delete = false
if self.preparing_res then
return
end
-- 打开的时候界面还在缓存中
if self.gameObject then
BaseView.AfterOpen(self)
if not self.destroy_imm then --如果是非立即销毁的界面,要重新设置父节点
self.transform:SetParent(panelMgr:GetParent(self.layer_name))
end
return
end
self:AsnycLoadLayout()
if self.layer_name ~= "Main" and not self.mask_open_sound then
lua_soundM:PlayUIEffectSound(LuaSoundManager.SOUND_UI.OPEN)
end
end
function BaseView:AsnycLoadLayout()
local preLoad_index = 0
local preLoad_list_len = 0
if self.show_loading then
LuaViewManager.AddLoadingView(lua_viewM, self._iid)
end
local function preLoadCallback()
preLoad_index = preLoad_index + 1
if preLoad_list_len == 0 or preLoad_index == preLoad_list_len then
local res_load_finish = function(obj)
self:DoCreateWindowIndeed(obj)
end
if self.base_file == "" then
-- 没有预设体的界面,直接创建空对象
local go = UiFactory.createChild(panelMgr:GetParent(self.layer_name), UIType.EmptyObject, LuaMemManager.GetLastStr(self._class_type._source,"/"))
res_load_finish(go)
else
LuaViewManager.LoadView(lua_viewM, self,self.base_file, self.layout_file, self.layer_name, res_load_finish)
end
end
end
-- 先加载额外的依赖资源包
self.preparing_res = true
self.is_loaded = false
if self.load_time_out_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id)
self.load_time_out_id = nil
end
local function onCheckTimeOut()
if self.layer_name == "UI" then
self.preparing_res = false
self:Close()
end
end
-- 15秒都打不开界面则自动触发关闭流程,避免影响后续操作
self.load_time_out_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, onCheckTimeOut, 15)
if self.preLoad_list then
local vo = nil
preLoad_list_len = #self.preLoad_list
for i = 1, preLoad_list_len do
vo = self.preLoad_list[i]
lua_resM:LoadRes(self, vo[1], vo[2], vo[3], preLoadCallback)
end
self.preLoad_list = nil
else
preLoadCallback()
end
end
function BaseView:DoCreateWindowIndeed(obj)
--iphone低端机强制设立即销毁
if SystemMemoryLevel.Cur == SystemMemoryLevel.Low and SystemRuntimePlatform.IsIphone() then
self.destroy_imm = true
end
if self.load_time_out_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id)
self.load_time_out_id = false
end
--资源下载或加载失败
if obj == nil then
self.preparing_res = false
self:Close()
return
end
self.gameObject = obj
if self.isPop == false then --如果加载回来时,外部已经调用了关闭流程,则直接销毁界面
self:Destroy()
return
end
-- 缓存频繁访问的对象
self.transform = obj.transform
self.cache_findChild = self.transform.Find
--统一处理是否显示界面打开/关闭动画
self.use_show_anim = not self.ignore_use_anim and (self.use_background and not self.model_activity_bg) or self.use_show_anim
self.use_hide_anim = not self.ignore_use_anim and (self.use_background and not self.model_activity_bg) or self.use_hide_anim
if not ClientConfig.view_scale_ani_mode then
self.use_show_anim = false
self.use_hide_anim = false
end
if self.use_show_anim then
local cfg = BaseView.OpenCloseScaleCfg[1]
SetLocalScale(self.transform, cfg.start_scale, cfg.start_scale, cfg.start_scale)
else
SetLocalScale(self.transform)
end
self:InitViewAnimation()
if self.show_loading then
LuaViewManager.RemoveLoadingView(lua_viewM, self._iid)
end
-- 设置背景的逻辑封装成一个函数
self:SetBackgroundWnd()
if self.show_back_camera then
self:ShowBackModeCamera()
end
self.base_view_closeBtn = self.transform:Find("Window/windowCloseBtn") or self.transform:Find("Window2/windowCloseBtn")
if self.base_view_closeBtn then
self.base_view_closeBtn:GetComponent("Image"):SetNativeSize()
local function onCloseHandler()
self:Close()
end
AddClickEvent(self.base_view_closeBtn.gameObject,onCloseHandler, nil, true )
self.base_view_titleText = self.transform:Find("Window/windowTitleCon/windowTitleText") or self.transform:Find("Window2/windowTitleCon/windowTitleText")
end
-- self.base_view_bg = self.transform:Find("Window") or self.transform:Find("Window2")
-- if self.base_view_bg then
-- local img = self.base_view_bg:GetComponent("Image")
-- if img then
-- img.raycastTarget = true
-- end
-- end
-- --main层的UI都挂在main_cancas_con,以实现显示隐藏修改的需要
-- if self.layer_name == "Main" and not self.hide_maincancas then
-- LuaViewManager.PuskMainCanvasCon(lua_viewM, self.transform)
-- end
if not self._need_wait_blur_bg_loaded then
BaseView.CreateMainWindow(self)
self.preparing_res = false
end
end
function BaseView:SetBackgroundWnd( )
-- 未加载完则不处理
if not self.gameObject then
return
end
self.blur_activity_bg = false
if self.use_background and self.model_activity_bg then
self.close_fog = true
end
local function create_background_wnd()
if self.blur_screen_time_out_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id)
self.blur_screen_time_out_id = nil
end
if self.model_activity_bg then
local function on_delay( )
self:UpdateModelBg()
end
setTimeout(on_delay, 0.1)
else
self.background_wnd = self.background_wnd or UiFactory.createChild(self.transform, UIType.Background,"activity_bg")
self.background_wnd_raw = self.background_wnd:GetComponent("RawImageExtend")
if self.blur_screenshot == nil then -- 不使用模糊背景
self.background_wnd_raw.alpha = self.background_alpha
elseif self.blur_screenshot == false then -- 等待模糊背景返回
self.background_wnd_raw.alpha = 0
elseif self.blur_screenshot then
self.background_wnd_raw.color = ColorUtilValue.BLURGRAY
self.background_wnd_raw.texture = self.blur_screenshot
end
if self.use_show_anim then
local cfg = BaseView.OpenCloseScaleCfg[1]
if cfg and cfg.start_scale ~= 0 then
self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth / cfg.start_scale, ScreenHeight/cfg.start_scale)
else
self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight)
end
else
self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight)
end
self.background_wnd.transform:SetAsFirstSibling()
SetAnchoredPosition(self.background_wnd.transform, 0, 0)
if self.background_wnd and self.click_bg_toClose then
local function onClickHandler()
self:Close()
end
AddClickEvent(self.background_wnd,onClickHandler,nil,false)
end
end
-- 不管有没有模糊都要尝试执行这块逻辑,这种写法也包含了模糊逻辑超时之后打开界面的处理
if self._need_wait_blur_bg_loaded then
BaseView.CreateMainWindow(self)
self.preparing_res = false
end
end
if self.use_background then
if self.model_activity_bg then
self.blur_activity_bg = false
end
self.on_blur_screen_finish = false --记录高斯模糊完成标识,超时的话则创建普通背景,避免异常情况界面无法关闭
-- 如果设备不支持高斯模糊后处理,则强制不渲染
-- if self.blur_activity_bg then
-- if MainCamera.Instance:GetRenderSupport() then
-- self.blur_screenshot = false
-- -- 需要等待模糊图返回才打开界面
-- self._need_wait_blur_bg_loaded = true
-- -- 如果要使用打开或关闭动画,则需要动态添加CanvasGroup组件
-- if self.use_show_anim or self.use_hide_anim then
-- local canvas_group = self.gameObject:GetComponent(typeof(UnityEngine.CanvasGroup))
-- if not canvas_group then
-- canvas_group = self.gameObject:AddComponent(typeof(UnityEngine.CanvasGroup))
-- end
-- canvas_group.alpha = 0
-- end
-- -- 创建回调用来接收RenderTexture
-- local function blur_screenshot_callback(renderTexture)
-- self.on_blur_screen_finish = true
-- self.blur_screenshot = renderTexture
-- if self._use_delete_method then -- 如果已经在执行销毁了,则立即回收rt
-- MainCamera.Instance:ClearScreenShotCache(self.blur_screenshot)
-- return
-- end
-- create_background_wnd()
-- if self.bg_back_func then--背景放到后面回调 具体参考EquipGemstoneAutoUpView
-- self.bg_back_func()
-- end
-- end
-- MainCamera.Instance:GetCameraBlurScreenShot(blur_screenshot_callback, self.blur_camera_type)
-- if self.click_bg_toClose then
-- local function onBlurTimeout( )
-- if not self.on_blur_screen_finish then
-- self.blur_activity_bg = false
-- create_background_wnd()
-- end
-- end
-- if self.blur_screen_time_out_id then
-- TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id)
-- self.blur_screen_time_out_id = nil
-- end
-- self.blur_screen_time_out_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, onBlurTimeout, 3)
-- end
-- else
-- self.blur_activity_bg = nil
-- create_background_wnd()
-- end
-- else
create_background_wnd()
-- end
end
end
-- 更新3D模型背景
function BaseView:UpdateModelBg( bg_type )
if IsNull(self.gameObject) then
return
end
self.model_activity_bg_type = bg_type or self.model_activity_bg_type
--过滤重复
if self.last_model_bg_type and self.last_model_bg_type == self.model_activity_bg_type then
return
end
self.last_model_bg_type = self.model_activity_bg_type
--先从缓存池取
self.model_activity_bg_objs = self.model_activity_bg_objs or {}
for k,v in pairs(self.model_activity_bg_objs) do
local obj = v.obj
if not IsNull(obj) then
obj:SetActive(false)
end
end
local cache_model_bg = self.model_activity_bg_objs[self.model_activity_bg_type]
if cache_model_bg and cache_model_bg.obj and not IsNull(cache_model_bg.obj) then
cache_model_bg.obj:SetActive(false)
cache_model_bg.obj:SetActive(true)
return
end
--再去加载
local cur_res_name = BaseView.ModelBgRes[self.model_activity_bg_type] or BaseView.ModelBgRes[1]
local function load_finish_func(objs, is_gameObject)
if self._use_delete_method then
return
end
if not objs or not objs[0] then
return
end
local go = is_gameObject and objs[0] or newObject(objs[0])
local go_name = go.name
local new_res_type, new_res_name = self:GetModelBgName(go_name)
if new_res_name ~= cur_res_name then --当前加载完成的不是最新的,则回收
self:DeleteModelBg(new_res_name, go)
return
end
self.model_activity_bg_objs = self.model_activity_bg_objs or {}
if self.model_activity_bg_objs[new_res_type] then
destroy(go)
return
end
self.model_activity_bg_objs[new_res_type] = {name = new_res_name, obj = go}
go.transform:SetParent(self.transform)
go:SetActive(false)
go:SetActive(true)
if self.model_activity_bg_pos then
SetLocalPosition(go.transform, self.model_activity_bg_pos.x, self.model_activity_bg_pos.y, -50000)
else
SetLocalPosition(go.transform, 0, 0, -50000)
end
SetLocalRotation(go.transform)
SetLocalScale(go.transform, 100)
end
local function bg_load_delay_func( ... )
lua_resM:loadPrefab(self, cur_res_name, cur_res_name, load_finish_func, false, ASSETS_LEVEL.HIGHT)
end
self.model_bg_time_id = setTimeout(bg_load_delay_func,0.01)
end
function BaseView:GetModelBgName( obj_name )
local res_type, res_name
for k,v in pairs(BaseView.ModelBgRes) do
if string.find(obj_name, v, 1, true) then
res_type = k
res_name = v
break
end
end
return res_type, res_name
end
function BaseView:DeleteModelBg( name, obj )
--指定回收
if name and not IsNull(obj) then
lua_resM:AddObjToPool(self, name, name, obj)
return
end
--全部回收
if self.model_activity_bg_objs then
for k,v in pairs(self.model_activity_bg_objs) do
local temp_name, temp_obj = v.name, v.obj
if not IsNull(temp_obj) then
lua_resM:AddObjToPool(self, temp_name, temp_name, temp_obj)
end
end
self.model_activity_bg_objs = false
end
end
function BaseView:CreateMainWindow()
if self.is_delay_callback and self.hide_maincancas then --大界面才需要延迟callback
local function onLoad()
self.is_loaded = true
self:BeforeLoad()
if self.load_callback and not self.is_delete and self.gameObject then
self.load_callback()
end
end
if self._base_delay_load_id then
LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id)
self._base_delay_load_id = false
end
self._base_delay_load_id = LuaViewManager.AddDelayQueue(lua_viewM, onLoad)
else
self.is_loaded = true
self:BeforeLoad()
if self.load_callback then
self.load_callback()
end
end
-- 重置等待变量
self._need_wait_blur_bg_loaded = false
BaseView.AfterOpen(self)
end
function BaseView:AfterOpen()
if not self.gameObject then
return
end
if self.isPop then
BaseView.PlayOpenMovie(self)
local function onOpen()
if self.open_callback then
self.open_callback()
end
if self.use_background and self.close_fog == true then
Scene.Instance:ChangeFogEnable(false)
end
if self.is_guide_module then
if self.AddToStageHandler then
self:AddToStageHandler()
end
end
if self.hide_item_use_view then
LuaViewManager.Fire(lua_viewM, LuaViewManager.HIDE_ITEM_USE_VIEW, true)
end
if self.is_hide_skill_black_bg then
SkillManager:getInstance():AddHideBlackViews(self.layout_file)
HideBlackGround()
end
if self.change_scene_hide and not Scene:getInstance():IsSceneProloadFinish() then
self:Hide()
end
self:DoOpenAni()
--self:DoShowViewAnimation(true)
self:DoShowViewScaleAnimation(true)
end
if self.wait_for_hide then
self.gameObject:SetActive(false)
if self.is_set_zdepth then
UIZDepth.ResetUIZDepth(self)
end
if self.hide_maincancas then
LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true )
end
elseif self.wait_for_hide == false then
if self.hide_maincancas then
LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, false)
end
if not self.gameObject.activeSelf then
self.gameObject:SetActive(true)
end
end
self.wait_for_hide = false
if self.is_set_order_sorting then
self:SetUIDepth(self.gameObject)
end
local curr_zdepth_count = nil
if self.is_set_zdepth then
curr_zdepth_count = self:AddUIZDepth()
end
if self.layer_name == "Main" and not lua_viewM.main_cancas_last_visible then
LuaViewManager.PuskMainCanvasCon(lua_viewM, self.transform)
end
if self.is_delay_callback and self.hide_maincancas then --大界面才需要延迟callback
local function onDelayOpen()
if not self.is_delete and self.isPop and self.gameObject then
onOpen()
if curr_zdepth_count then
UIZDepth.SetUIZDepth(self, curr_zdepth_count)
end
end
end
if self.delay_open_id then
LuaViewManager.RemoveDelayQueue(lua_viewM, self.delay_open_id)
self.delay_open_id = false
end
self.delay_open_id = LuaViewManager.AddDelayQueue(lua_viewM, onDelayOpen)
else
onOpen()
end
LuaViewManager.OpenView(lua_viewM, self)
else
self:Close()
end
end
function BaseView:AfterClose()
if self.layout_file ~= "GuidePromptView" then
LuaViewManager.CloseView(lua_viewM, self)
end
--下面这句话要放在clse_callback前面 因为有些是在close_callback 关掉界面 会导致重新调用cancelhide 导致主界面被隐藏
-- LuaViewManager.CloseView(lua_viewM, self)
UIPartical.ClearAllEffect(self)
if self.close_callback and self.is_loaded then
self.close_callback()
end
-- if self.use_background and self.close_fog == true and not self.append_to_ctl_queue then --改到 luaViewManager 中开启
-- Scene.Instance:ChangeFogEnable(true)
-- end
end
function BaseView:OpenToggle()
if self.gameObject and self.isPop then
self:Close()
else
self:OpenOnly()
end
end
function BaseView:Close(called_by_mgr)
self.isPop = false
local function close_callback()
if self.close_mode == CloseMode.CloseVisible then
BaseView.CloseVisible(self)
elseif self.close_mode == CloseMode.CloseDestroy then
BaseView.CloseDestroy(self)
end
end
if self.use_hide_anim then
-- if not self.is_in_close_anim then
--self:DoShowViewAnimation(false)
self:DoShowViewScaleAnimation(false, close_callback)
-- self.is_in_close_anim = true
-- else
-- close_callback()
-- end
else
close_callback()
end
-------------------------
if self.layer_name ~= "Main" and not self.mask_close_sound then
lua_soundM:PlayUIEffectSound(LuaSoundManager.SOUND_UI.CLOSE)
end
-------------------------
end
--隐藏
function BaseView:Hide()
if self.gameObject then
if self.hide_maincancas then
LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true)
end
self.gameObject:SetActive(false)
self.wait_for_hide = nil
self:SetBackUIVisible(false)
if self.fire_change_visible_event then
GlobalEventSystem:Fire(BaseView.ChangeVisible, false)
end
else
self.wait_for_hide = true
end
if self.HideChangeCall then
--有的界面需要在显隐的时候调用函数
self:HideChangeCall(false)
end
end
--取消隐藏
function BaseView:CancelHide()
self.isPop = true
self.wait_for_hide = false
BaseView.RemoveDestroyTimer(self)
if self.hide_maincancas then
LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, false)
end
-- -- 重新添加背景模糊特效
-- if self.blur_activity_bg then
-- MainCamera.Instance:EnableBlurEffect(self.blur_camera_type, self.blur_anim_time)
-- end
--self:DoShowViewAnimation(true)
--self:DoShowViewScaleAnimation(true)
self:SetBackUIVisible(true)
if self.gameObject then
if IsNull(self.gameObject) then
local str = "base view CancelHide is nil " .. tostring(self.layout_file)
GameError.Instance:SendErrorMsg(str)
else
self.gameObject:SetActive(true)
if self.ReOpen_callback then
self:ReOpen_callback()
end
if self.fire_change_visible_event then
GlobalEventSystem:Fire(BaseView.ChangeVisible, true)
end
end
end
local cache_model_bg = self.model_activity_bg_objs and self.model_activity_bg_objs[self.model_activity_bg_type]
if cache_model_bg and cache_model_bg.obj and not IsNull(cache_model_bg.obj) then
cache_model_bg.obj:SetActive(false)
cache_model_bg.obj:SetActive(true)
return
end
if self.HideChangeCall then
--有的界面需要在显隐的时候调用函数
self:HideChangeCall(true)
end
end
function BaseView:CloseVisible()
if self.gameObject then
if IsNull(self.gameObject) or IsNull(self.transform) then
if self.layout_file ~= "GuidePromptView" then
local str = "base view CloseVisible is nil " .. tostring(self.layout_file)
GameError.Instance:SendErrorMsg(str)
end
else
if self.close_mode == CloseMode.CloseDestroy and self.destroy_imm and not self.use_local_view then
self.transform:SetParent(UiFactory.GetSceneCanvas())
else
self.gameObject:SetActive(false)
end
end
end
self:StopLittleMoveAnim()
if self.key_back_to_close_id then
if BaseView.KeyBackWinCount and BaseView.KeyBackWinCount > 0 then
BaseView.KeyBackWinCount = BaseView.KeyBackWinCount - 1
end
GlobalEventSystem:UnBind(self.key_back_to_close_id)
self.key_back_to_close_id=nil
end
if self.change_scene_close_event_id then
EventSystem.UnBind(GlobalEventSystem,self.change_scene_close_event_id)
self.change_scene_close_event_id=nil
end
if self.open_guide_close_id then
EventSystem.UnBind(GlobalEventSystem,self.open_guide_close_id)
self.open_guide_close_id=nil
end
if self.change_scene_hide_event_id then
EventSystem.UnBind(GlobalEventSystem,self.change_scene_hide_event_id)
self.change_scene_hide_event_id=nil
end
if self.change_scene_complete_event_id then
EventSystem.UnBind(GlobalEventSystem,self.change_scene_complete_event_id)
self.change_scene_complete_event_id=nil
end
if self.all_close_event_id then
EventSystem.UnBind(GlobalEventSystem,self.all_close_event_id)
self.all_close_event_id = nil
end
if self.jump_close_event_id then
EventSystem.UnBind(GlobalEventSystem,self.jump_close_event_id)
self.jump_close_event_id = nil
end
if self.orientation_change_id then
EventSystem.UnBind(GlobalEventSystem,self.orientation_change_id)
self.orientation_change_id = nil
end
if self.reenter_close_event_id then
EventSystem.UnBind(GlobalEventSystem,self.reenter_close_event_id)
self.reenter_close_event_id = nil
end
if self.delay_open_id then
LuaViewManager.RemoveDelayQueue(lua_viewM, self.delay_open_id)
self.delay_open_id = nil
end
if self.load_time_out_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id)
self.load_time_out_id = nil
end
if self.is_hide_skill_black_bg then
SkillManager:getInstance():RemoveHideBlackViews(self.layout_file)
end
if self.hide_maincancas then
LuaViewManager.Fire(lua_viewM,LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true)
end
self:ClearOpenMovieId()
if self.hide_item_use_view then
LuaViewManager.Fire(lua_viewM, LuaViewManager.HIDE_ITEM_USE_VIEW, false)
end
--隐藏时自动删掉挂接的模型,需要在对应界面的opencallback后重新创建
if self.hide_clear_role_model then
lua_resM:clearRoleMode(self)
end
if self.is_set_zdepth and not IsNull(self.transform) then
UIZDepth.ResetUIZDepth(self)
end
-- 如果存在模糊背景图,则需要传到C#中销毁
if self.blur_screenshot then
MainCamera.Instance:ClearScreenShotCache(self.blur_screenshot)
end
if self.blur_screen_time_out_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id)
self.blur_screen_time_out_id = nil
end
BaseView.AfterClose(self)
end
function BaseView:CloseDestroy()
self:CloseVisible()
if self.destroy_imm then
BaseView.Destroy(self)
else
BaseView.AddDestroyTimer(self)
end
end
function BaseView:RemoveDestroyTimer()
if self.destroy_timer then
TimerQuest.CancelQuest(GlobalTimerQuest, self.destroy_timer)
self.destroy_timer = false
end
end
function BaseView:AddDestroyTimer()
BaseView.RemoveDestroyTimer(self)
local destroy_callback = function()
self.destroy_timer = false
self:Destroy()
end
self.destroy_timer = TimerQuest.AddDelayQuest(GlobalTimerQuest, destroy_callback, self.delay_delete_time)
end
function BaseView:Destroy()
if self.is_delete or not self.gameObject then return end
if self.model_bg_time_id then
GlobalTimerQuest:CancelQuest(self.model_bg_time_id)
self.model_bg_time_id = nil
end
if self._base_delay_load_id then
LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id)
self._base_delay_load_id = false
end
if self.trigger_guide_id then
EventSystem.UnBind(GlobalEventSystem, self.trigger_guide_id)
self.trigger_guide_id = false
end
if self.orientation_id then
EventSystem.UnBind(GlobalEventSystem, self.orientation_id)
self.orientation_id = false
end
if self.ui_camera_flag_change_id then
EventSystem.UnBind(GlobalEventSystem, self.ui_camera_flag_change_id)
self.ui_camera_flag_change_id = false
end
-- -- 去除模糊效果
-- if self.blur_activity_bg then
-- MainCamera.Instance:DisableBlurEffect(self.blur_anim_time)
-- end
-- 确认清除掉了界面动画效果
if self.fading_anim_id then
TweenLite.Stop(self.fading_anim_id)
self.fading_anim_id = nil
end
if self.scale_anim_id then
TweenLite.Stop(self.scale_anim_id)
self.scale_anim_id = nil
end
if self.autoDeleteList then
for i,v in ipairs(self.autoDeleteList) do
if v ~= nil then
v:DeleteMe()
end
end
self.autoDeleteList = nil
end
self.is_delete = true
UI.BindEventComp.UnBindAll(self)
if self.action_nodes then
for k,v in pairs(self.action_nodes) do
cc.ActionManager:getInstance():removeAllActionsFromTarget(v)
end
self.action_nodes = nil
end
if self.effect_nodes then
for k,v in pairs(self.effect_nodes) do
self:ClearUIEffect(v)
end
end
self:AfterDestroy()
BaseView.RemoveDestroyTimer(self)
if self.destroy_callback and self.is_loaded then
self.destroy_callback()
end
if self.show_loading then
LuaViewManager.RemoveLoadingView(lua_viewM, self._iid)
end
self.preparing_res = false
self.is_loaded = false
self.popChild = nil
self.parent_wnd = nil
self.transform = nil
self.cache_findChild = nil
self.preLoad_list = nil
self.back_item_contaner_list = false
self:DeleteModelBg()
self:DeleteMe()
LuaViewManager.DestroyView(lua_viewM,self.gameObject)
self.gameObject = nil
EventSystem.Fire(GlobalEventSystem,BaseView.DestroyEvent,self)
end
function BaseView:__delete()
self:RemoveUIFromBack()
if not self.is_delete then
self:CloseDestroy()
end
end
-- 显示子窗口
function BaseView:PopUpChild(win)
if win then
if self.popChild ~= nil and self.popChild ~= win then
self.popChild:SetVisible(false, true)
end
self.popChild = win
self.popChild:SetVisible(true, true)
if self.fire_change_visible_event then
GlobalEventSystem:Fire(BaseView.ChangeVisible, true)
end
end
end
function BaseView:GetBaseFile()
return self.base_file
end
function BaseView:GetChildren( names )
GetChildren(self, names)
end
--自销毁事件
function BaseView:BindEvent( bindDispather, eventName, handleFunc )
return UI.BindEventComp.BindEvent(self, bindDispather, eventName, handleFunc)
end
--关闭界面时销毁该节点
function BaseView:AutoDelete( deleteNode )
self.autoDeleteList = self.autoDeleteList or {}
table.insert(self.autoDeleteList, deleteNode)
end
--自销毁节点
function BaseView:CreateItem( class_name, parent, layer_name, ... )
if class_name and parent then
local item = class_name.New(parent, nil, layer_name, ... )
self:AutoDelete( item )
return item
end
end
--自销毁动作
function BaseView:AddAction( action, node )
self.action_nodes = self.action_nodes or {}
self.action_nodes[node] = node
--table.insert(self.action_nodes, node)
cc.ActionManager:getInstance():addAction(action, node)
end
--自销毁特效
function BaseView:CreateUIEffect( config )
if not config or not config.uiTranform then return end
self.effect_nodes = self.effect_nodes or {}
self:AddUIEffectConfig( config )
table.insert(self.effect_nodes, config.uiTranform)
end
--移出屏幕(隐藏,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
function BaseView:MoveOutOfScreen( transform )
transform = transform or self.transform
if transform then
self.base_move_from_pos_y = self.base_move_from_pos_y or GetLocalPositionY(transform)
SetLocalPositionY(transform, -99999)
end
end
--移回屏幕(显示,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
function BaseView:MoveInToScreen( transform )
transform = transform or self.transform
if transform and self.base_move_from_pos_y then
SetLocalPositionY(transform, self.base_move_from_pos_y)
self.base_move_from_pos_y = false
end
end
function BaseView:InitViewAnimation()
if self.full_screen or self.ani_left or self.ani_right then
--处理刘海屏的位移偏移
local width, offset = self:GetIpxOffset()
--右侧
self.ani_right_trans = self:GetChild("right")
if self.ani_right_trans then
self.ani_right_obj = self:GetChild("right").gameObject
self.old_ani_right_pos = self.ani_right_trans.anchoredPosition
if self.ani_right and ClientConfig.view_ani_mode == true then
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + 600, self.old_ani_right_pos.y)
else
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
end
end
--左侧
self.ani_left_trans = self:GetChild("left")
if self.ani_left_trans then
self.ani_left_obj = self:GetChild("left").gameObject
self.old_ani_left_pos = self.ani_left_trans.anchoredPosition
if self.ani_left and ClientConfig.view_ani_mode == true then
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x - 600 , self.old_ani_left_pos.y)
else
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset , self.old_ani_left_pos.y)
end
end
--中间
self:ResetMidNode()
--设置界面大小
local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
local rt = self.gameObject:GetComponent("RectTransform")
rt.sizeDelta = Vector2(MaxScreenWidth, ScreenHeight)
end
end
--播放界面入场动画
function BaseView:DoOpenAni(tab_id)
tab_id = tab_id or 1
self.ani_list = self.ani_list or {}
if not self.is_loaded or self.ani_list[tab_id] then return end
self.ani_list[tab_id] = true
self:DoOpenViewAnimation()
end
--处理界面动画
function BaseView:DoOpenViewAnimation()
local width, offset = self:GetIpxOffset()
if self.ani_right and self.ani_right_trans and ClientConfig.view_ani_mode == true then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + self.ani_right - offset, self.old_ani_right_pos.y)
local moveActionRight = cc.MoveTo.createAnchoredType(1, self.old_ani_right_pos.x - offset, self.ani_right_trans.anchoredPosition.y)
moveActionRight = cc.EaseExponentialOut.New(moveActionRight)
self:AddAction(moveActionRight, self.ani_right_trans)
end
if self.ani_left and self.ani_left_trans and ClientConfig.view_ani_mode == true then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + self.ani_left + offset, self.old_ani_left_pos.y)
local moveActionLeft = cc.MoveTo.createAnchoredType(1, self.old_ani_left_pos.x + offset, self.ani_left_trans.anchoredPosition.y)
moveActionLeft = cc.EaseExponentialOut.New(moveActionLeft)
self:AddAction(moveActionLeft, self.ani_left_trans)
end
end
--获取刘海屏位移
function BaseView:GetIpxOffset()
local width, offset = 0, 0
if ClientConfig.iphone_x_offset_left ~= 0 then
offset = ClientConfig.iphone_x_offset_left /2
width = ClientConfig.iphone_x_offset_left
elseif ClientConfig.iphone_x_offset_right then
offset = -ClientConfig.iphone_x_offset_right /2
width = ClientConfig.iphone_x_offset_right
end
return width, offset
end
--处理中间节点
function BaseView:ResetMidNode()
if self.adjust_mid then
local width, offset = self:GetIpxOffset()
local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
self.mid_trans = self:GetChild("mid")
if self.mid_trans then
self.adjust_mid.left = self.adjust_mid.left or 0
self.adjust_mid.right = self.adjust_mid.right or 0
local x = MaxScreenWidth - self.adjust_mid.left - self.adjust_mid.right
x = x / 2
SetAnchoredPosition(self.mid_trans, - (MaxScreenWidth / 2) + self.adjust_mid.left + x + offset, self.mid_trans.anchoredPosition.y)
end
end
end
--处理刘海屏,旋转屏幕
function BaseView:SetIpxMode()
self:ResetMidNode()
local width, offset = self:GetIpxOffset()
if self.ani_right_trans then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
end
if self.ani_left_trans then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset, self.old_ani_left_pos.y)
end
end
-- 进行打开界面的展示动画(淡入淡出)
-- close_callback:关闭界面的关闭回调
function BaseView:DoShowViewAnimation(show, close_callback, open_callback)
-- if not self.use_show_anim then return end
if not self.gameObject or not self.background_wnd_raw then return end
if (show and not self.use_show_anim) or (not show and not self.use_hide_anim) then
-- canvas_group.alpha = show and 1 or 0
return
end
local time = show and 0.1 or 0.1
self.background_wnd_raw.alpha = show and 0 or self.background_alpha
local target_alpha = show and self.background_alpha or 0
local function fading_anim_callback()
end
-- 关闭回调覆盖
if not show and close_callback then
fading_anim_callback = close_callback
end
self.fading_anim_id = TweenLite.to(self, self.background_wnd_raw, TweenLite.UiAnimationType.ALPHA, target_alpha, time, fading_anim_callback)
end
-- 进行打开界面的展示动画(缩放)
-- close_callback:关闭界面的关闭回调
function BaseView:DoShowViewScaleAnimation(show, close_callback, open_callback)
if self.do_show_animation == show then
if show then
if open_callback then
open_callback()
end
else
if close_callback then
close_callback()
end
end
return
end
self.do_show_animation = show
if not self.gameObject then return end
if (show and not self.use_show_anim) or (not show and not self.use_hide_anim) then
return
end
local function scale_anim_callback()
if show and self.background_wnd then
self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight)
end
end
local tween_type = show and TweenFunc.EASE_OUT_BACK or TweenFunc.EASE_IN_BACK
local cfg = show and BaseView.OpenCloseScaleCfg[1] or BaseView.OpenCloseScaleCfg[2]
local cur_scale = Vector3.New(cfg.start_scale, cfg.start_scale, cfg.start_scale)
local target_scale = Vector3.New(cfg.end_scale, cfg.end_scale, cfg.end_scale)
local time = cfg.time
if self.background_wnd then
local scale = show and cfg.start_scale or cfg.end_scale
if scale ~= 0 then
self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth / scale, ScreenHeight/scale)
end
end
SetLocalScale(self.gameObject.transform, cur_scale.x, cur_scale.y, cur_scale.z)
-- 关闭回调覆盖
if not show and close_callback then
scale_anim_callback = close_callback
end
if self.scale_anim_id then
TweenLite.Stop(self.scale_anim_id)
self.scale_anim_id = nil
end
self.scale_anim_id = TweenLite.to(self, self.gameObject.transform, TweenLite.UiAnimationType.SCALE, target_scale, time, scale_anim_callback, tween_type)
if not show then
GlobalEventSystem:Fire(EventName.BASEVIEW_DO_VIEW_ANIM, show, self)
end
end
--把界面的UI节点移动到背景层
function BaseView:MoveUIToBack(node, args, camera_args,activity_args)
self.move_node_list = self.move_node_list or {}
if self.background_wnd and not self.blur_activity_bg then--没有高斯模糊才这样设置
--self.background_wnd:GetComponent("RawImageExtend").alpha = 0
end
if node then
local t = {node = node, args = args, parent = node.transform.parent, sibling_idx = node.transform:GetSiblingIndex()}
table.insert(self.move_node_list, t)
LuaViewManager:getInstance():ShowBackData({
target = self,
node_list ={[1] = t},
camera_args = camera_args,
activity = activity_args,
})
if #self.move_node_list == 1 and self.use_show_anim then
GlobalEventSystem:Fire(EventName.BASEVIEW_DO_VIEW_ANIM, true, self)
end
end
end
--显示后模型摄像机
function BaseView:ShowBackModeCamera(camera_args)
if self.background_wnd and not self.blur_activity_bg then--没有高斯模糊才这样设置
self.background_wnd:GetComponent("RawImageExtend").alpha = 0
end
camera_args = camera_args or LuaViewManager.CameraArgs.DepthZero
self.show_back_camera = true
LuaViewManager:getInstance():ShowBackData({
target = self,
camera_args = camera_args,
})
end
--把界面的UI节点从背景层中移除
function BaseView:RemoveUIFromBack()
self.move_node_list = self.move_node_list or {}
if #self.move_node_list > 0 or self.show_back_camera then
LuaViewManager:getInstance():HideBackData(self)
end
end
--根据界面状态显示隐藏在背景层中的UI
function BaseView:SetBackUIVisible(state)
if self.move_node_list then
for k,v in pairs(self.move_node_list) do
if state == true then
if v.is_hide_form_view then
v.node.gameObject:SetActive(true)
v.is_hide_form_view = nil
end
else
if v.node.gameObject and v.node.gameObject.activeSelf == true then
v.node.gameObject:SetActive(false)
v.is_hide_form_view = true
end
end
end
end
if self.back_item_contaner_list then
for k,v in pairs(self.back_item_contaner_list) do
v:SetBackUIVisible(state, true)
end
end
end
--设置界面的子页签(针对挂模型的界面)
function BaseView:AppendToBackContainer(child_item)
if child_item then
self.back_item_contaner_list = self.back_item_contaner_list or {}
table.insert(self.back_item_contaner_list, child_item)
end
end
--做界面打开动画(缩放动画)
function BaseView:PlayOpenMovie()
do return false end
-- print("huangcong:BaseView当前帧率", SceneManager and SceneManager:getInstance().curr_frame_rate or 0)
-- print("huangcong:BaseView帧率上限 :", lua_settingM:GetFrameRate())
-- print("huangcong:BaseView是否开启开启界面动画 :", self.need_movie_type)
-- print("huangcong:BaseView是否销毁监听:",self.open_tween_id_2)
if (SceneManager and SceneManager:getInstance().curr_frame_rate > 52) --当前帧率
and lua_settingM:GetFrameRate() > 51 --帧率上限
and self.transform and self.use_background and self.hide_maincancas
and (self.need_movie_type or lua_viewM.main_cancas_last_visible)
and not self.open_tween_id_2 then
self.has_played_open_movie = true
SetLocalScale(self.transform, 0.90, 0.90, 0.90)
local function onComplete()
self.open_tween_id_2 = nil
end
self.open_tween_id_2 = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, Vector3.one ,0.1, onComplete)
end
end
function BaseView:ClearOpenMovieId()
if self.open_tween_id_1 then
TweenLite.Stop(self.open_tween_id_1)
self.open_tween_id_1 = nil
end
if self.open_tween_id_2 then
TweenLite.Stop(self.open_tween_id_2)
self.open_tween_id_2 = nil
end
end
--做界面关闭动画(暂时不需要)
function BaseView:PlayCloseMovie()
do return false end
if self.transform and self.has_played_open_movie and not self.close_tween_id_1 then
self.has_played_open_movie = false
LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true)
local function onComplete()
self:ClearCloseMovieId()
self:CloseVisible()
if self.destroy_imm then
self:Destroy()
else
BaseView.AddDestroyTimer(self)
end
end
if lua_viewM:GetViewNum() >= 2 or (SceneManager and SceneManager:getInstance().curr_frame_rate < 50) then
onComplete()
return
end
if not self.close_tween_id_1 then
--先清理模型
if self.popChild then
lua_resM:clearRoleMode(self.popChild)
end
local canvas_group = self.transform:GetComponent("CanvasGroup")
if not canvas_group then
canvas_group = self.gameObject:AddComponent(typeof(UnityEngine.CanvasGroup))
end
self.close_tween_id_1 = TweenLite.to(self, canvas_group, TweenLite.UiAnimationType.ALPHA, 0.1, 0.13)
self.close_tween_id_2 = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, Vector3.one * 0.88, 0.14, onComplete)
end
return true
else
return false
end
end
function BaseView:ClearCloseMovieId()
if self.close_tween_id_1 then
TweenLite.Stop(self.close_tween_id_1)
self.close_tween_id_1 = nil
end
if self.close_tween_id_2 then
TweenLite.Stop(self.close_tween_id_2)
self.close_tween_id_2 = nil
end
end
function BaseView:BindLittleMove(node_trans, dir, target_pos)
if not node_trans or not dir or not target_pos then return end
if not self.little_move_event then
self.little_move_event = true
local function onLittleMove(is_out)
if not self.little_move_is_show_anim and not is_out then
self.little_move_is_show_anim = true
end
self:BaseViewLittleMove(is_out)
self.is_out = is_out
end
self:BindEvent(GlobalEventSystem, EventName.PLAY_MAINUI_MOVIE_EVENT, onLittleMove)
end
self.little_move_table = self.little_move_table or {}
table.insert(self.little_move_table, {node_trans = node_trans, dir = dir, target_pos = target_pos})
--如果不做动画,则直接调整刘海适配
if not ClientConfig.can_little_move then
local function onOrientationChange()
if self.is_loaded and not self._use_delete_method then
self:BaseViewOrientationChange()
end
end
if not self.orientation_id then
self.orientation_id = self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
end
local x, y = GetAnchoredPosition( node_trans)
if dir == BaseView.LittleMoveDir.Left then
node_trans.anchoredPosition = Vector2( target_pos + ClientConfig.iphone_x_offset_left , y)
elseif dir == BaseView.LittleMoveDir.Right then
node_trans.anchoredPosition = Vector2( target_pos - ClientConfig.iphone_x_offset_right, y)
elseif dir == BaseView.LittleMoveDir.Top then
node_trans.anchoredPosition = Vector2( x, target_pos)
else
node_trans.anchoredPosition = Vector2( x, target_pos)
end
return
end
--初始化节点的位置
local x, y = GetAnchoredPosition(node_trans)
if dir == BaseView.LittleMoveDir.Left then
node_trans.anchoredPosition = Vector2(target_pos + ClientConfig.iphone_x_offset_left-MainUIModel.LITTLE_MOVE_DIST, y)
elseif dir == BaseView.LittleMoveDir.Right then
node_trans.anchoredPosition = Vector2(target_pos - ClientConfig.iphone_x_offset_right+MainUIModel.LITTLE_MOVE_DIST , y)
elseif dir == BaseView.LittleMoveDir.Top then
node_trans.anchoredPosition = Vector2( x,target_pos+MainUIModel.LITTLE_MOVE_DIST)
else
node_trans.anchoredPosition = Vector2( x,target_pos-MainUIModel.LITTLE_MOVE_DIST)
end
if self.little_move_load_view_time_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.little_move_load_view_time_id)
self.little_move_load_view_time_id = false
end
local function open_view_little_move_func()
if not self.little_move_is_show_anim then
self:BaseViewLittleMove()
end
end
self.little_move_is_show_anim = false
self.little_move_load_view_time_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, open_view_little_move_func, 0.1)
local function onOrientationChange()
if self.is_loaded and not self._use_delete_method and self.littleMove_is_anim then
self:BaseViewLittleMoveOrientationChange()
end
end
if not self.orientation_id then
self.orientation_id = self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
end
end
function BaseView:StopLittleMoveAnim()
if self.little_move_tween_list and #self.little_move_tween_list > 0 then
for i,v in ipairs(self.little_move_tween_list) do
TweenLite.Stop(v)
end
self.little_move_tween_list = false
end
if self.little_move_load_view_time_id then
TimerQuest.CancelQuest(GlobalTimerQuest, self.little_move_load_view_time_id)
self.little_move_load_view_time_id = false
end
end
--屏幕翻转
function BaseView:BaseViewLittleMoveOrientationChange( )
if self.is_out then
for i,v in ipairs(self.little_move_table) do
local x, y = GetAnchoredPosition( v.node_trans)
if v.dir == BaseView.LittleMoveDir.Left then
v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left - MainUIModel.LITTLE_MOVE_OUT_DIST, y)
elseif v.dir == BaseView.LittleMoveDir.Right then
v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right + MainUIModel.LITTLE_MOVE_OUT_DIST, y)
elseif v.dir == BaseView.LittleMoveDir.Top then
v.node_trans.anchoredPosition = Vector2( x, v.target_pos + MainUIModel.LITTLE_MOVE_OUT_DIST)
else
v.node_trans.anchoredPosition = Vector2( x, v.target_pos - MainUIModel.LITTLE_MOVE_OUT_DIST)
end
end
else
self:BaseViewOrientationChange()
end
end
--屏幕翻转时,位置纠正
function BaseView:BaseViewOrientationChange( )
for i,v in ipairs(self.little_move_table) do
local x, y = GetAnchoredPosition( v.node_trans)
if v.dir == BaseView.LittleMoveDir.Left then
v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left , y)
elseif v.dir == BaseView.LittleMoveDir.Right then
v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right, y)
elseif v.dir == BaseView.LittleMoveDir.Top then
v.node_trans.anchoredPosition = Vector2( x, v.target_pos)
else
v.node_trans.anchoredPosition = Vector2( x, v.target_pos)
end
end
end
function BaseView:BaseViewLittleMove( is_out )
if not self.little_move_table or #self.little_move_table <= 0 then return end
self:StopLittleMoveAnim()
self.little_move_tween_list = {}
self.littleMove_is_anim = true
local function end_func( ... )
self.littleMove_is_anim = false
end
if is_out then
for i,v in ipairs(self.little_move_table) do
local x, y = GetAnchoredPosition( v.node_trans)
if v.dir == BaseView.LittleMoveDir.Left then
v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left, y)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos + ClientConfig.iphone_x_offset_left - MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME, end_func)
elseif v.dir == BaseView.LittleMoveDir.Right then
v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right, y)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos - ClientConfig.iphone_x_offset_right + MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func)
elseif v.dir == BaseView.LittleMoveDir.Top then
v.node_trans.anchoredPosition = Vector2( x, v.target_pos)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos + MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func)
else
v.node_trans.anchoredPosition = Vector2( x, v.target_pos)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos - MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func)
end
end
else
for i,v in ipairs(self.little_move_table) do
local x, y = GetAnchoredPosition( v.node_trans)
if v.dir == BaseView.LittleMoveDir.Left then
v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left-MainUIModel.LITTLE_MOVE_DIST, y)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos + ClientConfig.iphone_x_offset_left , MainUIModel.LITTLE_MOVE_TIME,end_func)
elseif v.dir == BaseView.LittleMoveDir.Right then
v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right+MainUIModel.LITTLE_MOVE_DIST , y)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos - ClientConfig.iphone_x_offset_right, MainUIModel.LITTLE_MOVE_TIME,end_func)
elseif v.dir == BaseView.LittleMoveDir.Top then
v.node_trans.anchoredPosition = Vector2( x, v.target_pos+MainUIModel.LITTLE_MOVE_DIST)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos , MainUIModel.LITTLE_MOVE_TIME,end_func)
else
v.node_trans.anchoredPosition = Vector2( x, v.target_pos-MainUIModel.LITTLE_MOVE_DIST)
self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos , MainUIModel.LITTLE_MOVE_TIME,end_func)
end
end
end
end
-- 绑定主界面聊天UI的展开(展开时被遮挡的UI绑定这个事件后会隐藏掉UI)
function BaseView:BindMainUIExpandEvent( con_tran )
if not con_tran or (not con_tran.gameObject) then return end
self.main_ui_func_btn_con_list = self.main_ui_func_btn_con_list or {}
if TableSize(self.main_ui_func_btn_con_list) <= 0 then
local function set_func_btn_show()
self:SetFuncBtnShow()
end
self:BindEvent(GlobalEventSystem, EventName.MAIN_UI_CON_EXPAND, set_func_btn_show)
end
table.insert(self.main_ui_func_btn_con_list, con_tran)
-- 初始化一次
self:SetFuncBtnShow()
end
-- 设置fun_btn的显示状态
function BaseView:SetFuncBtnShow( )
local main_ui_is_expand = MainUIModel:getInstance():MainChatUIIsExpand()
for k,v in pairs(self.main_ui_func_btn_con_list) do
v.gameObject:SetActive(not main_ui_is_expand)
end
end