using System.Collections; using UnityEngine; namespace WildAttack { /// /// 箭 /// public class Arrow : MonoBehaviour { #region Members /// /// 重力参数 /// float gravity; /// /// 箭射出去时的向量 /// private Vector3 moveSpeed; private Vector3 gritySpeed; /// /// 飞行时间 /// private float dTime; private Vector3 currentAngle; private AudioSource audioSource; #endregion #region Lifecycle private void FixedUpdate() { if (isStop) return; //计算物体的重力速度 //v = at ; gritySpeed.y = gravity * (dTime += Time.fixedDeltaTime); //位移模拟轨迹 transform.position += (moveSpeed + gritySpeed) * Time.fixedDeltaTime; currentAngle.x = Mathf.Abs(Mathf.Atan(gritySpeed.y / moveSpeed.z) * Mathf.Rad2Deg); if (transform.localEulerAngles.y > 260 && transform.localEulerAngles.y < 290) { currentAngle.x /= 3; } transform.eulerAngles = new Vector3(transform.localEulerAngles.x + currentAngle.x * Time.fixedDeltaTime, transform.localEulerAngles.y, transform.eulerAngles.z); } private bool isStop = false; /// /// 箭的触发检测 /// /// private void OnTriggerEnter(Collider other) { StopAllCoroutines(); if (other.gameObject.layer == LayerMask.NameToLayer("Plane")) { isStop = true; SetTrailActive(false); transform.GetComponent().enabled = false; ProcessManager.GetInstance().AddStayArrow(gameObject); transform.GetChild(0).GetComponent().materials[0].SetColor("_Color", new Color(175f / 255f, 175f / 255f, 175f / 255f, 1f)); transform.GetChild(0).GetComponent().materials[1].SetColor("_Color", new Color(175f / 255f, 175f / 255f, 175f / 255f, 1f)); transform.localScale = new Vector3(5, 5, 3); transform.Rotate(new Vector3(10, 0, 0)); } else { Destroy(gameObject); } // 根据层级判断目标类型 if (other.gameObject.layer == LayerMask.NameToLayer("Enemy")) { // 击中部位判定 other.GetComponentInParent().Hitted(1, other.GetType() == typeof(SphereCollider)); } else if (other.gameObject.layer == LayerMask.NameToLayer("StageProperty") || other.gameObject.layer == LayerMask.NameToLayer("Barrel")) { // 道具触发 other.GetComponent().PropTrigger(); } } #endregion #region Functions /// /// 初始化 射箭的时候调用 /// /// /// public void Init(Vector3 rot, float speed) { //this.speed = speed; transform.eulerAngles = rot; audioSource = GetComponent(); StartCoroutine(DestroySelf()); audioSource.clip = Resources.Load("Voice/Arrow/Shoot"); if (UserSettings.ins.openEffect) audioSource.Play(); moveSpeed = Quaternion.Euler(new Vector3(transform.rotation.x, transform.rotation.y, 0)) * transform.forward * speed; currentAngle = transform.eulerAngles; gravity = -GameModule.GetInstance().GetData("g"); SetTrailActive(true); } private void SetTrailActive(bool active) { transform.Find("Trail1").gameObject.SetActive(active); transform.Find("Trail2").gameObject.SetActive(active); } /// /// 3秒自然销毁 /// /// IEnumerator DestroySelf() { yield return new WaitForSeconds(3f); Destroy(gameObject); } #endregion } }