---------------移动跨场景寻路操作包---------------- SourceOperateCrossSceneAction = SourceOperateCrossSceneAction or BaseClass(SourceOperate) local SourceOperateCrossSceneAction = SourceOperateCrossSceneAction function SourceOperateCrossSceneAction:__init(scene_id, end_pos, change_scene_callback, action_func, arg_list) self.type = OperateManager.SourceOperateType.CrossScene self.init_time = 0 self.src_scene_id = SceneManager.Instance:GetSceneId() self.target_scene_id = scene_id self.target_scene_pos = end_pos self.change_scene_callback = change_scene_callback self.action_func = action_func self.arg_list = arg_list self.is_path_valid = false self.path_list = nil self.now_move_src_oper = false self.scene_path = nil self.now_scene_id = nil end function SourceOperateCrossSceneAction:__delete( ) if self.now_move_src_oper then self.now_move_src_oper:DeleteMe() self.now_move_src_oper = false end end function SourceOperateCrossSceneAction:Init() self.init_time = Status.NowTime local target_scene_info = ConfigItemMgr.Instance:GetSceneItem(self.target_scene_id) if not target_scene_info then return false end self.scene_path = SceneConnectMap.Instance:FindPath(self.src_scene_id, self.target_scene_id) if List.Empty(self.scene_path) then return false end return true end function SourceOperateCrossSceneAction:BeforeDelete() local now_scene_id = SceneManager.Instance:GetSceneId() local cur_src_oper = self.now_move_src_oper if not self.is_finish and cur_src_oper and cur_src_oper.now_use_pair and cur_src_oper.total_pair and cur_src_oper.now_use_pair < cur_src_oper.total_pair then local cross_scene = {id = self.target_scene_id,pos = self.target_scene_pos,change_scene_callback = self.change_scene_callback} OperateManager.Instance:CheckJumpAction(cur_src_oper.now_use_pair,cur_src_oper.path_list,self.action_func,self.arg_list,cross_scene) end end function SourceOperateCrossSceneAction:ClearNowMoveSrcOper() if self.now_move_src_oper then self.now_move_src_oper:DeleteMe() self.now_move_src_oper = false end end function SourceOperateCrossSceneAction:GetOperImpl() local now_scene_id = SceneManager.Instance:GetSceneId() --由于现在走到传送门附近就会触发传送,所以可能now_move_src_oper还没完成,就传到另一个场景,导致主角卡住不动了 --切换了场景,就要删掉 if self.now_scene_id ~= now_scene_id then self:ClearNowMoveSrcOper() end if self.now_move_src_oper and not self.now_move_src_oper:IsFinish() then return self.now_move_src_oper:GetOper() end if self.src_scene_id ~= now_scene_id and self.change_scene_callback then local is_finish = self.change_scene_callback(now_scene_id) if is_finish ~= nil and is_finish == true then self.is_finish = true --由外部来终止这个操作包 return self:GenerateNop(0.2) end end if self.now_scene_id == now_scene_id then return self:GenerateNop(0.2) elseif not Scene.Instance:IsSceneLoaded() then return self:GenerateNop(0.2) end if self.target_scene_id == now_scene_id then if self.target_scene_pos then self.now_move_src_oper = SourceOperateMove.New(self.target_scene_pos, nil) self.target_scene_pos = nil else self.is_finish = true if self.action_func then self.action_func(unpack(self.arg_list)) end return self:GenerateNop(0.2) end else if self.scene_path == nil then return nil end local path_now_scene_id = List.PopFront(self.scene_path) if path_now_scene_id ~= now_scene_id then self.is_finish = true return self:GenerateNop(0.2) end local now_target_scene_id = List.GetFront(self.scene_path) local door_info = SceneManager.Instance:GetSceneDoorInfo(now_target_scene_id, path_now_scene_id) if not door_info then self.is_finish = true return self:GenerateNop(0.2) end self.now_scene_id = now_scene_id local door_pos = co.TableXY(door_info.x / SceneObj.LogicRealRatio.x, door_info.y / SceneObj.LogicRealRatio.y) local cross_scene_req = function () -- EventSystem.Fire(GlobalEventSystem,SceneEventType.REQUEST_CHANGE_SCENE, door_info.id) end self.now_move_src_oper = SourceOperateMove.New(door_pos, cross_scene_req, self.arg_list) EventSystem.Fire(GlobalEventSystem,EventName.FINDWAY_STARTED) end return self.now_move_src_oper:GetOper() end