ArrowCameraNew.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. using UnityEngine.SceneManagement;
  6. /* 拍摄箭飞行的摄像机 */
  7. public class ArrowCameraNew : MonoBehaviour
  8. {
  9. public int playerIndex;
  10. [System.NonSerialized] public ArrowNew2 arrow;
  11. [System.NonSerialized] public ArrowCameraTemplateNew arrowCameraTemplate;
  12. [System.NonSerialized] public bool isArrowSync = false;
  13. [System.NonSerialized] public ArrowSync arrowSync;
  14. public void SetArrowSync(ArrowSync arrowSync)
  15. {
  16. isArrowSync = true;
  17. this.arrowSync = arrowSync;
  18. }
  19. //在Awake之前调用,设置好属性
  20. public ArrowCameraNew setInitData(ArrowNew2 _arrow,int _playerIndex) {
  21. arrow = _arrow;
  22. playerIndex = _playerIndex;
  23. //Debug.Log("setInitData playerIndex==============:" + playerIndex);
  24. return this;
  25. }
  26. void Awake()
  27. {
  28. }
  29. void Start()
  30. {
  31. //Debug.Log("start playerIndex==============:" + playerIndex);
  32. if (playerIndex == 0)
  33. {
  34. GameController.ins.GetBowCameraDoublePlayer(PlayerType.FirstPlayer).SetArrowFollowing(true);
  35. }
  36. else
  37. {
  38. GameController.ins.GetBowCameraDoublePlayer(PlayerType.SecondPlayer).SetArrowFollowing(true);
  39. }
  40. if (SceneManager.GetActiveScene().name == "GameDouble" || SceneManager.GetActiveScene().name == "InfraredGameDouble")
  41. {
  42. arrowCameraTemplate = new ArrowCameraTemplateNew1(this);
  43. //if ((isArrowSync && arrowSync.canUseSideCamera) || (!isArrowSync && arrow.canUseSideCamera))
  44. //{
  45. // Debug.Log("ArrowCameraTemplateNew2");
  46. // arrowCameraTemplate = new ArrowCameraTemplateNew2(this);
  47. //}
  48. //else
  49. //{
  50. //}
  51. }
  52. }
  53. void OnDestroy()
  54. {
  55. try
  56. {
  57. //Debug.Log("playerIndex==============:"+ playerIndex);
  58. if (playerIndex == 0)
  59. {
  60. GameController.ins.GetBowCameraDoublePlayer(PlayerType.FirstPlayer).SetArrowFollowing(false);
  61. }
  62. else
  63. {
  64. GameController.ins.GetBowCameraDoublePlayer(PlayerType.SecondPlayer).SetArrowFollowing(false);
  65. }
  66. }
  67. catch (System.Exception) { }
  68. }
  69. void FixedUpdate()
  70. {
  71. arrowCameraTemplate.Update();
  72. }
  73. }
  74. /* 模板3:跟着箭飞_打猎场景 */
  75. class ArrowCameraTemplateNew3 : ArrowCameraTemplateNew
  76. {
  77. public ArrowCameraTemplateNew3(ArrowCameraNew arrowCamera) : base(arrowCamera)
  78. {
  79. if (!arrowCamera.isArrowSync)
  80. {
  81. this.arrowCamera.arrow.activeEffectCyclone(true);
  82. }
  83. else
  84. {
  85. this.arrowCamera.arrowSync.activeEffectCyclone(true);
  86. }
  87. Camera camera = arrowCamera.transform.GetComponent<Camera>();
  88. if (camera) camera.fieldOfView = 25;
  89. }
  90. private bool cameraMoveFinish = false;
  91. Vector3 cameraToRunPosition = new Vector3(0.4f, 0.5f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6));
  92. Vector3 cameraFinalPosition = new Vector3(0.4f, 0.8f, -5f);
  93. //若有树的遮挡,则使用以下视角坐标
  94. Vector3 cameraFinalPosition_whenBlockByTree = new Vector3(0.15f, 0.3f, -1.2f);
  95. bool hasBlockByTree = false;
  96. Vector3 blockByTreeLookAtPoint;
  97. public override void Update()
  98. {
  99. if (cameraMoveFinish)
  100. {
  101. return;
  102. }
  103. Transform cameraT = this.arrowCamera.transform;
  104. Vector3 cameraPosition = cameraT.localPosition;
  105. if ((!this.arrowCamera.isArrowSync && this.arrowCamera.arrow.isHit) ||
  106. (this.arrowCamera.isArrowSync && this.arrowCamera.arrowSync.isHit))
  107. {
  108. cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 6);
  109. cameraT.localPosition = cameraPosition;
  110. if (hasBlockByTree)
  111. {
  112. cameraT.LookAt(blockByTreeLookAtPoint);
  113. }
  114. float d = Vector3.Distance(cameraPosition, cameraFinalPosition);
  115. if (d < 0.001f)
  116. {
  117. cameraMoveFinish = true;
  118. Sequence seq = DOTween.Sequence();
  119. if (!quicklyNextShoot) seq.AppendInterval(1f);
  120. seq.AppendCallback(delegate () {
  121. if (!this.arrowCamera.isArrowSync)
  122. {
  123. this.arrowCamera.arrow.nextShoot();
  124. }
  125. GameObject.Destroy(container ? container : this.arrowCamera.gameObject);
  126. });
  127. }
  128. }
  129. else
  130. {
  131. cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6);
  132. cameraT.localPosition = cameraPosition;
  133. if (this.arrowCamera.isArrowSync)
  134. {
  135. cameraT.LookAt(this.arrowCamera.arrowSync.Head());
  136. }
  137. else
  138. {
  139. cameraT.LookAt(this.arrowCamera.arrow.Head());
  140. }
  141. }
  142. }
  143. GameObject container = null;
  144. public override void beforeHit()
  145. {
  146. //把镜头从箭中移除,放到一个固定的容器里,免得随着动物抖动
  147. if (!container)
  148. {
  149. container = new GameObject("CameraContainer");
  150. container.transform.position = this.arrowCamera.arrow.transform.position;
  151. container.transform.rotation = this.arrowCamera.arrow.transform.rotation;
  152. this.arrowCamera.transform.SetParent(container.transform);
  153. //检测有没有树遮挡
  154. Quaternion rot = container.transform.rotation;
  155. Quaternion back = rot * Quaternion.AngleAxis(180, Vector3.up); //绕本地坐标轴旋转
  156. for (int i = -36; i <= 36; i += 3)
  157. {
  158. float angle = i;
  159. Quaternion axis = back * Quaternion.AngleAxis(angle, Vector3.up);
  160. Vector3 direction = axis * Vector3.forward;
  161. RaycastHit[] raycastHits = Physics.RaycastAll(container.transform.position, direction, 6f);
  162. foreach (var raycastHit in raycastHits)
  163. {
  164. Transform tf = raycastHit.transform;
  165. if (tf && tf.name.StartsWith("TreeCollider"))
  166. {
  167. cameraFinalPosition = cameraFinalPosition_whenBlockByTree;
  168. hasBlockByTree = true;
  169. ArrowNew2 arrow = this.arrowCamera.arrow;
  170. blockByTreeLookAtPoint = arrow.Head().position - arrow.transform.forward * 0.5f;
  171. break;
  172. }
  173. }
  174. }
  175. }
  176. //记录需要同步的消息
  177. if (!this.arrowCamera.isArrowSync)
  178. {
  179. if (this.arrowCamera.arrow.outputSyncData != null)
  180. {
  181. this.arrowCamera.arrow.outputSyncData.SetArrowCameraTemplate3(this.hasBlockByTree, this.quicklyNextShoot);
  182. }
  183. }
  184. }
  185. public void beforHitWhenSync(bool hasBlockByTree)
  186. {
  187. this.hasBlockByTree = hasBlockByTree;
  188. container = new GameObject("CameraContainer");
  189. container.transform.position = this.arrowCamera.arrowSync.transform.position;
  190. container.transform.rotation = Quaternion.LookRotation(this.arrowCamera.arrowSync.transform.forward, Vector3.up);
  191. this.arrowCamera.transform.SetParent(container.transform);
  192. this.arrowCamera.transform.localRotation = Quaternion.identity;
  193. if (hasBlockByTree)
  194. {
  195. cameraFinalPosition = cameraFinalPosition_whenBlockByTree;
  196. ArrowSync arrowSync = this.arrowCamera.arrowSync;
  197. blockByTreeLookAtPoint = arrowSync.Head().position - arrowSync.transform.forward * 0.5f;
  198. }
  199. }
  200. public bool quicklyNextShoot = ChallengeGameMode.IsChallengeWolf();
  201. public override void SendMsg(int id, object msg)
  202. {
  203. if (id == 0)
  204. {
  205. quicklyNextShoot = true;
  206. }
  207. //记录需要同步的消息
  208. if (!this.arrowCamera.isArrowSync)
  209. {
  210. if (this.arrowCamera.arrow.outputSyncData != null)
  211. {
  212. this.arrowCamera.arrow.outputSyncData.SetArrowCameraTemplate3(this.hasBlockByTree, this.quicklyNextShoot);
  213. }
  214. }
  215. }
  216. }
  217. /* 模板2:从侧面看箭飞 */
  218. class ArrowCameraTemplateNew2 : ArrowCameraTemplateNew
  219. {
  220. public ArrowCameraTemplateNew2(ArrowCameraNew arrowCamera) : base(arrowCamera)
  221. {
  222. this.arrowCamera.transform.parent = null;
  223. arrowCamera.transform.localPosition = new Vector3(8.33f, 2.45f, 6.4f);
  224. arrowCamera.transform.localEulerAngles = new Vector3(0, -42, 0);
  225. }
  226. bool isHit = false;
  227. public override void Update()
  228. {
  229. if (arrowCamera.isArrowSync)
  230. {
  231. if (!isHit)
  232. {
  233. isHit = arrowCamera.arrowSync.isHit;
  234. if (isHit)
  235. {
  236. this.arrowCamera.transform.SetParent(this.arrowCamera.arrowSync.transform);
  237. arrowCamera.transform.localPosition = new Vector3(-0.3f, 0.2f, -1.3f);
  238. arrowCamera.transform.LookAt(this.arrowCamera.arrowSync.Head());
  239. Sequence seq = DOTween.Sequence();
  240. seq.PrependInterval(2.2f);
  241. seq.AppendCallback(delegate () {
  242. GameObject.Destroy(this.arrowCamera.gameObject);
  243. });
  244. return;
  245. }
  246. }
  247. if (!arrowCamera.arrowSync)
  248. {
  249. GameObject.Destroy(this.arrowCamera.gameObject);
  250. }
  251. }
  252. else
  253. {
  254. if (!isHit)
  255. {
  256. isHit = arrowCamera.arrow.isHit;
  257. if (isHit)
  258. {
  259. this.arrowCamera.transform.SetParent(this.arrowCamera.arrow.transform);
  260. arrowCamera.transform.localPosition = new Vector3(-0.3f, 0.2f, -1.3f);
  261. arrowCamera.transform.LookAt(this.arrowCamera.arrow.Head());
  262. Sequence seq = DOTween.Sequence();
  263. seq.PrependInterval(2.2f);
  264. seq.AppendCallback(delegate () {
  265. this.arrowCamera.arrow.nextShoot();
  266. GameObject.Destroy(this.arrowCamera.gameObject);
  267. });
  268. return;
  269. }
  270. }
  271. if (!arrowCamera.arrow)
  272. {
  273. GameObject.Destroy(this.arrowCamera.gameObject);
  274. }
  275. }
  276. }
  277. }
  278. /* 模板1:跟着箭飞 */
  279. class ArrowCameraTemplateNew1 : ArrowCameraTemplateNew
  280. {
  281. public ArrowCameraTemplateNew1(ArrowCameraNew arrowCamera) : base(arrowCamera)
  282. {
  283. if (!arrowCamera.isArrowSync)
  284. {
  285. this.arrowCamera.arrow.activeEffectCyclone(true);
  286. }
  287. else
  288. {
  289. this.arrowCamera.arrowSync.activeEffectCyclone(true);
  290. }
  291. }
  292. private bool cameraMoveFinish = false;
  293. Vector3 cameraToRunPosition = new Vector3(0.4f, 0.3f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6));
  294. Vector3 cameraFinalPosition = new Vector3(-0.3f, 0.2f, -1.3f);
  295. public override void Update()
  296. {
  297. if (cameraMoveFinish)
  298. {
  299. return;
  300. }
  301. Transform cameraT = this.arrowCamera.transform;
  302. Vector3 cameraPosition = cameraT.localPosition;
  303. if ((!this.arrowCamera.isArrowSync && this.arrowCamera.arrow.isHit) ||
  304. (this.arrowCamera.isArrowSync && this.arrowCamera.arrowSync.isHit))
  305. {
  306. cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 8);
  307. float d = Vector3.Distance(cameraPosition, cameraFinalPosition);
  308. if (d < 0.001f)
  309. {
  310. cameraMoveFinish = true;
  311. Sequence seq = DOTween.Sequence();
  312. seq.AppendInterval(2.2f);
  313. seq.AppendCallback(delegate () {
  314. if (!arrowCamera.isArrowSync)
  315. {
  316. this.arrowCamera.arrow.nextShoot();
  317. }
  318. GameObject.Destroy(this.arrowCamera.gameObject);
  319. });
  320. }
  321. }
  322. else
  323. {
  324. cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6);
  325. }
  326. if (this.arrowCamera.isArrowSync)
  327. {
  328. cameraT.LookAt(this.arrowCamera.arrowSync.Head());
  329. }
  330. else
  331. {
  332. cameraT.LookAt(this.arrowCamera.arrow.Head());
  333. }
  334. cameraT.localPosition = cameraPosition;
  335. }
  336. }
  337. public class ArrowCameraTemplateNew
  338. {
  339. public ArrowCameraNew arrowCamera;
  340. public ArrowCameraTemplateNew(ArrowCameraNew arrowCamera)
  341. {
  342. this.arrowCamera = arrowCamera;
  343. }
  344. public virtual void Update() { }
  345. public virtual void beforeHit() { }
  346. public virtual void SendMsg(int id, object msg) { }
  347. }