using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.SceneManagement; /* 拍摄箭飞行的摄像机 */ public class ArrowCameraNew : MonoBehaviour { public int playerIndex; [System.NonSerialized] public ArrowNew2 arrow; [System.NonSerialized] public ArrowCameraTemplateNew arrowCameraTemplate; [System.NonSerialized] public bool isArrowSync = false; [System.NonSerialized] public ArrowSync arrowSync; public void SetArrowSync(ArrowSync arrowSync) { isArrowSync = true; this.arrowSync = arrowSync; } //在Awake之前调用,设置好属性 public ArrowCameraNew setInitData(ArrowNew2 _arrow,int _playerIndex) { arrow = _arrow; playerIndex = _playerIndex; //Debug.Log("setInitData playerIndex==============:" + playerIndex); return this; } void Awake() { } void Start() { //Debug.Log("start playerIndex==============:" + playerIndex); if (playerIndex == 0) { GameController.ins.GetBowCameraDoublePlayer(PlayerType.FirstPlayer).SetArrowFollowing(true); } else { GameController.ins.GetBowCameraDoublePlayer(PlayerType.SecondPlayer).SetArrowFollowing(true); } if (SceneManager.GetActiveScene().name == "GameDouble" || SceneManager.GetActiveScene().name == "InfraredGameDouble") { arrowCameraTemplate = new ArrowCameraTemplateNew1(this); //if ((isArrowSync && arrowSync.canUseSideCamera) || (!isArrowSync && arrow.canUseSideCamera)) //{ // Debug.Log("ArrowCameraTemplateNew2"); // arrowCameraTemplate = new ArrowCameraTemplateNew2(this); //} //else //{ //} } } void OnDestroy() { try { //Debug.Log("playerIndex==============:"+ playerIndex); if (playerIndex == 0) { GameController.ins.GetBowCameraDoublePlayer(PlayerType.FirstPlayer).SetArrowFollowing(false); } else { GameController.ins.GetBowCameraDoublePlayer(PlayerType.SecondPlayer).SetArrowFollowing(false); } } catch (System.Exception) { } } void FixedUpdate() { arrowCameraTemplate.Update(); } } /* 模板3:跟着箭飞_打猎场景 */ class ArrowCameraTemplateNew3 : ArrowCameraTemplateNew { public ArrowCameraTemplateNew3(ArrowCameraNew arrowCamera) : base(arrowCamera) { if (!arrowCamera.isArrowSync) { this.arrowCamera.arrow.activeEffectCyclone(true); } else { this.arrowCamera.arrowSync.activeEffectCyclone(true); } Camera camera = arrowCamera.transform.GetComponent(); if (camera) camera.fieldOfView = 25; } 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); //若有树的遮挡,则使用以下视角坐标 Vector3 cameraFinalPosition_whenBlockByTree = new Vector3(0.15f, 0.3f, -1.2f); bool hasBlockByTree = false; Vector3 blockByTreeLookAtPoint; public override void Update() { if (cameraMoveFinish) { return; } Transform cameraT = this.arrowCamera.transform; Vector3 cameraPosition = cameraT.localPosition; if ((!this.arrowCamera.isArrowSync && this.arrowCamera.arrow.isHit) || (this.arrowCamera.isArrowSync && this.arrowCamera.arrowSync.isHit)) { cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 6); cameraT.localPosition = cameraPosition; if (hasBlockByTree) { cameraT.LookAt(blockByTreeLookAtPoint); } float d = Vector3.Distance(cameraPosition, cameraFinalPosition); if (d < 0.001f) { cameraMoveFinish = true; Sequence seq = DOTween.Sequence(); if (!quicklyNextShoot) seq.AppendInterval(1f); seq.AppendCallback(delegate () { if (!this.arrowCamera.isArrowSync) { this.arrowCamera.arrow.nextShoot(); } GameObject.Destroy(container ? container : this.arrowCamera.gameObject); }); } } else { cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6); cameraT.localPosition = cameraPosition; if (this.arrowCamera.isArrowSync) { cameraT.LookAt(this.arrowCamera.arrowSync.Head()); } else { cameraT.LookAt(this.arrowCamera.arrow.Head()); } } } 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); //检测有没有树遮挡 Quaternion rot = container.transform.rotation; Quaternion back = rot * Quaternion.AngleAxis(180, Vector3.up); //绕本地坐标轴旋转 for (int i = -36; i <= 36; i += 3) { float angle = i; Quaternion axis = back * Quaternion.AngleAxis(angle, Vector3.up); Vector3 direction = axis * Vector3.forward; RaycastHit[] raycastHits = Physics.RaycastAll(container.transform.position, direction, 6f); foreach (var raycastHit in raycastHits) { Transform tf = raycastHit.transform; if (tf && tf.name.StartsWith("TreeCollider")) { cameraFinalPosition = cameraFinalPosition_whenBlockByTree; hasBlockByTree = true; ArrowNew2 arrow = this.arrowCamera.arrow; blockByTreeLookAtPoint = arrow.Head().position - arrow.transform.forward * 0.5f; break; } } } } //记录需要同步的消息 if (!this.arrowCamera.isArrowSync) { if (this.arrowCamera.arrow.outputSyncData != null) { this.arrowCamera.arrow.outputSyncData.SetArrowCameraTemplate3(this.hasBlockByTree, this.quicklyNextShoot); } } } public void beforHitWhenSync(bool hasBlockByTree) { this.hasBlockByTree = hasBlockByTree; container = new GameObject("CameraContainer"); container.transform.position = this.arrowCamera.arrowSync.transform.position; container.transform.rotation = Quaternion.LookRotation(this.arrowCamera.arrowSync.transform.forward, Vector3.up); this.arrowCamera.transform.SetParent(container.transform); this.arrowCamera.transform.localRotation = Quaternion.identity; if (hasBlockByTree) { cameraFinalPosition = cameraFinalPosition_whenBlockByTree; ArrowSync arrowSync = this.arrowCamera.arrowSync; blockByTreeLookAtPoint = arrowSync.Head().position - arrowSync.transform.forward * 0.5f; } } public bool quicklyNextShoot = ChallengeGameMode.IsChallengeWolf(); public override void SendMsg(int id, object msg) { if (id == 0) { quicklyNextShoot = true; } //记录需要同步的消息 if (!this.arrowCamera.isArrowSync) { if (this.arrowCamera.arrow.outputSyncData != null) { this.arrowCamera.arrow.outputSyncData.SetArrowCameraTemplate3(this.hasBlockByTree, this.quicklyNextShoot); } } } } /* 模板2:从侧面看箭飞 */ class ArrowCameraTemplateNew2 : ArrowCameraTemplateNew { public ArrowCameraTemplateNew2(ArrowCameraNew 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 (arrowCamera.isArrowSync) { if (!isHit) { isHit = arrowCamera.arrowSync.isHit; if (isHit) { this.arrowCamera.transform.SetParent(this.arrowCamera.arrowSync.transform); arrowCamera.transform.localPosition = new Vector3(-0.3f, 0.2f, -1.3f); arrowCamera.transform.LookAt(this.arrowCamera.arrowSync.Head()); Sequence seq = DOTween.Sequence(); seq.PrependInterval(2.2f); seq.AppendCallback(delegate () { GameObject.Destroy(this.arrowCamera.gameObject); }); return; } } if (!arrowCamera.arrowSync) { GameObject.Destroy(this.arrowCamera.gameObject); } } else { if (!isHit) { isHit = arrowCamera.arrow.isHit; if (isHit) { this.arrowCamera.transform.SetParent(this.arrowCamera.arrow.transform); arrowCamera.transform.localPosition = new Vector3(-0.3f, 0.2f, -1.3f); arrowCamera.transform.LookAt(this.arrowCamera.arrow.Head()); Sequence seq = DOTween.Sequence(); seq.PrependInterval(2.2f); seq.AppendCallback(delegate () { this.arrowCamera.arrow.nextShoot(); GameObject.Destroy(this.arrowCamera.gameObject); }); return; } } if (!arrowCamera.arrow) { GameObject.Destroy(this.arrowCamera.gameObject); } } } } /* 模板1:跟着箭飞 */ class ArrowCameraTemplateNew1 : ArrowCameraTemplateNew { public ArrowCameraTemplateNew1(ArrowCameraNew arrowCamera) : base(arrowCamera) { if (!arrowCamera.isArrowSync) { this.arrowCamera.arrow.activeEffectCyclone(true); } else { this.arrowCamera.arrowSync.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.isArrowSync && this.arrowCamera.arrow.isHit) || (this.arrowCamera.isArrowSync && this.arrowCamera.arrowSync.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 () { if (!arrowCamera.isArrowSync) { this.arrowCamera.arrow.nextShoot(); } GameObject.Destroy(this.arrowCamera.gameObject); }); } } else { cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6); } if (this.arrowCamera.isArrowSync) { cameraT.LookAt(this.arrowCamera.arrowSync.Head()); } else { cameraT.LookAt(this.arrowCamera.arrow.Head()); } cameraT.localPosition = cameraPosition; } } public class ArrowCameraTemplateNew { public ArrowCameraNew arrowCamera; public ArrowCameraTemplateNew(ArrowCameraNew arrowCamera) { this.arrowCamera = arrowCamera; } public virtual void Update() { } public virtual void beforeHit() { } public virtual void SendMsg(int id, object msg) { } }