ArrowCamera.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using UnityEngine;
  2. using DG.Tweening;
  3. /* 拍摄箭飞行的摄像机 */
  4. public class ArrowCamera : MonoBehaviour
  5. {
  6. [System.NonSerialized] public Arrow arrow;
  7. [System.NonSerialized] public ArrowCameraTemplate arrowCameraTemplate;
  8. void Awake()
  9. {
  10. BowCamera.ins.SetArrowFollowing(true);
  11. }
  12. void Start()
  13. {
  14. arrowCameraTemplate = new ArrowCameraTemplate1(this);
  15. }
  16. void OnDestroy()
  17. {
  18. try { BowCamera.ins.SetArrowFollowing(false); } catch (System.Exception) {}
  19. }
  20. void FixedUpdate()
  21. {
  22. arrowCameraTemplate.Update();
  23. }
  24. }
  25. /* 模板1:跟着箭飞 */
  26. class ArrowCameraTemplate1 : ArrowCameraTemplate
  27. {
  28. public ArrowCameraTemplate1(ArrowCamera arrowCamera) : base(arrowCamera) {
  29. this.arrowCamera.arrow.activeEffectCyclone(true);
  30. }
  31. private bool cameraMoveFinish = false;
  32. Vector3 cameraToRunPosition = new Vector3(0.4f, 0.3f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6));
  33. Vector3 cameraFinalPosition = new Vector3(-0.3f, 0.2f, -1.3f);
  34. public override void Update() {
  35. if (cameraMoveFinish) {
  36. return;
  37. }
  38. Transform cameraT = this.arrowCamera.transform;
  39. Vector3 cameraPosition = cameraT.localPosition;
  40. if (this.arrowCamera.arrow.isHit) {
  41. cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 8);
  42. float d = Vector3.Distance(cameraPosition, cameraFinalPosition);
  43. if (d < 0.001f) {
  44. cameraMoveFinish = true;
  45. Sequence seq = DOTween.Sequence();
  46. seq.AppendInterval(2.2f);
  47. seq.AppendCallback(delegate() {
  48. this.arrowCamera.arrow.nextShoot();
  49. GameObject.Destroy(this.arrowCamera.gameObject);
  50. });
  51. }
  52. } else {
  53. cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6);
  54. }
  55. cameraT.LookAt(this.arrowCamera.arrow.Head());
  56. cameraT.localPosition = cameraPosition;
  57. }
  58. }
  59. public class ArrowCameraTemplate {
  60. public ArrowCamera arrowCamera;
  61. public ArrowCameraTemplate(ArrowCamera arrowCamera)
  62. {
  63. this.arrowCamera = arrowCamera;
  64. }
  65. public virtual void Update() {}
  66. public virtual void beforeHit() {}
  67. public virtual void SendMsg(int id, object msg) {}
  68. }