ArrowCamera.cs 11 KB

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