using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class ArrowSync : MonoBehaviour { void Awake() { this.transform.Find("Head/_hunse_jian").gameObject.layer = 0; } void Update() { transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * 15); Head().position = transform.position; transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * 15); } public Transform Head() { return transform.Find("Head"); } #region ---------箭矢特效--------- public void activeEffectCyclone(bool value) { this.transform.Find("Head/EF_kuosanquan").gameObject.SetActive(value); if (!value) return; ParticleSystemRenderer ps = this.transform.Find("Head/EF_kuosanquan/kuosan").GetComponent(); ParticleSystemRenderer ps1 = this.transform.Find("Head/EF_kuosanquan/kuosan (1)").GetComponent(); DOTween.To(() => ps.minParticleSize, value => { ps.minParticleSize = value; ps.maxParticleSize = value; }, 0.4f, 0.6f); DOTween.To(() => ps1.minParticleSize, value => { ps1.minParticleSize = value; ps1.maxParticleSize = value; }, 0.8f, 0.6f); } void activeEffectBomb(bool value) { this.transform.Find("Head/EF_baodian").gameObject.SetActive(value); } void activeEffectTrail(bool value) { this.transform.Find("EF_tuowei").gameObject.SetActive(value); this.transform.Find("EF_tuowei/Trail").GetComponent().time = 1.6f / mySpeed; } #endregion Quaternion rotation; Vector3 position; float mySpeed; bool hasPlayHitAudio = false; bool hasPlayHitEffect = false; [System.NonSerialized] public bool isHit; [System.NonSerialized] public bool canUseSideCamera; [System.NonSerialized] public bool hasSetSyncData = false; //外部运算用的 public void SetSyncData(SyncData syncData, bool apply = false) { rotation.x = syncData.rx; rotation.y = syncData.ry; rotation.z = syncData.rz; rotation.w = syncData.rw; position.x = syncData.px; position.y = syncData.py; position.z = syncData.pz; canUseSideCamera = syncData.cs; isHit = syncData.ih; mySpeed = syncData.sp; if (apply) { transform.position = position; transform.rotation = rotation; if (!isHit) { //激活镜头 Transform cameraTF = this.transform.Find("Camera"); cameraTF.gameObject.SetActive(true); ArrowCamera arrowCameraComp = cameraTF.gameObject.AddComponent(); arrowCameraComp.SetArrowSync(this); //射出的声音 AudioMgr.ins.PlayShoot(AudioMgr.GetAudioSource(this.gameObject)); //拖尾 activeEffectTrail(true); } else if (isHit) { hasPlayHitAudio = true; hasPlayHitEffect = true; activeEffectCyclone(false); activeEffectTrail(false); } } if (isHit && !hasPlayHitAudio) { hasPlayHitAudio = true; int hitType = syncData.ht; if (hitType == 1 || hitType == 2) { AudioMgr.ins.PlayHit(AudioMgr.GetAudioSource(TargetBody.ins.gameObject)); AudioMgr.ins.PlayCheer(hitType == 1 ? true : false); } else if (hitType == 4 || hitType == 5) { AudioMgr.ins.PlayArrowEnter(); } else if (hitType == 3) { AudioMgr.ins.PlayCheer(false); } } if (isHit && !hasPlayHitEffect) { hasPlayHitEffect = true; activeEffectBomb(true); activeEffectCyclone(false); activeEffectTrail(false); } } public class SyncData { [System.NonSerialized] public bool inited; static int autoID; public int id; public float rx; public float ry; public float rz; public float rw; public float px; public float py; public float pz; public bool cs; public bool ih; public int ht; public float sp; public void SetData(Arrow arrow) { Quaternion r = arrow.transform.rotation; Vector3 p = arrow.Head().transform.position; rx = r.x; ry = r.y; rz = r.z; rw = r.w; px = p.x; py = p.y; pz = p.z; cs = arrow.canUseSideCamera; ih = arrow.isHit; ht = arrow.hitType; sp = arrow.mySpeed; if (!inited) { id = autoID++; if (autoID > 1000) autoID = 0; } inited = true; } } }