using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.SceneManagement; /* 拍摄箭飞行的摄像机 */ public class ArrowCamera : MonoBehaviour { [System.NonSerialized] public Arrow arrow; [System.NonSerialized] public ArrowCameraTemplate arrowCameraTemplate; void Awake() { BowCamera.ins.GetComponent().enabled = false; } void Start() { if (SceneManager.GetActiveScene().name == "Game") { if (arrow.canUseSideCamera) { arrowCameraTemplate = new ArrowCameraTemplate2(this); } else { arrowCameraTemplate = new ArrowCameraTemplate1(this); } } else if (SceneManager.GetActiveScene().name == "Demo_Day") { arrowCameraTemplate = new ArrowCameraTemplate3(this); } } void OnDestroy() { try { BowCamera.ins.GetComponent().enabled = true; } catch (System.Exception) {} } void FixedUpdate() { arrowCameraTemplate.Update(); } } /* 模板3:跟着箭飞_打猎场景 */ class ArrowCameraTemplate3 : ArrowCameraTemplate { public ArrowCameraTemplate3(ArrowCamera arrowCamera) : base(arrowCamera) { this.arrowCamera.arrow.activeEffectCyclone(true); } private bool cameraMoveFinish = false; Vector3 cameraToRunPosition = new Vector3(0.4f, 0.5f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6)); Vector3 cameraFinalPosition = new Vector3(0.4f, 0.8f, -5f); 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 * 6); float d = Vector3.Distance(cameraPosition, cameraFinalPosition); if (d < 0.001f) { cameraMoveFinish = true; Sequence seq = DOTween.Sequence(); seq.AppendInterval(1f); seq.AppendCallback(delegate() { this.arrowCamera.arrow.nextShoot(); this.arrowCamera.arrow.enabled = false; GameObject.Destroy(container?container:this.arrowCamera.gameObject); }); } } else { cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6); cameraT.LookAt(this.arrowCamera.arrow.Head()); } cameraT.localPosition = cameraPosition; } GameObject container = null; public override void beforeHit() { //把镜头从箭中移除,放到一个固定的容器里,免得随着动物抖动 if (!container) { container = new GameObject("CameraContainer"); container.transform.position = this.arrowCamera.arrow.transform.position; container.transform.rotation = this.arrowCamera.arrow.transform.rotation; this.arrowCamera.transform.SetParent(container.transform); } } } /* 模板2:从侧面看箭飞 */ class ArrowCameraTemplate2 : ArrowCameraTemplate { public ArrowCameraTemplate2(ArrowCamera arrowCamera) : base(arrowCamera) { this.arrowCamera.transform.parent = null; arrowCamera.transform.localPosition = new Vector3(8.33f, 2.45f, 6.4f); arrowCamera.transform.localEulerAngles = new Vector3(0, -42, 0); } bool isHit = false; public override void Update() { if (!isHit) { isHit = arrowCamera.arrow.isHit; if (isHit) { this.arrowCamera.transform.SetParent(this.arrowCamera.arrow.transform); arrowCamera.transform.localPosition = new Vector3(-0.6f, 0.1f, -0.8f); arrowCamera.transform.LookAt(this.arrowCamera.arrow.Head()); Sequence seq = DOTween.Sequence(); seq.PrependInterval(2.2f); seq.AppendCallback(delegate() { this.arrowCamera.arrow.nextShoot(); this.arrowCamera.arrow.enabled = false; GameObject.Destroy(this.arrowCamera.gameObject); }); return; } } if (!arrowCamera.arrow) { GameObject.Destroy(this.arrowCamera.gameObject); } } } /* 模板1:跟着箭飞 */ class ArrowCameraTemplate1 : ArrowCameraTemplate { public ArrowCameraTemplate1(ArrowCamera arrowCamera) : base(arrowCamera) { this.arrowCamera.arrow.activeEffectCyclone(true); } /**相机移动 */ private bool cameraMoveFinish = false; //相机的位置xyz变化 【每秒变化量,最小值,最大值】 private float[] cpcs = { //运动中 6, 0, 0.4f, 6, 0, 0.2f, -18f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6), 0, //击中后 -3.5f, -0.6f, 0.4f, -3.5f, 0.1f, 0.2f, 30, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6), -0.8f }; public override void Update() { if (cameraMoveFinish) { return; } Transform cameraT = this.arrowCamera.transform; Vector3 cameraPosition = cameraT.localPosition; if (this.arrowCamera.arrow.isHit) { cameraPosition.x = Mathf.Clamp(cameraPosition.x + this.cpcs[9] * Time.deltaTime, this.cpcs[10], this.cpcs[11]); cameraPosition.y = Mathf.Clamp(cameraPosition.y + this.cpcs[12] * Time.deltaTime, this.cpcs[13], this.cpcs[14]); cameraPosition.z = Mathf.Clamp(cameraPosition.z + this.cpcs[15] * Time.deltaTime, this.cpcs[16], this.cpcs[17]); float d = Vector3.Distance(cameraPosition, new Vector3( this.cpcs[9] < 0 ? this.cpcs[10]: this.cpcs[11], this.cpcs[12] < 0 ? this.cpcs[13]: this.cpcs[14], this.cpcs[15] < 0 ? this.cpcs[16]: this.cpcs[17] )); if (d < 0.001f) { cameraMoveFinish = true; Sequence seq = DOTween.Sequence(); seq.AppendInterval(2.2f); seq.AppendCallback(delegate() { this.arrowCamera.arrow.nextShoot(); this.arrowCamera.arrow.enabled = false; GameObject.Destroy(this.arrowCamera.gameObject); }); } } else { cameraPosition.x = Mathf.Clamp(cameraPosition.x + this.cpcs[0] * Time.deltaTime, this.cpcs[1], this.cpcs[2]); cameraPosition.y = Mathf.Clamp(cameraPosition.y + this.cpcs[3] * Time.deltaTime, this.cpcs[4], this.cpcs[5]); cameraPosition.z = Mathf.Clamp(cameraPosition.z + this.cpcs[6] * Time.deltaTime, this.cpcs[7], this.cpcs[8]); } cameraT.localPosition = cameraPosition; cameraT.LookAt(this.arrowCamera.arrow.Head()); } } public class ArrowCameraTemplate { public ArrowCamera arrowCamera; public ArrowCameraTemplate(ArrowCamera arrowCamera) { this.arrowCamera = arrowCamera; } public virtual void Update() {} public virtual void beforeHit() {} }