| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- using System.Collections;
- using UnityEngine;
- namespace WildAttack
- {
- /// <summary>
- /// 箭
- /// </summary>
- public class Arrow : MonoBehaviour
- {
- #region Members
- /// <summary>
- /// 重力参数
- /// </summary>
- float gravity;
- /// <summary>
- /// 箭射出去时的向量
- /// </summary>
- private Vector3 moveSpeed;
- private Vector3 gritySpeed;
- /// <summary>
- /// 飞行时间
- /// </summary>
- 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;
- /// <summary>
- /// 箭的触发检测
- /// </summary>
- /// <param name="other"></param>
- private void OnTriggerEnter(Collider other)
- {
- StopAllCoroutines();
- if (other.gameObject.layer == LayerMask.NameToLayer("Plane"))
- {
- isStop = true;
- SetTrailActive(false);
- transform.GetComponent<CapsuleCollider>().enabled = false;
- ProcessManager.GetInstance().AddStayArrow(gameObject);
- transform.GetChild(0).GetComponent<MeshRenderer>().materials[0].SetColor("_Color", new Color(175f / 255f, 175f / 255f, 175f / 255f, 1f));
- transform.GetChild(0).GetComponent<MeshRenderer>().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<Enemy>().Hitted(1, other.GetType() == typeof(SphereCollider));
- }
- else if (other.gameObject.layer == LayerMask.NameToLayer("StageProperty") || other.gameObject.layer == LayerMask.NameToLayer("Barrel"))
- {
- // 道具触发
- other.GetComponent<StageProperty>().PropTrigger();
- }
- }
- #endregion
- #region Functions
- /// <summary>
- /// 初始化 射箭的时候调用
- /// </summary>
- /// <param name="rot"></param>
- /// <param name="speed"></param>
- public void Init(Vector3 rot, float speed)
- {
- //this.speed = speed;
- transform.eulerAngles = rot;
- audioSource = GetComponent<AudioSource>();
- StartCoroutine(DestroySelf());
- audioSource.clip = Resources.Load<AudioClip>("Voice/Arrow/Shoot");
- 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);
- }
- /// <summary>
- /// 3秒自然销毁
- /// </summary>
- /// <returns></returns>
- IEnumerator DestroySelf()
- {
- yield return new WaitForSeconds(3f);
- Destroy(gameObject);
- }
- #endregion
- }
- }
|