using UnityEngine; using DG.Tweening; /* 拍摄箭飞行的摄像机 */ public class ArrowCamera : MonoBehaviour { [System.NonSerialized] public Arrow arrow; [System.NonSerialized] public ArrowCameraTemplate arrowCameraTemplate; void Awake() { BowCamera.ins.SetArrowFollowing(true); } void Start() { arrowCameraTemplate = new ArrowCameraTemplate1(this); } void OnDestroy() { try { BowCamera.ins.SetArrowFollowing(false); } catch (System.Exception) {} } void FixedUpdate() { arrowCameraTemplate.Update(); } } /* 模板1:跟着箭飞 */ class ArrowCameraTemplate1 : ArrowCameraTemplate { public ArrowCameraTemplate1(ArrowCamera arrowCamera) : base(arrowCamera) { this.arrowCamera.arrow.activeEffectCyclone(true); } private bool cameraMoveFinish = false; Vector3 cameraToRunPosition = new Vector3(0.4f, 0.3f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6)); Vector3 cameraFinalPosition = new Vector3(-0.3f, 0.2f, -1.3f); public override void Update() { if (cameraMoveFinish) { return; } Transform cameraT = this.arrowCamera.transform; Vector3 cameraPosition = cameraT.localPosition; if (this.arrowCamera.arrow.isHit) { cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 8); float d = Vector3.Distance(cameraPosition, cameraFinalPosition); if (d < 0.001f) { cameraMoveFinish = true; Sequence seq = DOTween.Sequence(); seq.AppendInterval(2.2f); seq.AppendCallback(delegate() { this.arrowCamera.arrow.nextShoot(); GameObject.Destroy(this.arrowCamera.gameObject); }); } } else { cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6); } cameraT.LookAt(this.arrowCamera.arrow.Head()); cameraT.localPosition = cameraPosition; } } public class ArrowCameraTemplate { public ArrowCamera arrowCamera; public ArrowCameraTemplate(ArrowCamera arrowCamera) { this.arrowCamera = arrowCamera; } public virtual void Update() {} public virtual void beforeHit() {} public virtual void SendMsg(int id, object msg) {} }