源战役客户端
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

1896 satır
61 KiB

  1. require "bit"
  2. MainCamera = MainCamera or BaseClass(BaseModel)
  3. local MainCamera = MainCamera
  4. local Scene = Scene
  5. local GlobalEventSystem = GlobalEventSystem
  6. local SceneEventType = SceneEventType
  7. local IsTableEmpty = IsTableEmpty
  8. local GameMath = GameMath
  9. local Time = Time
  10. local math_abs = math.abs
  11. local math_sin = math.sin
  12. local table_remove = table.remove
  13. local table_insert = table.insert
  14. local GameMath_Lerp = GameMath.Lerp
  15. local ReleaseTemporary = UnityEngine.RenderTexture.ReleaseTemporary
  16. local Clamp = Mathf.Clamp
  17. --摄像机和主角的平面距离
  18. CameraDistanceWithMainRole = 10.7
  19. --摄像机可视范围
  20. CameraDefaultFieldofView = 37
  21. --摄像机和地面夹角
  22. SceneCameraRotate = 40.0
  23. --摄像机离地面高度
  24. SceneCameraHeigth = 10.0
  25. MainCamera.PixelsToUnits = 100 --像素坐标比例
  26. MainCamera.SmoothMode = true --摄像机开启平滑
  27. MainCamera.SmoothTime = 0.1 --摄像机平滑时间
  28. MainCamera.ScreenCenterOffset = 0 --摄像机偏移主角位置像素值
  29. MainCamera.ScreenScale = 1.1 --摄像机视窗缩放
  30. MainCamera.SizeSmoothSpeed = 1 --摄像机缩放的时候的默认速度
  31. MainCamera.SmoothState = { --摄像机缓动类型,对应着不同参数
  32. Normal = 0,
  33. Jump = 1,
  34. Skill = 2,
  35. Jump_Point = 3,
  36. Horse = 4,
  37. Speed_Buff = 5,
  38. Quiz = 6,
  39. NewBieTask = 7,
  40. TaskJump = 8,
  41. Flash = 9,
  42. None = 10,
  43. SpecialDun = 11,
  44. JUMP_ONE = 12,
  45. }
  46. --摄像机旋转相关参数
  47. MainCamera.role_last_angle = 0
  48. MainCamera.role_cur_angle = 0
  49. MainCamera.role_angle_off = 0
  50. MainCamera.role_from_camera_angle = 0
  51. MainCamera.role_last_rotate_area = false
  52. MainCamera.camera_cur_angle = 0
  53. MainCamera.camera_target_angle = 0
  54. MainCamera.camera_enable_rotate = false
  55. -------------------------------------高斯模糊相关-------------------------------------
  56. -- 屏幕后处理预设
  57. -- MainCamera.RenderEffectPreset = {
  58. -- Grayed = {brightness = 1, saturation = 0, contrast = 1}, -- 灰化预设
  59. -- }
  60. -- 激活了后处理效果
  61. -- MainCamera.Activiting_Render_Effect = false
  62. -- 特效相机类型 默认情况下,黑白化只需要MainCamera,一般大界面(全屏显示)的高斯模糊只需要模糊UI摄像机
  63. MainCamera.EffectCameraType = {
  64. MainCamera = 0, -- 主场景摄像机
  65. UICamera = 1, -- ui摄像机(由于渲染顺序的问题,只要处理了UI摄像机,主摄像机的画面效果也会被影响,后续处理中注意避免两个特效同时开启)
  66. }
  67. -- 激活了模糊效果
  68. MainCamera.Activiting_Blur_Effect = false
  69. MainCamera.FreeCameraViewOpened = false -- 是否打开了自由摄像机调试界面
  70. function MainCamera:__init()
  71. if MainCamera.Instance ~= nil then
  72. LogError("MainCamera is a singleton class")
  73. end
  74. MainCamera.Instance = self
  75. self.smoothTarget = nil
  76. self.firstMove = true
  77. self.rendering_blur_screenShot = false
  78. self.round_robin_cache_list = {}
  79. self.gameObject = GameObject.Find("root/MainCameraRoot") --3D中摄像机分成两个层级控制,ROOT中控制旋转和位置,Camera控制俯视角度以及摄像机与玩家的距离
  80. if self.gameObject then
  81. self.transform = self.gameObject.transform
  82. self.camera_gameObject = GameObject.Find("root/MainCameraRoot/MainCamera")
  83. self.camera = self.camera_gameObject:GetComponent("Camera") --这里用GetComponentInChildren总是报错不知道为啥
  84. SetGlobalPosition(self.camera.transform, 0, 0, -CameraDistanceWithMainRole)
  85. self.camera.backgroundColor = Color(0,0,0,0)
  86. self.camera.farClipPlane = 1900
  87. self.camera_base_size_original = ScreenHeight / MainCamera.PixelsToUnits * 0.5
  88. self.camera_base_size = CameraDefaultFieldofView
  89. self:SetCameraSize(60)
  90. self.camera_curr_size = self.camera_base_size
  91. self.uiCamera_gameObject=GameObject.Find("root/UICamera")
  92. self.uiCamera=self.uiCamera_gameObject:GetComponent("Camera")
  93. self.camera.fieldOfView = CameraDefaultFieldofView
  94. --剧情动画摄像机
  95. self.story_cam_obj = GameObject.Find("root/StoryCamera")
  96. if self.story_cam_obj then
  97. self.story_cam_obj:SetActive(false)
  98. end
  99. -- 剧情摄像机添加径向模糊
  100. self.story_radiusBlur = self.story_cam_obj:AddComponent(typeof(RadiusBlur))
  101. self.story_radiusBlur.enabled = false
  102. self.story_radiusBlur.radius_material = ShaderTools.GetRadiusMaterial()
  103. -- 添加径向模糊默认值
  104. self:SetStoryCameraRadiusData(0.5, 0.5, 0.01)
  105. self:SetStoryCameraRadiusIteration(10)
  106. -- 高斯模糊摄像机
  107. -- self.blurCamera_gameObject = GameObject.Find("root/BlurCamera")
  108. -- self.blurCamera = self.blurCamera_gameObject:GetComponent("Camera")
  109. -- 获取到摄像机后就隐藏起来
  110. -- self.blurCamera.enabled = false
  111. ------------////////////////////////////
  112. -- 整合屏幕后处理效果PostEffect
  113. -- 目标的纹理降低采样率比率和迭代次数设置
  114. self.main_blur_downSample_value = 4
  115. self.ui_blur_downSample_value = 5
  116. -- 主摄像机后处理
  117. self:ApplyMainPostEffect()
  118. -- UI摄像机后处理
  119. -- if not self.ui_postEffect then
  120. -- self.ui_postEffect = self.uiCamera_gameObject:GetComponent(typeof(PostEffect))
  121. -- end
  122. -- if not IsNull(self.ui_postEffect) then
  123. -- -- if not self:IsSupportPostEffect() then
  124. -- -- self.ui_postEffect.enabled = false
  125. -- -- else
  126. -- -- self.ui_postEffect.enabled = true
  127. -- -- 设置FXAA参数
  128. -- self.ui_postEffect.EnableFXAA = false
  129. -- -- 设置泛光模糊参数
  130. -- self.ui_postEffect.EnableBloom = false
  131. -- -- 设置模糊参数
  132. -- self.ui_postEffect.EnableBlur = true
  133. -- self.ui_postEffect.recurveMaxNum = 4
  134. -- self.ui_postEffect.blurSpread = 2
  135. -- self.ui_postEffect.use_dual_blur = true
  136. -- -- 应用数据到材质球
  137. -- self.ui_postEffect:ApplyBloomMaterialProperties()
  138. -- self.ui_postEffect:ApplyFXAAMaterialProperties()
  139. -- -- end
  140. -- end
  141. -- 检测设备是否支持后处理
  142. self:SetRenderSupport()
  143. if not self.is_screen_effect_supported then
  144. if not IsNull(self.main_postEffect) then
  145. self.main_postEffect.enabled = false
  146. end
  147. -- if not IsNull(self.ui_postEffect) then
  148. -- self.ui_postEffect.enabled = false
  149. -- end
  150. end
  151. ------------////////////////////////////
  152. end
  153. self.screen_obj_count = 0 --屏幕摄像机对象数量
  154. self.is_update_camera = true
  155. self.is_lock_camera = false --是否锁定摄像机
  156. self.lock_camera_pos = false --锁定的位置
  157. self.lock_move_speed = 0 --锁定的时候的移动速度
  158. self.is_change_size = false --摄像机是否在改变大小
  159. self.camera_move_speed = co.Vector2(0,0)
  160. self.real_now_pos = co.Vector2(0,0)
  161. self.orthographic_state = false --默认正交摄像机
  162. self.rotate_around = 0
  163. self.maxDistance = 2 --摄像机跟随的最大距离限制,超过这个距离就会达到最大速度也就是刚好跟着主角移动
  164. self.maxSpeed = 0.2 --摄像机跟随移动的最大速度,需要大于等于人物的移动速度
  165. self.isSmooth = MainCamera.SmoothMode
  166. self.targetSmoothSpeed = self.maxSpeed
  167. self.smoothState = MainCamera.SmoothState.Normal --相机平滑移动的状态,不同状态速度不同
  168. self.can_scale_camera = true
  169. self.shake_elements_list = {}
  170. self.temp_pos = {x = 0,y = 0,z = 0}
  171. self.temp_shake_pos = {x = 0,y = 0}
  172. self.camera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  173. self.size_smooth_list ={}
  174. self.is_showing_sky_res = false --是否正常显示全屏天空盒
  175. self.cur_terrain_alpha = false
  176. local function sceneChanged() ---在切换场景的时候,取消缓动效果
  177. self.isSmoothing = false
  178. if not SceneManager.Instance:IsPkRankFightScene() and self.smoothTarget and self.is_update_camera then
  179. self.transform.position = self.smoothTarget --处理重复进入同一个场景的时候,比如切换角色但是选择的还是当前角色
  180. self.size_smooth_list = {}
  181. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  182. end
  183. local dun_id = SceneManager.Instance:GetCurrDunId()
  184. local camera_config = Config.ConfigSceneCamera.LockDungeon[dun_id]
  185. if camera_config then
  186. local function on_set_camera_mode( )
  187. local cur_dun_id = SceneManager.Instance:GetCurrDunId()
  188. if cur_dun_id ~= dun_id then
  189. return
  190. end
  191. self.use_special_camera = true
  192. self:SetSpecialDunMode(camera_config)
  193. MainCamera.camera_enable_rotate = false
  194. end
  195. if camera_config.is_delay then
  196. setTimeout(on_set_camera_mode, 1)
  197. else
  198. on_set_camera_mode()
  199. end
  200. elseif self.use_special_camera then
  201. self.use_special_camera = false
  202. self:QuitSpecialDunMode()
  203. end
  204. self.block_smooth = false
  205. print("MainCamera Load Complete")
  206. self:HideBlackSky(self.black_sky_res)
  207. end
  208. local function ReEnter()
  209. if SceneManager:getInstance():IsGemDungeon() or SceneManager:getInstance():IsGodHoodDungeon() then --这两个副本,在第一次进去的时候,不要无缝切换,第二次开始才无缝切换
  210. self.size_smooth_list = {}
  211. self.isSmoothing = false
  212. self.block_smooth = true
  213. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  214. end
  215. self:HideBlackSky(self.black_sky_res)
  216. end
  217. GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE,sceneChanged)
  218. GlobalEventSystem:Bind(SceneEventType.SCENE_REENTER, ReEnter)
  219. local load_call_back = function(objs)
  220. if objs and objs[0] then
  221. self.intoscene_effect = newObject(objs[0])
  222. self.intoscene_effect.transform:SetParent(self.camera.transform)
  223. self.intoscene_effect.transform.localEulerAngles = Vector3(0, 0, 0)
  224. SetLocalPosition(self.intoscene_effect.transform,0)
  225. self.intoscene_effect:SetActive(false)
  226. end
  227. end
  228. local change_scene_particle = "camfx_scenetransform"
  229. lua_resM:loadPrefab(self, change_scene_particle, change_scene_particle, load_call_back, nil, ASSETS_LEVEL.LOW)
  230. local main_canvas_change = function( state )
  231. if state then
  232. self.isSmooth = MainCamera.SmoothMode
  233. else
  234. self.isSmooth = false
  235. end
  236. end
  237. LuaViewManager.Instance:Bind(LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE,main_canvas_change)
  238. end
  239. function MainCamera:getInstance()
  240. if MainCamera.Instance == nil then
  241. MainCamera.New()
  242. end
  243. return MainCamera.Instance
  244. end
  245. function MainCamera:ApplyMainPostEffect( )
  246. self.is_login_post_effect_state = false
  247. if not self.main_postEffect then
  248. self.main_postEffect = self.camera_gameObject:GetComponent(typeof(PostEffect))
  249. end
  250. if not IsNull(self.main_postEffect) then
  251. -- 主摄像机,高端设备上开泛光
  252. if not self:IsSupportPostEffect() then
  253. self.main_postEffect.enabled = false
  254. else
  255. self.main_postEffect.enabled = true
  256. -- 设置泛光模糊参数
  257. self.main_postEffect.EnableBloom = true
  258. self.main_postEffect.threshold = 0.65
  259. self.main_postEffect.intensity = 1.2
  260. self.main_postEffect.blurSize = 1
  261. self.main_postEffect.blurIterations = 1
  262. self.main_postEffect.use_dual_bloom = true
  263. -- 设置FXAA参数
  264. self.main_postEffect.EnableFXAA = false
  265. -- 设置模糊参数
  266. self.main_postEffect.EnableBlur = false
  267. -- 应用数据到材质球
  268. self.main_postEffect:ApplyBloomMaterialProperties()
  269. end
  270. end
  271. end
  272. --登录镜头特殊处理
  273. function MainCamera:ApplyLoginPostEffect( )
  274. self.is_login_post_effect_state = true
  275. local function on_login_effect( )
  276. if not self.main_postEffect then
  277. self.main_postEffect = self.camera_gameObject:GetComponent(typeof(PostEffect))
  278. end
  279. if not IsNull(self.main_postEffect) then
  280. -- 主摄像机,中高端设备上开泛光
  281. if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
  282. self.main_postEffect.enabled = false
  283. else
  284. self.main_postEffect.enabled = true
  285. -- 设置泛光模糊参数
  286. self.main_postEffect.EnableBloom = true
  287. self.main_postEffect.threshold = 0.8
  288. self.main_postEffect.intensity = 2.64
  289. self.main_postEffect.blurSize = 2.5
  290. self.main_postEffect.blurIterations = 3
  291. self.main_postEffect.use_dual_bloom = true
  292. -- 设置FXAA参数
  293. self.main_postEffect.EnableFXAA = false
  294. -- 设置模糊参数
  295. self.main_postEffect.EnableBlur = false
  296. -- 应用数据到材质球
  297. self.main_postEffect:ApplyBloomMaterialProperties()
  298. end
  299. end
  300. end
  301. on_login_effect()
  302. setTimeout(on_login_effect, 0.1)
  303. end
  304. function MainCamera:ShowEnterSceneEffect()
  305. -- 新手2002副本出来要衔接剧情,不用特效
  306. local last_dun_id = SceneManager:getInstance():GetLastDunId()
  307. if last_dun_id and last_dun_id == 2002 then
  308. return
  309. end
  310. local hide_func = function()
  311. if self.intoscene_effect then
  312. self.intoscene_effect:SetActive(false)
  313. self.effect_id = nil
  314. end
  315. end
  316. if self.effect_id then
  317. GlobalTimerQuest:CancelQuest(self.effect_id)
  318. self.effect_id = nil
  319. if self.intoscene_effect then
  320. self.intoscene_effect:SetActive(false)
  321. end
  322. end
  323. if self.intoscene_effect then
  324. self.intoscene_effect:SetActive(true)
  325. end
  326. if not self.effect_id then
  327. self.effect_id = GlobalTimerQuest:AddDelayQuest(hide_func,3)
  328. end
  329. end
  330. function MainCamera:GetScreenEffectCamere()
  331. if self.screen_effect_camera == nil then
  332. self.screen_effect_camera = UiFactory.createChild(self.transform, UIType.Camera3D, "Camera3D")
  333. self.screen_effect_camera.transform.localRotation = Quaternion.Euler(30,-90,0)
  334. self.screen_effect_camera:SetActive(not lua_settingM:GetBlockProperty("scenePtc"))
  335. end
  336. return self.screen_effect_camera
  337. end
  338. function MainCamera:DestoryScreenEffectCamere()
  339. if self.screen_effect_camera then
  340. destroy(self.screen_effect_camera)
  341. self.screen_effect_camera = nil
  342. end
  343. end
  344. function MainCamera:SetScreenEffectCamereState( state )
  345. if self.screen_effect_camera then
  346. self.screen_effect_camera:SetActive(state)
  347. end
  348. end
  349. --[[设置摄像机的视野范围 注意:修改的参数是 fieldOfView 而不是transform的scale或者位置
  350. size
  351. isSmooth
  352. ]]
  353. function MainCamera:SetCameraSize(size, isSmooth)
  354. if self.camera.fieldOfView == size then
  355. return
  356. end
  357. if isSmooth then
  358. if not self.size_smooth_list then
  359. self.size_smooth_list = {}
  360. end
  361. table_insert(self.size_smooth_list,size)
  362. else
  363. self.size_smooth_list = nil
  364. self.size_smooth_list = {}
  365. self.camera_curr_size = size
  366. self.camera.fieldOfView = size
  367. if self.screencamera then
  368. self.screencamera.fieldOfView = size
  369. end
  370. end
  371. -- if Scene.Instance and not specialScene then
  372. -- local now_pos = self.real_now_pos
  373. -- local cam_scale = MainCamera.ScreenScale * size / self.camera_base_size
  374. -- local half_target_width = SrcScreenWidth * cam_scale / 2
  375. -- local half_target_height = ScreenHeight * cam_scale / 2
  376. -- local scene_size = Scene.Instance:GetSceneSize()
  377. -- local scene_width = scene_size.x - half_target_width
  378. -- local scene_height = scene_size.y - half_target_height
  379. -- if half_target_width < scene_width then
  380. -- if now_pos.x < half_target_width then
  381. -- return
  382. -- elseif now_pos.x > scene_width then
  383. -- return
  384. -- end
  385. -- else
  386. -- return
  387. -- end
  388. -- if half_target_height < scene_height then
  389. -- if now_pos.y < half_target_height then
  390. -- return
  391. -- elseif now_pos.y > scene_height then
  392. -- return
  393. -- end
  394. -- else
  395. -- return
  396. -- end
  397. -- end
  398. GlobalEventSystem:Fire(SceneEventType.CAMERA_CHANGE_SIZE, self.camera_curr_size / self.camera_base_size)
  399. -- if Scene.Instance and Scene.Instance.main_role then --3D项目就不用改变玩家模型大小了
  400. -- local curr_scale = math.pow(self.camera_curr_size / self.camera_base_size, Config.otherFightInfo.mainrole_jump_scale)
  401. -- if Scene.Instance.main_role.name_board then
  402. -- Scene.Instance.main_role.name_board:SetScale(curr_scale)
  403. -- end
  404. -- Scene.Instance.main_role:SetScale(curr_scale)
  405. -- end
  406. end
  407. function MainCamera:SetBaseCameraSize(size)
  408. if not self.can_scale_camera then
  409. return
  410. end
  411. self.camera_curr_size = size
  412. self:SetCameraSize(size)
  413. end
  414. function MainCamera:GetCameraRatio()
  415. -- return self.camera_curr_size / self.camera_base_size_original
  416. return self.camera_curr_size / self.camera_base_size
  417. end
  418. function MainCamera:ScaleCamera( scale )
  419. self:SetCameraSize(self.camera_base_size * scale)
  420. end
  421. function MainCamera:GetCameraPos()
  422. return self.real_now_pos
  423. end
  424. function MainCamera:ScreenToWorldPoint( x, y )
  425. return self.camera:ScreenToWorldPoint(Vector3(x,y,0))
  426. end
  427. function MainCamera:WorldToViewportPoint( x,y,z )
  428. return Vector3(x - self.real_now_pos.x,y - self.real_now_pos.y,z) / MainCamera.ScreenScale
  429. end
  430. function MainCamera:WorldToScreenPoint( vect )
  431. return self.camera:WorldToScreenPoint(vect)
  432. end
  433. function MainCamera:CameraBoundHandle(to_set_pos)
  434. local now_pos = to_set_pos
  435. local cam_scale = MainCamera.ScreenScale * self.camera_curr_size / self.camera_base_size
  436. local half_target_width = SrcScreenWidth * cam_scale / 2
  437. local half_target_height = ScreenHeight * cam_scale / 2
  438. local scene_size = Scene.Instance:GetSceneSize()
  439. local scene_width = scene_size.x - half_target_width
  440. local scene_height = scene_size.y - half_target_height
  441. if half_target_width < scene_width then
  442. if now_pos.x < half_target_width then
  443. now_pos.x = half_target_width
  444. elseif now_pos.x > scene_width then
  445. now_pos.x = scene_width
  446. end
  447. else
  448. now_pos.x = scene_size.x/ 2
  449. end
  450. if half_target_height < scene_height then
  451. if now_pos.y < half_target_height then
  452. now_pos.y = half_target_height
  453. elseif now_pos.y > scene_height then
  454. now_pos.y = scene_height
  455. end
  456. else
  457. now_pos.y = scene_size.y / 2
  458. end
  459. return now_pos
  460. end
  461. function MainCamera:JoyStickState( state )
  462. self.is_joystick_state = state
  463. end
  464. function MainCamera:IsJoyStickState( )
  465. return self.is_joystick_state
  466. end
  467. function MainCamera:UpdateCameraPosDirect(posx,posy,height)
  468. if self.update_direct_pos == nil then
  469. self.update_direct_pos = co.TableXY(posx,posy + MainCamera.ScreenCenterOffset)
  470. else
  471. self.update_direct_pos.x = posx
  472. self.update_direct_pos.y = posy + MainCamera.ScreenCenterOffset
  473. end
  474. --self.update_direct_pos = self:CameraBoundHandle(self.update_direct_pos)
  475. --target_pos.x = bit.toint(target_pos.x)
  476. --target_pos.y = bit.toint(target_pos.y)
  477. -- local x = math.abs(target_pos.x - self.real_now_pos.x)
  478. -- local y = math.abs(target_pos.y - self.real_now_pos.y)
  479. -- if self.is_joystick_state and ( x > 10 or y > 10) then
  480. -- end
  481. self:SetPos(self.update_direct_pos.x, self.update_direct_pos.y,height)
  482. self.camera_move_speed.x = 0
  483. self.camera_move_speed.y = 0
  484. end
  485. function MainCamera:Update(now_time, elapse_time)
  486. -- if self.is_update_camera then
  487. -- --self:UpdateCamera(target_pos, is_in_move, main_move_dir, elapse_time)
  488. -- end
  489. if not self.is_update_camera then
  490. return
  491. end
  492. if MainCamera.FreeCameraViewOpened then -- 打开了自由摄像机界面后,该值为true
  493. return
  494. end
  495. self:UpdateShakeScreen(now_time, elapse_time)
  496. -- self:UpdateLockCamera(now_time,elapse_time)
  497. self:UpdateCameraSize(now_time,elapse_time)
  498. --self:UpdateCamerView()
  499. self:SmoothPosToTarget()
  500. end
  501. --震屏处理
  502. function MainCamera:UpdateShakeScreen(now_time, elapse_time)
  503. if not Scene.Instance.main_role then
  504. return
  505. end
  506. if IsTableEmpty(self.shake_elements_list) then
  507. self.is_shaking = false
  508. else
  509. self.is_shaking = true
  510. local curr_shake_range_x = 0
  511. local curr_shake_range_y = 0
  512. local curr_shake_range_s = 0
  513. local curr_shake_range = 0
  514. local ratio = 0
  515. local radian_off = 0
  516. local past_time = 0
  517. for i, vo in ipairs(self.shake_elements_list) do
  518. past_time = Status.NowTime - vo.add_list_time
  519. if past_time >= vo.shake_start_time then
  520. ratio = (past_time - vo.shake_start_time) / vo.shake_lase_time
  521. ratio = ratio > 1 and 1 or ratio
  522. curr_shake_range = vo.shake_max_range * math_sin((ratio * vo.shake_angle + vo.start_angle) * math.pi / 180)
  523. if vo.shake_type == 1 then --上下
  524. if math_abs(curr_shake_range) > math_abs(curr_shake_range_y) then
  525. curr_shake_range_y = curr_shake_range
  526. end
  527. elseif vo.shake_type == 2 then --左右
  528. if math_abs(curr_shake_range) > math_abs(curr_shake_range_x) then
  529. curr_shake_range_x = curr_shake_range
  530. end
  531. elseif vo.shake_type == 3 then --拉伸
  532. if math_abs(curr_shake_range) > math_abs(curr_shake_range_s) then
  533. curr_shake_range_s = curr_shake_range
  534. end
  535. end
  536. if ratio >= 1 then
  537. table_remove(self.shake_elements_list, i)
  538. end
  539. end
  540. end
  541. if curr_shake_range_x ~= 0 or curr_shake_range_y ~= 0 then
  542. local role_real_pos = Scene.Instance.main_role.real_pos
  543. if math_abs(self.real_now_pos.x - role_real_pos.x - curr_shake_range_x) > 100 or math_abs(self.real_now_pos.y - role_real_pos.y - MainCamera.ScreenCenterOffset - curr_shake_range_y) > 100 then
  544. self.temp_shake_pos.x = role_real_pos.x + curr_shake_range_x
  545. self.temp_shake_pos.y = role_real_pos.y + curr_shake_range_y
  546. self:UpdateCamera(self.temp_shake_pos, nil, nil, true)
  547. else
  548. self:UpdateCameraPosDirect(role_real_pos.x + curr_shake_range_x, role_real_pos.y + curr_shake_range_y)
  549. end
  550. end
  551. if curr_shake_range_s ~= 0 then
  552. self:SetCameraSize(CameraDefaultFieldofView + curr_shake_range_s / MainCamera.PixelsToUnits)
  553. end
  554. if IsTableEmpty(self.shake_elements_list) then
  555. self.is_shaking = false
  556. self:SetCameraSize(CameraDefaultFieldofView) -- 2D用 self.camera_base_size
  557. if Scene.Instance.main_role then
  558. self:UpdateCamera(Scene.Instance.main_role.real_pos)
  559. end
  560. end
  561. end
  562. end
  563. --添加震屏项
  564. function MainCamera:AddShakeElement(shake_start_time, shake_type, shake_lase_time, shake_max_range, shake_angle, start_angle)
  565. if shake_lase_time == 0 or shake_max_range == 0 or shake_angle == 0 or lua_settingM:ExistBlockSet("shakeScreen") then
  566. return
  567. end
  568. if (not lua_viewM.main_cancas_last_visible) or lua_viewM.is_lock_screen then
  569. return
  570. end
  571. local shake_info = {
  572. shake_type = shake_type,
  573. shake_lase_time = shake_lase_time,
  574. shake_max_range = shake_max_range or 15,
  575. --start_shake_pos = co.TableXY(RoleManager.Instance.mainRoleInfo.pos_x, RoleManager.Instance.mainRoleInfo.pos_y),
  576. shake_angle = shake_angle or 180,
  577. start_angle = start_angle,
  578. -- start_camera_size = self.camera_curr_size,
  579. shake_start_time = shake_start_time,
  580. add_list_time = Status.NowTime,
  581. }
  582. table_insert(self.shake_elements_list, shake_info)
  583. self.is_shaking = true
  584. end
  585. function MainCamera:ClearShakeElement()
  586. self.shake_elements_list = {}
  587. end
  588. function MainCamera:SetUpdateCameraEnabled(flag)
  589. self.is_update_camera = flag
  590. local game_vector2 = self.transform.position
  591. self.real_now_pos.x = game_vector2.x * MainCamera.PixelsToUnits
  592. self.real_now_pos.y = game_vector2.z * MainCamera.PixelsToUnits
  593. self.camera_move_speed.x = 0
  594. self.camera_move_speed.y = 0
  595. self.last_t_pos = nil
  596. if flag then
  597. self.camera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  598. self.transform.rotation = Quaternion.Euler(0,0,0)
  599. SetLocalPosition(self.camera.transform, 0, 0, -CameraDistanceWithMainRole)
  600. end
  601. end
  602. function MainCamera:UpdateCameraPos(dest_pos,time,elapse_time)
  603. if self.move_start_time < time then
  604. self.move_start_time = self.move_start_time + Time.deltaTime
  605. if self.move_constant then
  606. local now_pos = GameMath_Lerp(self.move_start_pos,dest_pos,self.move_start_time/time)
  607. self:SetPos(now_pos.x,now_pos.y)
  608. else
  609. local x = GameMath.EaseInOutQuad(self.move_start_pos.x,dest_pos.x,self.move_start_time/time)
  610. local y = GameMath.EaseInOutQuad(self.move_start_pos.y,dest_pos.y,self.move_start_time/time)
  611. self:SetPos(x,y)
  612. end
  613. else
  614. self.lock_camera_pos = false
  615. end
  616. end
  617. function MainCamera:UpdateCameraSizeBySize(elapse_time)
  618. if self.change_start_time < self.change_size_time then
  619. self.change_start_time = self.change_start_time + Time.deltaTime
  620. local scale = GameMath_Lerp(self.change_start_scale,self.dest_camera_scale,self.change_start_time/self.change_size_time)
  621. self:ScaleCamera(scale)
  622. else
  623. self.is_change_size = false
  624. end
  625. end
  626. function MainCamera:RandFunc(x)
  627. local ret_val = math.floor(x)
  628. local val = x - ret_val
  629. if val >= 0.5 then
  630. ret_val = ret_val + 1
  631. end
  632. return ret_val
  633. end
  634. function MainCamera:UpdateCamera(t_pos, is_in_move, elapse_time, force_update)
  635. if self.is_shaking and not force_update then
  636. return
  637. end
  638. if self.last_t_pos and self.last_t_pos.x == t_pos.x and self.last_t_pos.y == t_pos.y then
  639. return
  640. end
  641. elapse_time = 1.0/LuaFPS.FPS
  642. if self.target_pos == nil then
  643. self.target_pos = co.Vector2(t_pos.x,t_pos.y + MainCamera.ScreenCenterOffset)
  644. else
  645. self.target_pos.x = t_pos.x
  646. self.target_pos.y = t_pos.y + MainCamera.ScreenCenterOffset
  647. end
  648. --暂时直接将主角当为摄像机目标
  649. if self.inteval_pos == nil then
  650. self.inteval_pos = self.target_pos - self.real_now_pos
  651. else
  652. self.inteval_pos.x = self.target_pos.x - self.real_now_pos.x
  653. self.inteval_pos.y = self.target_pos.y - self.real_now_pos.y
  654. end
  655. if self.inteval_pos.x < -1000 or self.inteval_pos.x > 1000 or self.inteval_pos.y < -1000 or self.inteval_pos.y > 1000 then
  656. self.target_pos = self:CameraBoundHandle(self.target_pos)
  657. --self.target_pos.x = bit.toint(self.target_pos.x)
  658. --self.target_pos.y = bit.toint(self.target_pos.y)
  659. self.camera_move_speed.x = 0
  660. self.camera_move_speed.y = 0
  661. --self.real_now_pos.x = self.target_pos.x
  662. --self.real_now_pos.y = self.target_pos.y
  663. self:SetPos(self.target_pos.x, self.target_pos.y, nil , force_update)
  664. return
  665. end
  666. local smooth_time = MainCamera.SmoothTime
  667. local tem_pos = self.target_pos
  668. -- tem_pos, self.camera_move_speed =
  669. -- GameMath.Smooth(self.real_now_pos, self.target_pos,
  670. -- self.camera_move_speed,
  671. -- smooth_time,
  672. -- elapse_time)
  673. if self.last_t_pos == nil then
  674. self.last_t_pos = co.TableXY(tem_pos.x, tem_pos.y - MainCamera.ScreenCenterOffset)
  675. else
  676. self.last_t_pos.x, self.last_t_pos.y = tem_pos.x, tem_pos.y - MainCamera.ScreenCenterOffset
  677. end
  678. tem_pos = self:CameraBoundHandle(tem_pos)
  679. tem_pos.x = self:RandFunc(tem_pos.x)
  680. tem_pos.y = self:RandFunc(tem_pos.y)
  681. self:SetPos(tem_pos.x, tem_pos.y, nil, force_update)
  682. end
  683. --摄像机跟随
  684. function MainCamera:Follow(pos,now_time,elapse_time,dontCheckBound)
  685. if pos then
  686. local tem_pos = {}
  687. tem_pos.x = GameMath_Lerp(self.real_now_pos.x,pos.x,elapse_time * 2)
  688. tem_pos.y = GameMath_Lerp(self.real_now_pos.y,pos.y,elapse_time * 2)
  689. if dontCheckBound then
  690. self:SetPos(tem_pos.x,tem_pos.y)
  691. else
  692. local real_now_pos = self:CameraBoundHandle(tem_pos)
  693. self:SetPos(real_now_pos.x,real_now_pos.y)
  694. end
  695. end
  696. end
  697. function MainCamera:SetPos( posx, posy,height,force_update)
  698. if SceneManager:getInstance():IsStarFightScene() then
  699. return
  700. end
  701. if self.real_now_pos and self.real_now_pos.x == posx and self.real_now_pos.y == posy and not height and not force_update then
  702. return
  703. end
  704. self.real_now_pos.x, self.real_now_pos.y = posx, posy
  705. local mainrole_height = 0
  706. local mainrole = Scene.Instance:GetMainRole()
  707. if mainrole then
  708. mainrole_height = mainrole.obj_pos_height
  709. if mainrole_height == 0 and self.last_role_height then
  710. mainrole_height = self.last_role_height
  711. end
  712. if mainrole_height > 0 then
  713. self.last_role_height = mainrole_height
  714. end
  715. end
  716. height = height or 0
  717. self.temp_pos.x = posx / MainCamera.PixelsToUnits; --transform.x
  718. self.temp_pos.y = posy / MainCamera.PixelsToUnits --transform.z
  719. self.temp_pos.z = SceneCameraHeigth + mainrole_height + height / MainCamera.PixelsToUnits--transform.y
  720. --摄像机的y轴给一个插值过渡
  721. -- if(math.abs(self.transform.position.y - realz) < 3) then
  722. -- realz = GameMath_Lerp(realz,self.transform.position.y,0.01)
  723. -- end
  724. if self.isSmoothing then
  725. self.smoothTarget = Vector3(self.temp_pos.x,self.temp_pos.z,self.temp_pos.y)
  726. --self:SmoothPosToTarget()
  727. else
  728. self.smoothTarget = nil
  729. SetGlobalPosition3D(self.transform, self.temp_pos.x, self.temp_pos.y, self.temp_pos.z)
  730. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  731. end
  732. end
  733. function MainCamera:SetSmoothingState(bool)
  734. self.isSmoothing = bool
  735. end
  736. function MainCamera:GetCameraRealHeight()
  737. local mainrole_height = 0
  738. local mainrole = Scene.Instance:GetMainRole()
  739. if mainrole then
  740. mainrole_height = mainrole.obj_pos_height
  741. end
  742. local realz = SceneCameraHeigth + mainrole_height
  743. return realz
  744. end
  745. --@pos:摄像机的目标坐标
  746. --@immediately:是立即跳至目标点还是缓动移过去
  747. --@constant:是否匀速移动
  748. function MainCamera:SetLockCameraPos(x,y,time,immediately,constant)
  749. self.is_lock_camera = true
  750. self.lock_camera_pos = co.TableXY(x,y + MainCamera.ScreenCenterOffset)
  751. self.move_immediately = immediately
  752. self.move_constant = constant
  753. self.move_camera_time = time
  754. self.move_start_time = 0
  755. self.move_start_pos = co.Vector2(self.real_now_pos.x,self.real_now_pos.y)
  756. end
  757. function MainCamera:SetCameraChangeSize(scale,time,immediately)
  758. self.is_change_size = true
  759. self.dest_camera_scale = scale
  760. self.change_start_time = 0
  761. self.change_start_scale = self.camera_curr_size / self.camera_base_size
  762. self.change_size_time = time
  763. self.change_immediately = immediately
  764. end
  765. function MainCamera:UpdateCameraPosByMainRole(force_update)
  766. if Scene.Instance.main_role == nil then
  767. return
  768. end
  769. self.is_lock_camera = false
  770. self.lock_camera_pos = false
  771. if Scene.Instance.main_role then
  772. self:UpdateCamera(Scene.Instance.main_role.real_pos,nil,nil,force_update)
  773. end
  774. end
  775. --摄像机是否锁定不跟随主角
  776. function MainCamera:IsLockCamera()
  777. return self.is_lock_camera
  778. end
  779. --摄像机是否在改变大小
  780. function MainCamera:IsChangeSize()
  781. return self.is_change_size
  782. end
  783. --摄像机是否在改变大小
  784. function MainCamera:IsMoveCamera()
  785. return self.lock_camera_pos
  786. end
  787. --摄像机是否震屏
  788. function MainCamera:IsShakeCamera()
  789. return self.is_shaking
  790. end
  791. --摄像机是否锁定不跟随主角
  792. function MainCamera:UpdateLockCamera(now_time, elapse_time)
  793. --如果外部指定的摄像机坐标就指定坐标
  794. if self.is_lock_camera and self.lock_camera_pos then
  795. if not self.move_immediately then
  796. self:UpdateCameraPos(self.lock_camera_pos,self.move_camera_time,elapse_time)
  797. else
  798. self:SetPos(self.lock_camera_pos.x, self.lock_camera_pos.y)
  799. self.lock_camera_pos = false
  800. end
  801. end
  802. end
  803. --摄像机是否锁定不跟随主角
  804. function MainCamera:UpdateCameraSize(now_time, elapse_time)
  805. --如果外部指定的摄像机坐标就指定坐标
  806. if self.is_change_size and self.dest_camera_scale ~= nil then
  807. if not self.change_immediately then
  808. self:UpdateCameraSizeBySize(elapse_time)
  809. else
  810. self:ScaleCamera(self.dest_camera_scale)
  811. self.is_change_size = false
  812. end
  813. end
  814. end
  815. --更新摄像机视野范围的平滑动画
  816. function MainCamera:UpdateCamerView( )
  817. if not(IsTableEmpty(self.size_smooth_list))then
  818. local target = self:GetNextSmoothTarget()
  819. if not(target == -1 ) then
  820. if not (target) then
  821. return
  822. end
  823. local temp = target - self.camera.fieldOfView
  824. local sign = 1
  825. if(temp < 0) then
  826. sign = -1
  827. end
  828. self.camera.fieldOfView = (self.camera.fieldOfView + MainCamera.SizeSmoothSpeed * sign)
  829. if self.screencamera then
  830. self.screencamera.fieldOfView = (self.camera.fieldOfView + MainCamera.SizeSmoothSpeed * sign)
  831. end
  832. if(math_abs(self.camera.fieldOfView - target) < MainCamera.SizeSmoothSpeed*2) then
  833. self.camera_curr_size = target
  834. self.camera.fieldOfView = target
  835. if self.screencamera then
  836. self.screencamera.fieldOfView = target
  837. end
  838. end
  839. end
  840. end
  841. end
  842. function MainCamera:GetNextSmoothTarget()
  843. if not(self.size_smooth_list) then
  844. return -1
  845. end
  846. if not(IsTableEmpty(self.size_smooth_list)) then
  847. if(self.camera.fieldOfView == self.size_smooth_list[1]) then
  848. table_remove(self.size_smooth_list,1)
  849. self:GetNextSmoothTarget()
  850. else
  851. return self.size_smooth_list[1]
  852. end
  853. else
  854. return -1
  855. end
  856. end
  857. --恢复摄像机初始设置
  858. function MainCamera:InitCameraSetting()
  859. self.is_lock_camera = false
  860. self.lock_camera_pos = false
  861. self.isSmoothing = false
  862. self.real_now_pos.x, self.real_now_pos.y = 0, 0
  863. self.last_t_pos = nil
  864. self.shake_elements_list = {}
  865. -- if SceneManager.Instance:IsPkRankFightScene() then
  866. -- local mainrole = Scene.Instance:GetMainRole()
  867. -- if mainrole then
  868. -- local newHeight = Scene.Instance:GetZoneHeight(4880/SceneObj.LogicRealRatio.x,4300/SceneObj.LogicRealRatio.y)
  869. -- mainrole.obj_pos_height = newHeight
  870. -- end
  871. -- self:SetCameraSize(55)
  872. -- self:SetPos(4880, 4300)
  873. -- end
  874. end
  875. function MainCamera:RotateAround( position, dir, value )
  876. self.rotate_around = self.rotate_around + value
  877. if math_abs(self.rotate_around) > 360 then
  878. if self.rotate_around > 0 then
  879. self.rotate_around = self.rotate_around - 360
  880. else
  881. self.rotate_around = self.rotate_around + 360
  882. end
  883. end
  884. self.transform:RotateAround( position, dir, value)
  885. end
  886. --改变相机的移动是否平滑过渡 isActive = true or false
  887. function MainCamera:ChangeSmoothActive(isActive)
  888. self.isSmooth = isActive
  889. end
  890. function MainCamera:ChangeSmoothState(state)
  891. self.smoothState = state
  892. if state == MainCamera.SmoothState.Normal then
  893. -- self.maxDistance = 2
  894. -- self.maxSpeed = 0.15
  895. -- self.targetSmoothSpeed = 0.15
  896. self.maxDistance = 2
  897. self.maxSpeed = 0.22
  898. self.targetSmoothSpeed = 2
  899. self.isSmooth = true
  900. elseif state == MainCamera.SmoothState.Jump then
  901. self.maxDistance = 2
  902. -- self.maxSpeed = 0.35
  903. self.targetSmoothSpeed = 0.5
  904. elseif state == MainCamera.SmoothState.Skill then
  905. self.maxDistance = 2
  906. self.maxSpeed = 0.22
  907. self.targetSmoothSpeed = 2
  908. elseif state == MainCamera.SmoothState.Jump_Point then
  909. self.maxDistance = 3.5
  910. self.maxSpeed = 0.4
  911. self.targetSmoothSpeed = 2
  912. elseif state == MainCamera.SmoothState.JUMP_ONE then
  913. self.maxDistance = 3.5
  914. self.maxSpeed = 0.4
  915. self.targetSmoothSpeed = 2
  916. elseif state == MainCamera.SmoothState.Horse then
  917. self.maxDistance = 3
  918. self.maxSpeed = 0.5
  919. self.targetSmoothSpeed = 1
  920. elseif state == MainCamera.SmoothState.Speed_Buff then
  921. self.maxDistance = 2
  922. self.maxSpeed = 3
  923. self.targetSmoothSpeed = 3
  924. elseif state == MainCamera.SmoothState.Quiz then
  925. self.maxDistance = 3
  926. self.maxSpeed = 0.22
  927. self.targetSmoothSpeed = 1
  928. elseif state == MainCamera.SmoothState.NewBieTask then
  929. self.maxDistance = 2
  930. self.maxSpeed = 0.6
  931. self.targetSmoothSpeed = 0.25
  932. elseif state == MainCamera.SmoothState.TaskJump then
  933. self.maxDistance = 4
  934. self.maxSpeed = 0.3
  935. self.targetSmoothSpeed = 0.3
  936. elseif state == MainCamera.SmoothState.Flash then
  937. self.maxDistance = 6
  938. self.maxSpeed = 0.4
  939. self.targetSmoothSpeed = 0.4
  940. elseif state == MainCamera.SmoothState.SpecialDun then
  941. self.maxDistance = 3
  942. self.maxSpeed = 0.3
  943. self.targetSmoothSpeed = 0.25
  944. self.isSmoothing = true
  945. elseif state == MainCamera.SmoothState.None then
  946. self.maxDistance = 6
  947. self.maxSpeed = 0.4
  948. self.targetSmoothSpeed = 0
  949. self.isSmoothing = false
  950. self.isSmooth = false
  951. end
  952. -- print("改变了摄像机参数 ",state,self.maxSpeed)
  953. end
  954. function MainCamera:ChangePosFllowMainrole(pos_x,pos_y,jump_height)
  955. if SceneManager:getInstance():IsStarFightScene() then
  956. return
  957. end
  958. -- 以下是2D相机的逻辑
  959. -- local radian = math.abs(self.rotate_around) % 180 / 180 * math.pi
  960. -- local asin = math.sin(radian)
  961. -- local acos = math.cos(radian)
  962. -- local x = math.abs(asin * CameraDistanceWithMainRole)
  963. -- local y = math.abs(acos * CameraDistanceWithMainRole)
  964. -- if self.rotate_around > 0 then
  965. -- if self.rotate_around < -270 then
  966. -- elseif self.rotate_around > 180 then
  967. -- y = -y
  968. -- elseif self.rotate_around > 90 then
  969. -- x = -x
  970. -- y = -y
  971. -- else
  972. -- x = -x
  973. -- end
  974. -- else
  975. -- if self.rotate_around < -270 then
  976. -- x = -x
  977. -- elseif self.rotate_around < -180 then
  978. -- x = -x
  979. -- y = -y
  980. -- elseif self.rotate_around < -90 then
  981. -- y = -y
  982. -- end
  983. -- end
  984. -- 以上
  985. -- if self.firstMove then
  986. -- self:UpdateCameraPosDirect(pos_x, pos_y,jump_height )
  987. -- self.firstMove = false
  988. -- return
  989. -- end
  990. -- local mainrole_height = 0
  991. -- local mainrole = Scene.Instance:GetMainRole()
  992. -- if mainrole then
  993. -- mainrole_height = mainrole.obj_pos_height
  994. -- end
  995. -- -- self.smoothTarget.x = pos_x / MainCamera.PixelsToUnits; --transform.x
  996. -- -- self.smoothTarget.y = pos_y / MainCamera.PixelsToUnits --transform.z
  997. -- -- local off_height = jump_height / MainCamera.PixelsToUnits
  998. -- -- self.smoothTarget.z = SceneCameraHeigth + mainrole_height + off_height--transform.y
  999. -- local x = pos_x / MainCamera.PixelsToUnits; --transform.x
  1000. -- local y = pos_y / MainCamera.PixelsToUnits --transform.z
  1001. -- local off_height = jump_height / MainCamera.PixelsToUnits
  1002. -- local z = SceneCameraHeigth + mainrole_height + off_height--transform.y
  1003. -- self.smoothTarget = Vector3(x,y,z)
  1004. if self.isSmooth and not self.block_smooth then
  1005. self.isSmoothing = true
  1006. else
  1007. self.isSmoothing = false
  1008. end
  1009. self:UpdateCameraPosDirect(pos_x, pos_y,jump_height )
  1010. --MainCamera.Instance:SetCameraSize(MainCamera.Instance.camera_base_size * (1 + jump_height * 0.0011))
  1011. end
  1012. function MainCamera:SmoothPosToTarget()
  1013. if not self.smoothTarget then
  1014. return
  1015. end
  1016. if not self.isSmoothing then
  1017. return
  1018. end
  1019. -- if SceneManager:getInstance():IsStarFightScene() then
  1020. -- return
  1021. -- end
  1022. local abs = math_abs(self.targetSmoothSpeed - self.maxSpeed)
  1023. if abs > 0.01 then
  1024. if self.targetSmoothSpeed >= self.maxSpeed then
  1025. self.maxSpeed = self.maxSpeed + 0.01
  1026. else
  1027. self.maxSpeed = self.maxSpeed - 0.01
  1028. end
  1029. end
  1030. local distance = Vector3.Distance(self.transform.position,self.smoothTarget)
  1031. if distance < 0.01 then
  1032. self.isSmoothing = false
  1033. return
  1034. end
  1035. if distance > self.maxDistance * 2 then --超过最大距离的两倍,就不缓动了
  1036. self.transform.position = self.smoothTarget
  1037. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  1038. return
  1039. end
  1040. local temp_fps = 60
  1041. if LuaFPS.FPS and LuaFPS.FPS ~= 0 then
  1042. temp_fps = LuaFPS.FPS
  1043. end
  1044. local real_max_speed = 60/temp_fps * self.maxSpeed
  1045. local speed = distance/self.maxDistance * real_max_speed
  1046. speed = self:GetClamp(speed,-real_max_speed,real_max_speed)
  1047. local nextStep = Vector3.MoveTowards(self.transform.position,self.smoothTarget,speed)
  1048. SetGlobalPosition3D(self.transform, nextStep.x, nextStep.z,nextStep.y)
  1049. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  1050. end
  1051. function MainCamera:GetClamp(value,min,max)
  1052. if value < min then
  1053. return min
  1054. end
  1055. if value > max then
  1056. return max
  1057. end
  1058. return value
  1059. end
  1060. function MainCamera:Distance(value1,value2)
  1061. return math.sqrt(math.pow(2,(value1.x - value2.x)) + math.pow(2,(value1.y - value2.y)) + math.pow(2,(value1.z - value2.z)))
  1062. end
  1063. function MainCamera:GetNameBoardPoint( x,y,z )
  1064. local pos = self.camera:WorldToScreenPoint(Vector3(x,y,z))
  1065. pos = self.uiCamera:ScreenToWorldPoint(pos)
  1066. return pos
  1067. end
  1068. function MainCamera:CreateScreenCamera()
  1069. local screencameraobj = GameObject.New("ScreenCamera")
  1070. screencameraobj:AddComponent(typeof(UnityEngine.Camera))
  1071. screencameraobj.layer = LayerMask.NameToLayer("Screen")
  1072. self.screencamera = screencameraobj:GetComponent("Camera")
  1073. self.screencamera.depth = 0
  1074. self.screencamera.cullingMask = 2048
  1075. self.screencamera.clearFlags = UnityEngine.CameraClearFlags.Depth
  1076. self.screencamera.orthographic = false
  1077. self.screencamera.transform:SetParent(self.transform)
  1078. self.screencamera.fieldOfView = self.camera_curr_size
  1079. self.screencamera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  1080. SetLocalPosition(self.screencamera.transform,0,0,-CameraDistanceWithMainRole)
  1081. end
  1082. function MainCamera:AddScreenObj( transform )
  1083. do return end
  1084. if tonumber(AppConst.EnglineVer) <= 72 then
  1085. return
  1086. end
  1087. if not self.screencamera then
  1088. self:CreateScreenCamera()
  1089. end
  1090. if self.screen_obj_count == 0 then
  1091. self.screencamera.gameObject:SetActive(true)
  1092. end
  1093. self.screen_obj_count = self.screen_obj_count + 1
  1094. local layer = LayerMask.NameToLayer("Screen")
  1095. self:SetCustomLayer(transform,layer)
  1096. end
  1097. function MainCamera:RemoveScreenObj( transform )
  1098. do return end
  1099. if not self.screencamera then
  1100. return
  1101. end
  1102. self.screen_obj_count = self.screen_obj_count - 1
  1103. local layer = LayerMask.NameToLayer("Default")
  1104. self:SetCustomLayer(transform,layer)
  1105. if self.screen_obj_count <= 0 then
  1106. self.screencamera.gameObject:SetActive(false)
  1107. end
  1108. end
  1109. function MainCamera:HideScreenCamera()
  1110. self.screen_obj_count = 0
  1111. if self.screencamera and self.screencamera.gameObject.activeSelf then
  1112. self.screencamera.gameObject:SetActive(false)
  1113. end
  1114. end
  1115. function MainCamera:SetCustomLayer( obj, layer )
  1116. if IsNull(obj) then
  1117. return
  1118. end
  1119. for i = 0,obj.childCount - 1 do
  1120. obj:GetChild(i).gameObject.layer = layer
  1121. self:SetCustomLayer(obj:GetChild(i),layer)
  1122. end
  1123. end
  1124. function MainCamera:AddSelectRoleMode()
  1125. self.can_scale_camera = false
  1126. SetGlobalPosition(self.transform, 0, 0, 0)
  1127. SetGlobalPosition(self.camera.transform, -0.14, 0.965, -4.83)
  1128. self.camera.transform.localRotation = Quaternion.Euler(-1.50,-3.47,0)
  1129. self.camera.fieldOfView = 30
  1130. end
  1131. function MainCamera:AddCreateRoleMode( )
  1132. self.can_scale_camera = false
  1133. SetGlobalPosition(self.transform, 0, 0, 0)
  1134. SetGlobalPosition(self.camera.transform, -0.14, 0.965, -4.83)
  1135. self.camera.transform.localRotation = Quaternion.Euler(-1.50,-3.47,0)
  1136. self.camera.fieldOfView = 30
  1137. end
  1138. function MainCamera:ResetNormalMode()
  1139. self:RecoverCameraParm()
  1140. self.can_scale_camera = true
  1141. SetLocalPosition(self.camera.transform, 0, 0, -CameraDistanceWithMainRole)
  1142. self.camera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  1143. self.camera.fieldOfView = self.camera_curr_size
  1144. end
  1145. function MainCamera:BackupCameraParm( )
  1146. if self.has_backup then
  1147. return
  1148. end
  1149. self.backup_distance = CameraDistanceWithMainRole
  1150. self.backup_rotate_x = SceneCameraRotate
  1151. self.backup_field = self.camera_curr_size
  1152. self.backup_height = SceneCameraHeigth
  1153. self.has_backup = true
  1154. end
  1155. function MainCamera:RecoverCameraParm( )
  1156. if not self.backup_distance then
  1157. return
  1158. end
  1159. CameraDistanceWithMainRole = self.backup_distance
  1160. SceneCameraRotate = self.backup_rotate_x
  1161. self.camera_curr_size = self.backup_field
  1162. SceneCameraHeigth = self.backup_height
  1163. self.has_backup = false
  1164. end
  1165. function MainCamera:SetSpecialDunMode( cfg )
  1166. -- self:SetUpdateCameraEnabled(false)
  1167. self:BackupCameraParm()
  1168. CameraDistanceWithMainRole = cfg.distance
  1169. SceneCameraRotate = cfg.rotate
  1170. self.camera_curr_size = cfg.field
  1171. SceneCameraHeigth = cfg.height
  1172. self:ChangeSmoothState(MainCamera.SmoothState.SpecialDun)
  1173. self:SetUpdateCameraEnabled(true)
  1174. self.transform.localRotation = Quaternion.Euler(0,cfg.angle,0)
  1175. self:UpdateCameraPosByMainRole()
  1176. end
  1177. function MainCamera:QuitSpecialDunMode( )
  1178. self:SetUpdateCameraEnabled(true)
  1179. self:ResetNormalMode()
  1180. self:UpdateCameraPosByMainRole()
  1181. end
  1182. function MainCamera:SetFishingCameraPos( angle)
  1183. --self:SetRoleDirection()
  1184. self:SetUpdateCameraEnabled(false)
  1185. local x, y, z = 0, 0, 0
  1186. x, z = Scene.Instance.main_role:GetRealPos()
  1187. x = x / MainCamera.PixelsToUnits
  1188. z = z / MainCamera.PixelsToUnits
  1189. y = self.transform.position.y - Config.ConfigFishSceneCamera.height
  1190. SetGlobalPosition(self.transform, x, y, z)
  1191. self.camera.transform.localRotation = Quaternion.Euler(Config.ConfigFishSceneCamera.rotate,0,0)
  1192. self.transform.localRotation = Quaternion.Euler(0,angle,0)
  1193. end
  1194. function MainCamera:SetMateCamera(pos_x,pos_y,type_id )
  1195. self:SetUpdateCameraEnabled(false)
  1196. -- if type_id == "x" then
  1197. if true then
  1198. self:SetPos( pos_x, pos_y + 700,-800)
  1199. self.camera.transform.localRotation = Quaternion.Euler(13,0,0)
  1200. elseif type_id == "y" then
  1201. self.camera.transform.localRotation = Quaternion.Euler(13,-90,0)
  1202. self:SetPos( pos_x+600, pos_y + 1300,-800)
  1203. end
  1204. end
  1205. function MainCamera:QuitMateCamera( )
  1206. self:SetUpdateCameraEnabled(true)
  1207. self:ResetNormalMode()
  1208. self:UpdateCameraPosByMainRole()
  1209. end
  1210. function MainCamera:SetCameraMoveToZ( cfg )
  1211. if not cfg then
  1212. return
  1213. end
  1214. if self.time_id then
  1215. GlobalTimerQuest:CancelQuest(self.time_id)
  1216. self.time_id = nil
  1217. end
  1218. local z = cfg.distance
  1219. local animation_time = cfg.time or 1
  1220. local time, step = 0, 0.02
  1221. local function Move( )
  1222. time = time + step
  1223. if time >= animation_time then
  1224. if self.time_id then
  1225. GlobalTimerQuest:CancelQuest(self.time_id)
  1226. self.time_id = nil
  1227. end
  1228. else
  1229. local now_pos = GameMath_Lerp(self.camera.transform.localPosition.z, z, time/animation_time)
  1230. SetLocalPosition(self.camera.transform, 0, 0, now_pos)
  1231. GlobalEventSystem:Fire(SceneEventType.CAMERA_MOVE)
  1232. end
  1233. end
  1234. self.time_id = GlobalTimerQuest:AddPeriodQuest(Move,0.02,-1)
  1235. end
  1236. function MainCamera:ResetExitFishCameraPos()
  1237. local cfg = Config.ConfigFishSceneCamera
  1238. if not cfg then return end
  1239. if self.time_id then
  1240. GlobalTimerQuest:CancelQuest(self.time_id)
  1241. self.time_id = nil
  1242. end
  1243. self:SetUpdateCameraEnabled(true)
  1244. self.camera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  1245. self.transform.localRotation = Quaternion.Euler(0,0,0)
  1246. if Scene.Instance.main_role then
  1247. local x, y, z = 0, 0, 0
  1248. x, z = Scene.Instance.main_role:GetRealPos()
  1249. x = x / MainCamera.PixelsToUnits
  1250. z = z / MainCamera.PixelsToUnits
  1251. y = self.transform.position.y + cfg.height
  1252. SetGlobalPosition(self.transform, x, y, z)
  1253. SetLocalPosition(self.camera.transform, 0, 0, -CameraDistanceWithMainRole)
  1254. end
  1255. end
  1256. --更改渲染层级
  1257. function MainCamera:SetMainCameraCullingMask( layer, flag )
  1258. if not self.camera then
  1259. return
  1260. end
  1261. if flag then
  1262. self.camera.cullingMask = bit.bor(self.camera.cullingMask, bit.lshift(1,layer))
  1263. else
  1264. self.camera.cullingMask = bit.band(self.camera.cullingMask, bit.bnot(bit.lshift(1,layer)))
  1265. end
  1266. end
  1267. --切换泛光效果开关
  1268. function MainCamera:SetPostEffectEnable( flag )
  1269. if self.is_login_post_effect_state then
  1270. return
  1271. end
  1272. if not IsNull(self.main_postEffect) and self:IsSupportPostEffect() then
  1273. self.main_postEffect.enabled = flag
  1274. end
  1275. end
  1276. function MainCamera:IsSupportPostEffect( )
  1277. -- if G_DEBUG_MODE then
  1278. -- return false
  1279. -- end
  1280. if self.is_support_post_effect ~= nil then
  1281. return self.is_support_post_effect
  1282. end
  1283. self.is_support_post_effect = SystemMemoryLevel.Cur == SystemMemoryLevel.Top
  1284. return self.is_support_post_effect
  1285. end
  1286. function MainCamera:IsSupportFAXX( )
  1287. if G_DEBUG_MODE then
  1288. return false
  1289. end
  1290. if self.is_support_faxx ~= nil then
  1291. return self.is_support_faxx
  1292. end
  1293. self.is_support_faxx = SystemMemoryLevel.Cur == SystemMemoryLevel.Hight
  1294. return self.is_support_faxx
  1295. end
  1296. --------------------------------------------屏幕后处理相关start--------------------------------------------
  1297. -- 获取当前设备是否支持使用屏幕后处理特效
  1298. function MainCamera:SetRenderSupport( )
  1299. self.is_screen_effect_supported = self.main_postEffect and self.main_postEffect:GetSupported() or false
  1300. -- and self.ui_postEffect and self.ui_postEffect:GetSupported()
  1301. end
  1302. function MainCamera:GetRenderSupport( )
  1303. return self.is_screen_effect_supported
  1304. end
  1305. --------------------------------------------高斯模糊相关start--------------------------------------------
  1306. -- 启用主摄像机和UI摄像机的渲染截图 camera_type:特效相机类型,默认模糊UI摄像机 anim_time:模糊动画时间
  1307. -- function MainCamera:EnableBlurEffect(camera_type, anim_time)
  1308. -- local top_canvas_node = panelMgr:GetParent("Top"):GetComponent("Canvas")
  1309. -- if not top_canvas_node then return end
  1310. -- -- 已经存在了进行模糊的摄像机时,直接跳过
  1311. -- if MainCamera.Activiting_Blur_Effect then return end
  1312. -- camera_type = camera_type or MainCamera.EffectCameraType.UICamera
  1313. -- -- 将TopUI层的渲染摄像机改为不参与模糊的摄像机
  1314. -- top_canvas_node.worldCamera = self.blurCamera
  1315. -- self.blurCamera.enabled = true
  1316. -- self.blurCamera_gameObject.transform.localRotation = Quaternion.Euler(0,0,0)
  1317. -- if camera_type == MainCamera.EffectCameraType.MainCamera then
  1318. -- -- self.main_screen_effect.enabled = true
  1319. -- -- self.main_screen_effect.render_blur_effect = true
  1320. -- self.main_postEffect.render_blur_effect = true
  1321. -- MainCamera.Activiting_Blur_Effect = true
  1322. -- elseif camera_type == MainCamera.EffectCameraType.UICamera then
  1323. -- -- self.ui_screen_effect.enabled = true
  1324. -- -- self.ui_screen_effect.render_blur_effect = true
  1325. -- self.ui_postEffect.render_blur_effect = true
  1326. -- MainCamera.Activiting_Blur_Effect = true
  1327. -- end
  1328. -- -- 启用渐变动画效果
  1329. -- self:StartBlurAmountBlend(true, anim_time)
  1330. -- end
  1331. -- -- 关闭模糊效果
  1332. -- function MainCamera:DisableBlurEffect(anim_time)
  1333. -- if not MainCamera.Activiting_Blur_Effect then return end
  1334. -- self:StartBlurAmountBlend(false, anim_time)
  1335. -- MainCamera.Activiting_Blur_Effect = false
  1336. -- end
  1337. -- -- 关闭模糊脚本运作
  1338. -- function MainCamera:ShutDownBlurEffect( )
  1339. -- if self.main_postEffect then
  1340. -- self.main_postEffect.render_blur_effect = false
  1341. -- end
  1342. -- if self.ui_postEffect then
  1343. -- self.ui_postEffect.render_blur_effect = false
  1344. -- end
  1345. -- -- 将Top层的UI渲染摄像机还原为UIcamera
  1346. -- local top_canvas_node = panelMgr:GetParent("Top"):GetComponent("Canvas")
  1347. -- if top_canvas_node then
  1348. -- top_canvas_node.worldCamera = self.uiCamera
  1349. -- self.blurCamera.enabled = false
  1350. -- end
  1351. -- end
  1352. -- -- 模糊效果缓动 show 显示模糊或者关闭模糊 anim_time 缓动时间
  1353. -- function MainCamera:StartBlurAmountBlend(show, anim_time)
  1354. -- -- 获取当前激活渲染效果的摄像机
  1355. -- local anim_camera = self.main_postEffect.render_blur_effect and self.main_postEffect or nil
  1356. -- anim_camera = anim_camera or (self.ui_postEffect.render_blur_effect and self.ui_postEffect)
  1357. -- if not anim_camera then return end
  1358. -- self:ClearBlurAnimId()
  1359. -- -- 目标模糊混合值
  1360. -- local target_amount = show and 1 or 0
  1361. -- local start_amount = show and 0 or 1
  1362. -- -- 目标降低采样率值
  1363. -- local max_downSample = anim_camera == self.main_postEffect and
  1364. -- self.main_blur_downSample_value or self.ui_blur_downSample_value
  1365. -- local target_downSample = show and max_downSample or 1
  1366. -- local start_downSample = show and 1 or max_downSample
  1367. -- local anim_time = anim_time or 0.3
  1368. -- local downSample_time = anim_time * (target_downSample-1)/target_downSample
  1369. -- -- 如果是要显示出来,则先从原始图片渐变到模糊图片
  1370. -- local callback = nil
  1371. -- if show and anim_time ~= 0 then
  1372. -- anim_camera.blur_amount = 0
  1373. -- anim_camera.downSample = 1
  1374. -- end
  1375. -- -- 添加动画(2019年11月16日修改:修改动画参数,增强模糊动画效果,代码参考tweenlite)
  1376. -- if anim_time ~= 0 then
  1377. -- local start_time = Status.NowTime
  1378. -- local function blur_anim_func()
  1379. -- local use_time = Status.NowTime - start_time
  1380. -- local progress = use_time / anim_time
  1381. -- anim_camera.blur_amount = use_time >= anim_time and target_amount or GameMath_Lerp(start_amount, target_amount, progress)
  1382. -- anim_camera.downSample = use_time >= downSample_time and target_downSample or GameMath_Lerp(start_downSample, target_downSample, progress)
  1383. -- if use_time >= anim_time then
  1384. -- self:ClearBlurAnimId()
  1385. -- if not show then
  1386. -- self:ShutDownBlurEffect()
  1387. -- end
  1388. -- end
  1389. -- end
  1390. -- self.blur_anim_func_id = GlobalTimerQuest:AddPeriodQuest(blur_anim_func, 0.03, -1)
  1391. -- blur_anim_func()
  1392. -- else
  1393. -- anim_camera.blur_amount = target_amount
  1394. -- anim_camera.downSample = max_downSample
  1395. -- if not show then
  1396. -- self:ShutDownBlurEffect()
  1397. -- end
  1398. -- end
  1399. -- end
  1400. -- function MainCamera:ClearBlurAnimId( )
  1401. -- if self.blur_anim_func_id then
  1402. -- GlobalTimerQuest:CancelQuest(self.blur_anim_func_id)
  1403. -- self.blur_anim_func_id = nil
  1404. -- end
  1405. -- end
  1406. -- 直接获取当前目标摄像机的模糊效果(目前模糊样式固定,且直接获取模糊后的图)
  1407. -- callback:必传,第一个参数一定是接收RenderTexture
  1408. -- camera_type:模糊摄像机格式,默认是UI摄像机
  1409. -- function MainCamera:GetCameraBlurScreenShot(callback, camera_type)
  1410. -- if not callback then -- 没有回调,则读取缓存,并跳出本轮模糊
  1411. -- self:CheckCacheBlurList()
  1412. -- return
  1413. -- end
  1414. -- -- 当前正在等待处理的话,则缓存列表
  1415. -- if self.rendering_blur_screenShot then
  1416. -- self.round_robin_cache_list[#self.round_robin_cache_list+1] = {
  1417. -- callback = callback,
  1418. -- camera_type = camera_type,
  1419. -- }
  1420. -- return
  1421. -- end
  1422. -- camera_type = camera_type or MainCamera.EffectCameraType.UICamera
  1423. -- local target_effect, max_downSample
  1424. -- if camera_type == MainCamera.EffectCameraType.MainCamera then
  1425. -- target_effect = self.main_postEffect
  1426. -- max_downSample = self.main_blur_downSample_value
  1427. -- elseif camera_type == MainCamera.EffectCameraType.UICamera then
  1428. -- target_effect = self.ui_postEffect
  1429. -- max_downSample = self.ui_blur_downSample_value
  1430. -- end
  1431. -- local function screenshot_callback(args)
  1432. -- -- 首个参数既是RenderTexture
  1433. -- callback(args and args[0])
  1434. -- -- 状态置false,检查缓存队列中是否有其他模糊请求
  1435. -- self.rendering_blur_screenShot = false
  1436. -- self:CheckCacheBlurList()
  1437. -- end
  1438. -- target_effect:RenderBlurScreenShot(1, max_downSample, screenshot_callback)
  1439. -- self.rendering_blur_screenShot = true
  1440. -- end
  1441. -- -- 缓存模糊需求列表
  1442. -- function MainCamera:CheckCacheBlurList( )
  1443. -- if TableSize(self.round_robin_cache_list) == 0 then return end
  1444. -- if self.check_blur_delay_id then
  1445. -- GlobalTimerQuest:CancelQuest(self.check_blur_delay_id)
  1446. -- self.check_blur_delay_id = nil
  1447. -- end
  1448. -- local function delay_method( )
  1449. -- local data = table.remove(self.round_robin_cache_list, 1)
  1450. -- if data then
  1451. -- self:GetCameraBlurScreenShot(data.callback, data.camera_type)
  1452. -- end
  1453. -- end
  1454. -- -- 下一帧再读取缓存
  1455. -- self.check_blur_delay_id = setTimeout(delay_method, 0.01)
  1456. -- end
  1457. -- -- 释放RT缓存
  1458. -- function MainCamera:ClearScreenShotCache(rt)
  1459. -- if not IsNull(rt) then
  1460. -- ReleaseTemporary(rt)
  1461. -- end
  1462. -- end
  1463. -- -- (测试用)切换模糊截屏渲染模式
  1464. -- function MainCamera:SwitchToDualBlur(camera_type, use_dual_blur)
  1465. -- camera_type = camera_type or MainCamera.EffectCameraType.UICamera
  1466. -- local target_effect, max_downSample, recurveMaxNum, blurSpread
  1467. -- -- 根据不同的采样shader选取不一样的默认参数
  1468. -- max_downSample = use_dual_blur and 5 or 4
  1469. -- recurveMaxNum = use_dual_blur and 3 or 4
  1470. -- blurSpread = use_dual_blur and 5 or 1
  1471. -- if camera_type == MainCamera.EffectCameraType.MainCamera then
  1472. -- target_effect = self.main_postEffect
  1473. -- self.main_blur_downSample_value = max_downSample
  1474. -- elseif camera_type == MainCamera.EffectCameraType.UICamera then
  1475. -- target_effect = self.ui_postEffect
  1476. -- self.ui_blur_downSample_value = max_downSample
  1477. -- end
  1478. -- target_effect.use_dual_blur = use_dual_blur
  1479. -- target_effect.downSample = max_downSample
  1480. -- target_effect.blurSpread = blurSpread
  1481. -- target_effect.recurveMaxNum = recurveMaxNum
  1482. -- end
  1483. --------------------------------------------高斯模糊相关end--------------------------------------------
  1484. --------------------------------------------屏幕后处理相关end--------------------------------------------
  1485. function MainCamera:ShowBlackSky( sky_res, target_alpha, step_alpha)
  1486. if self.is_showing_sky_res then
  1487. return
  1488. end
  1489. self.is_showing_sky_res = true
  1490. local target_alpha = target_alpha
  1491. local step_alpha = step_alpha
  1492. local is_need_alpha = false
  1493. if target_alpha and step_alpha then
  1494. is_need_alpha = true
  1495. end
  1496. self.black_sky_res = sky_res or "mrsd_skills_skybox01"
  1497. local function load_call_back( objs, is_gameObject )
  1498. if not objs or not objs[0] then
  1499. return
  1500. end
  1501. if self.black_sky_obj then
  1502. destroy(self.black_sky_obj)
  1503. end
  1504. self.black_sky_obj = is_gameObject and objs[0] or newObject(objs[0])
  1505. self.black_sky_transform = self.black_sky_obj.transform
  1506. self.black_sky_transform:SetParent(self.transform)
  1507. self.black_sky_transform.localScale = Vector3.one
  1508. self.black_sky_transform.localPosition = Vector3.zero
  1509. self.black_sky_renders = self.black_sky_obj:GetComponentsInChildren(typeof(UnityEngine.MeshRenderer))
  1510. if is_need_alpha then
  1511. self.cur_terrain_alpha = self.cur_terrain_alpha or 1
  1512. local function on_alpha_callback( )
  1513. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, false)
  1514. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Reflection, false)
  1515. end
  1516. self:StartTerrainAlphaTimer(self.cur_terrain_alpha, target_alpha, step_alpha, on_alpha_callback)
  1517. else
  1518. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, false)
  1519. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Reflection, false)
  1520. end
  1521. end
  1522. LuaResManager:getInstance():loadPrefab(self, self.black_sky_res, self.black_sky_res, load_call_back, false)
  1523. end
  1524. function MainCamera:HideBlackSky( sky_res, target_alpha, step_alpha)
  1525. if self.terrain_alpha_timer then
  1526. GlobalTimerQuest:CancelQuest(self.terrain_alpha_timer)
  1527. self.terrain_alpha_timer = nil
  1528. end
  1529. if not self.black_sky_obj then
  1530. return
  1531. end
  1532. local target_alpha = target_alpha
  1533. local step_alpha = step_alpha
  1534. local is_need_alpha = false
  1535. if target_alpha and step_alpha then
  1536. is_need_alpha = true
  1537. end
  1538. local function on_hide_callback( )
  1539. if self.black_sky_obj then
  1540. if self.black_sky_res and sky_res == self.black_sky_res then
  1541. lua_resM:AddObjToPool(self, self.black_sky_res, self.black_sky_res, self.black_sky_obj)
  1542. else
  1543. destroy(self.black_sky_obj)
  1544. end
  1545. self.black_sky_obj = nil
  1546. self.black_sky_transform = nil
  1547. end
  1548. self.is_showing_sky_res = false
  1549. end
  1550. if is_need_alpha then
  1551. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, true)
  1552. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Reflection, true)
  1553. self.cur_terrain_alpha = self.cur_terrain_alpha or 0
  1554. self:StartTerrainAlphaTimer(self.cur_terrain_alpha, target_alpha, step_alpha, on_hide_callback)
  1555. else
  1556. on_hide_callback()
  1557. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, true)
  1558. self:SetMainCameraCullingMask(UIPartical.RenderingOther_List.Reflection, true)
  1559. end
  1560. end
  1561. function MainCamera:StartTerrainAlphaTimer(cur_value, target_value, step_alpha, call_back)
  1562. if self.terrain_alpha_timer then
  1563. GlobalTimerQuest:CancelQuest(self.terrain_alpha_timer)
  1564. self.terrain_alpha_timer = nil
  1565. end
  1566. local cur_alpha = cur_value or 0
  1567. step_alpha = step_alpha or 0.02
  1568. local target_value = target_value or 1
  1569. local is_add = cur_alpha < target_value
  1570. local function on_step( )
  1571. cur_alpha = is_add and cur_alpha + step_alpha or cur_alpha - step_alpha
  1572. self.cur_terrain_alpha = cur_alpha
  1573. local is_finish = false
  1574. if is_add then
  1575. is_finish = cur_alpha >= target_value
  1576. else
  1577. is_finish = cur_alpha <= target_value
  1578. end
  1579. if is_finish then
  1580. if self.terrain_alpha_timer then
  1581. GlobalTimerQuest:CancelQuest(self.terrain_alpha_timer)
  1582. self.terrain_alpha_timer = nil
  1583. end
  1584. self:SetTerrainAlpha(target_value)
  1585. if call_back then
  1586. call_back()
  1587. end
  1588. else
  1589. self:SetTerrainAlpha(cur_alpha)
  1590. end
  1591. end
  1592. self.terrain_alpha_timer = GlobalTimerQuest:AddPeriodQuest(on_step, 0.02, -1)
  1593. on_step()
  1594. end
  1595. function MainCamera:SetTerrainAlpha( value )
  1596. self.cur_terrain_alpha = value
  1597. Shader.SetGlobalFloat("_GlobalSceneAlpha", value)
  1598. end
  1599. function MainCamera:GetMovieCamera( )
  1600. if not self.story_camera then
  1601. self.story_camera = self.story_cam_obj:GetComponent("Camera")
  1602. end
  1603. self.story_camera.fieldOfView = self.camera_curr_size
  1604. self.story_camera.transform.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  1605. SetLocalPosition(self.story_camera.transform,0,0,-CameraDistanceWithMainRole)
  1606. return self.story_cam_obj, self.story_camera
  1607. end
  1608. function MainCamera:AddCameraAction( ab_name, res_name, action_name, call_back )
  1609. local function load_finish_func(objs, is_gameObject)
  1610. if not objs or not objs[0] then
  1611. return
  1612. end
  1613. local main_role = Scene.Instance:GetMainRole()
  1614. if main_role and not main_role:IsInState(PoseState.STORY) then
  1615. return
  1616. end
  1617. local temp_controller = objs[0]
  1618. if not self.story_camera then
  1619. self.story_camera = self.story_cam_obj:GetComponent("Camera")
  1620. self.story_camera.enabled = true
  1621. end
  1622. self.story_camera.fieldOfView = 22
  1623. self.story_camera.depth = 6
  1624. self.story_cam_obj.transform.localRotation = Quaternion.Euler(0,0,0)
  1625. SetLocalPosition(self.story_cam_obj.transform,0,0,0)
  1626. self.story_cam_obj:SetActive(true)
  1627. if not self.camera_animator then
  1628. self.camera_animator = self.story_cam_obj:AddComponent(typeof(UnityEngine.Animator))
  1629. end
  1630. self.camera_animator.runtimeAnimatorController = temp_controller
  1631. self.camera_animator:CrossFade(action_name, 0)
  1632. if call_back then
  1633. call_back()
  1634. end
  1635. end
  1636. lua_resM:loadObject(self, ab_name, res_name, load_finish_func)
  1637. end
  1638. function MainCamera:RemoveCameraAction( )
  1639. if self.camera_animator then
  1640. destroy(self.camera_animator)
  1641. self.camera_animator = false
  1642. end
  1643. if self.story_cam_obj then
  1644. SetLocalPosition(self.story_cam_obj.transform, 0, 0, 0)
  1645. self.story_cam_obj.transform.localRotation = Quaternion.Euler(0,0,0)
  1646. end
  1647. if self.story_cam_obj then
  1648. self.story_cam_obj:SetActive(false)
  1649. end
  1650. end
  1651. --------------------- 剧情摄像机径向模糊相关 start ---------------------
  1652. -- 启动径向模糊
  1653. function MainCamera:EnableStoryCameraRadiusBlur(show)
  1654. if self.story_radiusBlur then
  1655. self.story_radiusBlur.enabled = show
  1656. return true
  1657. end
  1658. return false
  1659. end
  1660. -- 设置径向模糊的中心点和模糊半径 中心点坐标范围0~1 模糊半径范围 0~0.03
  1661. function MainCamera:SetStoryCameraRadiusData(centerX, centerY, radius_offset)
  1662. if self.story_radiusBlur then
  1663. -- 获取默认值
  1664. local cur_blurData = self.story_radiusBlur.radius_data
  1665. centerX = centerX or cur_blurData.x
  1666. Clamp(centerX, 0, 1)
  1667. centerY = centerY or cur_blurData.y
  1668. Clamp(centerY, 0, 1)
  1669. radius_offset = radius_offset or cur_blurData.z
  1670. Clamp(radius_offset, 0, 0.03)
  1671. self.story_radiusBlur.radius_data = Vector3(centerX, centerY, radius_offset)
  1672. end
  1673. end
  1674. -- 设置径向模糊的迭代次数
  1675. function MainCamera:SetStoryCameraRadiusIteration(iteration)
  1676. if self.story_radiusBlur then
  1677. -- 获取默认值
  1678. local cur_iteration = self.story_radiusBlur.iteration
  1679. iteration = iteration or cur_iteration
  1680. Clamp(iteration, 1, 30)
  1681. self.story_radiusBlur.iteration = iteration
  1682. end
  1683. end
  1684. --------------------- 剧情摄像机径向模糊相关 end ---------------------
  1685. function MainCamera:ResetAutoRotateInfo( )
  1686. MainCamera.role_last_angle = 0
  1687. MainCamera.role_cur_angle = 0
  1688. MainCamera.role_angle_off = 0
  1689. MainCamera.role_from_camera_angle = 0
  1690. MainCamera.role_last_rotate_area = false
  1691. MainCamera.camera_cur_angle = 0
  1692. MainCamera.camera_target_angle = 0
  1693. MainCamera.camera_enable_rotate = false
  1694. if not IsNull(self.transform) then
  1695. SetLocalRotation(self.transform)
  1696. end
  1697. end