源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

393 lines
17 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 发行需求:全自由摄像机
  4. -- *>
  5. CheatFreeCameraView = CheatFreeCameraView or BaseClass(BaseView)
  6. local CheatFreeCameraView = CheatFreeCameraView
  7. local math_random = math.random
  8. local Clamp = Mathf.Clamp
  9. function CheatFreeCameraView:__init()
  10. self.base_file = "cheat"
  11. self.layout_file = "CheatFreeCameraView"
  12. self.layer_name = "Top"
  13. self.destroy_imm = true
  14. self.use_background = false --全屏界面默认使用这个参数,非全屏界面自行设置
  15. self.is_show = true
  16. self.mc_camera = nil -- 主摄像机组件
  17. self.mc_trans = nil -- 主摄像机transform
  18. self.mc_node_trans = nil -- 主摄像机父节点transform
  19. self.mc_offset = Vector3(0, 0, 12) -- 主摄像机的节点内偏移
  20. self.main_role = Scene.Instance:GetMainRole()
  21. -- 参数相关
  22. self.view_mask_last_pos = Vector2(0, 0) -- 摄像机视角点击UV位置
  23. self.view_asix_speed = 0.1 -- 摄像机轴移动速度
  24. self.move_mask_start_pos = Vector2(0, 0) -- 摄像机移动起始点击UV位置
  25. self.move_input = Vector2(0, 0) -- 摄像机自由移动输入方向
  26. self.cam_move_speed = 0.2 -- 摄像机轴移动速度
  27. self.cam_asix_radius = 50 -- 滑动移动轴半径
  28. self.can_auto_round = false -- 是否可以自动环绕
  29. self.auto_rotate_speed = 0 -- 自动环绕速度
  30. self.camera_radius = 5 -- 摄像机定位半径
  31. self.height_offset = 2 -- 摄像机Z轴offset
  32. self.show_main_canvas_flag = true -- 显示主界面canvas
  33. self.fixed_relative_camera_pos = nil -- 跟随移动时的相对摄像机位置
  34. self.load_callback = function ()
  35. self:LoadSuccess()
  36. self:AddEvent()
  37. end
  38. self.open_callback = function ( )
  39. self:UpdateView()
  40. end
  41. self.destroy_callback = function ( )
  42. self:DestroySuccess()
  43. end
  44. end
  45. function CheatFreeCameraView:Open( )
  46. MainCamera.FreeCameraViewOpened = true
  47. BaseView.Open(self)
  48. end
  49. function CheatFreeCameraView:LoadSuccess()
  50. local nodes = {
  51. "free_camera_view_mask:obj", -- 全自动摄像机视角方向mask
  52. "free_camera_move_mask:obj", -- 全自动摄像机移动mask
  53. "closeBtn:obj",
  54. "hideBtn:obj",
  55. -- 自动操作按钮
  56. "front_btn:obj", -- 主角正向
  57. "back_btn:obj", -- 主角背面
  58. "random_btn:obj", -- 主角随机环绕角度
  59. "auto_round_btn:obj", -- 主角自动环绕
  60. }
  61. self:GetChildren(nodes)
  62. -- 主摄FOV
  63. self.main_cam_fov_sl = self:GetChild("main_cam_fov/main_cam_fov_sl"):GetComponent("Slider")
  64. self.main_cam_fov_val = self:GetChild("main_cam_fov/main_cam_fov_val"):GetComponent(typeof(TMPro.TextMeshProUGUI))
  65. -- 摄像机自动环绕速度
  66. self.auto_round_sl = self:GetChild("auto_round/auto_round_sl"):GetComponent("Slider")
  67. self.auto_round_val = self:GetChild("auto_round/auto_round_val"):GetComponent(typeof(TMPro.TextMeshProUGUI))
  68. -- 摄像机定位半径
  69. self.radius_sl = self:GetChild("radius/radius_sl"):GetComponent("Slider")
  70. self.radius_val = self:GetChild("radius/radius_val"):GetComponent(typeof(TMPro.TextMeshProUGUI))
  71. -- 摄像机Z轴offset
  72. self.height_offset_sl = self:GetChild("height_offset/height_offset_sl"):GetComponent("Slider")
  73. self.height_offset_val = self:GetChild("height_offset/height_offset_val"):GetComponent(typeof(TMPro.TextMeshProUGUI))
  74. -- 全自由摄像机
  75. self.free_camera_tog = self:GetChild("free_camera"):GetComponent("Toggle")
  76. -- 显示mainCanvas
  77. self.show_main_canvas_tog = self:GetChild("show_main_canvas"):GetComponent("Toggle")
  78. SetSizeDelta(self.free_camera_view_mask, ScreenWidth / 2, ScreenHeight)
  79. SetSizeDelta(self.free_camera_move_mask, ScreenWidth / 2, ScreenHeight)
  80. SetAnchoredPositionX(self.free_camera_move_mask, -366 - ScreenWidth / 2)
  81. SetAnchoredPosition(self.transform, -ClientConfig.iphone_x_offset_right, 0)
  82. end
  83. function CheatFreeCameraView:AddEvent()
  84. local function onOrientationChange()
  85. SetAnchoredPosition(self.transform, -ClientConfig.iphone_x_offset_right, 0)
  86. end
  87. self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
  88. local function click_event(target)
  89. if target == self.closeBtn_obj then -- 关闭界面
  90. local function ok( ... )
  91. self:Close()
  92. end
  93. local ask_str = "(防止点错)是否确定关闭测试界面?"
  94. Alert.show(ask_str, Alert.Type.Two, ok, nil, "确定", "不不不我这是乱点的")
  95. elseif target == self.hideBtn_obj then -- 隐藏界面
  96. self:HideAction(not self.is_show)
  97. elseif target == self.free_camera_tog.gameObject then -- 全自由摄像机,是则打开操作mask
  98. local isOn = self.free_camera_tog.isOn
  99. self.free_camera_move_mask_obj:SetActive(isOn)
  100. self.free_camera_view_mask_obj:SetActive(isOn)
  101. -- 如果使用全自由摄像机,那就要强制关闭自动环绕
  102. self.can_auto_round = self.can_auto_round and not isOn
  103. elseif target == self.show_main_canvas_tog.gameObject then -- 是否显示主界面UI
  104. self.show_main_canvas_flag = self.show_main_canvas_tog.isOn
  105. self:ShowMainCanvas()
  106. elseif target == self.front_btn_obj then -- 摄像机朝向主角正面
  107. -- 强制关闭自动环绕
  108. self.can_auto_round = false
  109. self:SetCameraLookAtRoleFront()
  110. elseif target == self.back_btn_obj then -- 摄像机朝向主角背面
  111. -- 强制关闭自动环绕
  112. self.can_auto_round = false
  113. self:SetCameraLookAtRoleBack()
  114. elseif target == self.random_btn_obj then -- 摄像机随机角度于主角
  115. -- 强制关闭自动环绕
  116. self.can_auto_round = false
  117. self:SetCameraLookAtRoleWithRandomAngle()
  118. elseif target == self.auto_round_btn_obj then -- 摄像机自动环绕主角
  119. self:SetCameraAutoRotateAroundRole()
  120. -- 自动环绕要关闭全自由摄像机
  121. self.free_camera_tog.isOn = false
  122. self.free_camera_move_mask_obj:SetActive(false)
  123. self.free_camera_view_mask_obj:SetActive(false)
  124. end
  125. end
  126. AddClickEvent(self.closeBtn_obj, click_event)
  127. AddClickEvent(self.hideBtn_obj, click_event)
  128. AddClickEvent(self.free_camera_tog.gameObject, click_event)
  129. AddClickEvent(self.show_main_canvas_tog.gameObject, click_event)
  130. AddClickEvent(self.front_btn_obj, click_event)
  131. AddClickEvent(self.back_btn_obj, click_event)
  132. AddClickEvent(self.random_btn_obj, click_event)
  133. AddClickEvent(self.auto_round_btn_obj, click_event)
  134. local function onSliderDrag(target)
  135. local value = target:GetComponent("Slider").value
  136. if target == self.main_cam_fov_sl.gameObject then
  137. self.main_cam_fov_val.text = value
  138. if self.mc_camera then
  139. self.mc_camera.fieldOfView = value
  140. end
  141. elseif target == self.auto_round_sl.gameObject then
  142. self.auto_round_val.text = tonumber(string.format("%.2f", value))
  143. self.auto_rotate_speed = value
  144. elseif target == self.radius_sl.gameObject then
  145. self.radius_val.text = tonumber(string.format("%.2f", value))
  146. self.camera_radius = value
  147. elseif target == self.height_offset_sl.gameObject then -- z轴offset
  148. self.height_offset_val.text = tonumber(string.format("%.2f", value))
  149. self.height_offset = value
  150. end
  151. end
  152. AddDragEvent(self.main_cam_fov_sl.gameObject, onSliderDrag)
  153. AddDragEvent(self.auto_round_sl.gameObject, onSliderDrag)
  154. AddDragEvent(self.radius_sl.gameObject, onSliderDrag)
  155. AddDragEvent(self.height_offset_sl.gameObject, onSliderDrag)
  156. -- 全自由摄像机转动
  157. local function onPressViewMask(target, x, y)
  158. self.view_mask_last_pos = Vector2(x, y)
  159. end
  160. local function onDragViewMask(target, x, y)
  161. local pos_offset_x = x - self.view_mask_last_pos.x
  162. local pos_offset_y = y - self.view_mask_last_pos.y
  163. local angel_delta = Vector2(-pos_offset_y * self.view_asix_speed, pos_offset_x * self.view_asix_speed)
  164. local cam_angel = self:GetCameraYEulerAngle()
  165. local new_angle = Vector3(cam_angel.x + angel_delta.x, cam_angel.y + angel_delta.y, cam_angel.z)
  166. self:SetCameraYEulerAngle(new_angle)
  167. self.view_mask_last_pos = Vector2(x, y)
  168. end
  169. local function onExitViewMask(target)
  170. self.view_mask_last_pos = Vector2(0, 0)
  171. end
  172. AddDragBeginEvent(self.free_camera_view_mask_obj, onPressViewMask)
  173. AddDragEvent(self.free_camera_view_mask_obj, onDragViewMask)
  174. AddDragEndEvent(self.free_camera_view_mask_obj, onExitViewMask)
  175. -- 全自由摄像机移动
  176. local function onPressMoveMask(target, x, y)
  177. self.move_mask_start_pos = Vector2(x, y)
  178. end
  179. local function onDragMoveMask(target, x, y)
  180. local pos_offset_x = x - self.move_mask_start_pos.x
  181. local pos_offset_y = y - self.move_mask_start_pos.y
  182. local input = Vector2(pos_offset_x, pos_offset_y) / self.cam_asix_radius
  183. input.x = Clamp(input.x, -1, 1)
  184. input.y = Clamp(input.y, -1, 1)
  185. self.move_input = input
  186. end
  187. local function onExitMoveMask(target)
  188. self.move_mask_start_pos = Vector2(0, 0)
  189. self.move_input = Vector2(0, 0)
  190. end
  191. AddDragBeginEvent(self.free_camera_move_mask_obj, onPressMoveMask)
  192. AddDragEvent(self.free_camera_move_mask_obj, onDragMoveMask)
  193. AddDragEndEvent(self.free_camera_move_mask_obj, onExitMoveMask)
  194. end
  195. function CheatFreeCameraView:UpdateView()
  196. self:GetMainCamera()
  197. self:InitOptionsData()
  198. self:HideAction(true)
  199. self:BindCameraMoveEvent()
  200. self:ShowMainCanvas()
  201. end
  202. -- 获取主摄像机
  203. function CheatFreeCameraView:GetMainCamera( )
  204. -- 获取摄像机
  205. if not self.mc_camera or not self.mc_trans or not self.mc_node_trans then
  206. self.mc_camera = MainCamera.Instance.camera
  207. self.mc_trans = MainCamera.Instance.camera_gameObject.transform
  208. self.mc_node_trans = MainCamera.Instance.transform
  209. end
  210. end
  211. -- 初始化设置选项
  212. function CheatFreeCameraView:InitOptionsData( )
  213. self.main_cam_fov_sl.value = self.mc_camera.fieldOfView
  214. self.main_cam_fov_val.text = self.mc_camera.fieldOfView
  215. self.main_camera_fov = self.mc_camera.fieldOfView -- 用于复原摄像机
  216. self.auto_round_sl.value = self.auto_rotate_speed
  217. self.auto_round_val.text = self.auto_rotate_speed
  218. self.radius_sl.value = self.camera_radius
  219. self.radius_val.text = self.camera_radius
  220. self.height_offset_sl.value = self.height_offset
  221. self.height_offset_val.text = self.height_offset
  222. self.show_main_canvas_tog.isOn = self.show_main_canvas_flag
  223. end
  224. -- 获取主角当前真实世界坐标
  225. function CheatFreeCameraView:GetMainRoleRealWorldPos( )
  226. return self.main_role.modelObj_transform.position + Vector3(0, self.height_offset, 0)
  227. end
  228. function CheatFreeCameraView:GetMainRoleForwardDir( )
  229. return self.main_role.modelObj_transform.forward
  230. end
  231. function CheatFreeCameraView:GetMainRoleUpDir( )
  232. return self.main_role.modelObj_transform.up
  233. end
  234. function CheatFreeCameraView:GetCameraYEulerAngle( )
  235. return self.mc_trans.eulerAngles
  236. end
  237. function CheatFreeCameraView:SetCameraYEulerAngle(val)
  238. self.mc_trans.rotation = Quaternion.Euler(val)
  239. end
  240. function CheatFreeCameraView:GetCameraForwardDir( )
  241. return self.mc_trans.forward
  242. end
  243. function CheatFreeCameraView:GetCameraRightDir( )
  244. return self.mc_trans.right
  245. end
  246. function CheatFreeCameraView:GetCameraNodePosition( )
  247. return self.mc_node_trans.position
  248. end
  249. function CheatFreeCameraView:SetCameraNodePosition(val)
  250. self.mc_node_trans.position = val
  251. end
  252. -- 摄像机位置按钮相关
  253. -- 摄像机朝向主角正面
  254. function CheatFreeCameraView:SetCameraLookAtRoleFront( )
  255. local role_pos = self:GetMainRoleRealWorldPos()
  256. local role_forward = self:GetMainRoleForwardDir()
  257. local camera_pos = role_forward * self.camera_radius + role_pos + self.mc_offset
  258. if self.mc_node_trans and self.mc_trans then
  259. self.mc_node_trans.position = camera_pos
  260. self.mc_trans:LookAt(role_pos)
  261. end
  262. end
  263. -- 摄像机朝向主角背面
  264. function CheatFreeCameraView:SetCameraLookAtRoleBack( )
  265. local role_pos = self:GetMainRoleRealWorldPos()
  266. local role_forward = self:GetMainRoleForwardDir()
  267. local camera_pos = - role_forward * self.camera_radius + role_pos + self.mc_offset
  268. if self.mc_node_trans and self.mc_trans then
  269. self.mc_node_trans.position = camera_pos
  270. self.mc_trans:LookAt(role_pos)
  271. end
  272. end
  273. -- 摄像机随机角度于主角
  274. function CheatFreeCameraView:SetCameraLookAtRoleWithRandomAngle( )
  275. local role_pos = self:GetMainRoleRealWorldPos()
  276. local role_forward = self:GetMainRoleForwardDir()
  277. local role_up = self:GetMainRoleUpDir()
  278. local random_angle = math_random(-180, 180)
  279. local camera_pos = Quaternion.AngleAxis(random_angle, role_up) * role_forward * self.camera_radius + role_pos + self.mc_offset
  280. if self.mc_node_trans and self.mc_trans then
  281. self.mc_node_trans.position = camera_pos
  282. self.mc_trans:LookAt(role_pos)
  283. end
  284. end
  285. -- 摄像机自动环绕主角
  286. function CheatFreeCameraView:SetCameraAutoRotateAroundRole( )
  287. self.can_auto_round = true
  288. self.last_node_time = Status.NowTime
  289. local start_angle = 0
  290. if not self.auto_rotate_camera_id then
  291. local function auto_rotate()
  292. if self.can_auto_round then
  293. local role_pos = self:GetMainRoleRealWorldPos()
  294. local role_forward = self:GetMainRoleForwardDir()
  295. local role_up = self:GetMainRoleUpDir()
  296. local past_time = Status.NowTime - self.last_node_time
  297. local speed_per_frame = self.auto_rotate_speed / 30
  298. start_angle = start_angle + speed_per_frame * past_time / 0.02
  299. local camera_pos = Quaternion.AngleAxis(start_angle, role_up) *
  300. role_forward * self.camera_radius + role_pos + self.mc_offset
  301. if self.mc_node_trans and self.mc_trans then
  302. self.mc_node_trans.position = camera_pos
  303. self.mc_trans:LookAt(role_pos)
  304. end
  305. end
  306. self.last_node_time = Status.NowTime
  307. end
  308. self.auto_rotate_camera_id = GlobalTimerQuest:AddPeriodQuest(auto_rotate, 0.02, -1)
  309. end
  310. end
  311. function CheatFreeCameraView:HideAction(show)
  312. self:StopHideAction()
  313. self.is_show = show
  314. self.hideBtn.transform.localRotation = Quaternion.Euler(Vector3(0, 0, self.is_show and 90 or 270))
  315. local target_pos_x = (self.is_show and 0 or 366 ) - ClientConfig.iphone_x_offset_right
  316. self.con_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSX, target_pos_x, 0.3, nil, TweenFunc.EASE_OUT_QUINT)
  317. end
  318. function CheatFreeCameraView:StopHideAction( )
  319. if self.con_anim_id then
  320. TweenLite.Stop(self.con_anim_id)
  321. SetAnchoredPositionX(self.transform, (self.is_show and 0 or 366) - ClientConfig.iphone_x_offset_right)
  322. end
  323. end
  324. function CheatFreeCameraView:BindCameraMoveEvent( )
  325. if not self.camera_move_event_id then
  326. local function camera_move_func()
  327. if self.free_camera_tog.isOn then
  328. self.fixed_relative_camera_pos = nil
  329. if self.move_input.x ~= 0 or self.move_input.y ~= 0 then
  330. local input = self.move_input
  331. local forward_dir = self:GetCameraForwardDir()
  332. local right_dir = self:GetCameraRightDir()
  333. local cur_pos = self:GetCameraNodePosition()
  334. local new_pos = cur_pos + forward_dir * input.y * self.cam_move_speed + right_dir * input.x * self.cam_move_speed
  335. self:SetCameraNodePosition(new_pos)
  336. end
  337. else
  338. if not self.fixed_relative_camera_pos then
  339. self.fixed_relative_camera_pos = self:GetCameraNodePosition() - self:GetMainRoleRealWorldPos()
  340. end
  341. self:SetCameraNodePosition(self:GetMainRoleRealWorldPos() + self.fixed_relative_camera_pos)
  342. end
  343. end
  344. self.camera_move_event_id = GlobalTimerQuest:AddPeriodQuest(camera_move_func, 0.02, -1)
  345. end
  346. end
  347. function CheatFreeCameraView:ShowMainCanvas( )
  348. panelMgr:GetParent("Main").gameObject:SetActive(self.show_main_canvas_flag)
  349. panelMgr:GetParent("NameBoard").gameObject:SetActive(self.show_main_canvas_flag)
  350. panelMgr:GetParent("Dynamic_NameBoard").gameObject:SetActive(self.show_main_canvas_flag)
  351. end
  352. function CheatFreeCameraView:DestroySuccess( )
  353. self:StopHideAction()
  354. if self.auto_rotate_camera_id then
  355. GlobalTimerQuest:CancelQuest(self.auto_rotate_camera_id)
  356. self.auto_rotate_camera_id = nil
  357. end
  358. if self.camera_move_event_id then
  359. GlobalTimerQuest:CancelQuest(self.camera_move_event_id)
  360. self.camera_move_event_id = nil
  361. end
  362. -- 复原摄像机
  363. if self.mc_camera then
  364. self.mc_camera.fieldOfView = self.main_camera_fov
  365. end
  366. self.mc_trans.localRotation = Quaternion.Euler(SceneCameraRotate,0,0)
  367. MainCamera.FreeCameraViewOpened = false
  368. end