Arrow.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System.Collections;
  2. using UnityEngine;
  3. namespace WildAttack
  4. {
  5. /// <summary>
  6. /// 箭
  7. /// </summary>
  8. public class Arrow : MonoBehaviour
  9. {
  10. #region Members
  11. /// <summary>
  12. /// 重力参数
  13. /// </summary>
  14. float gravity;
  15. /// <summary>
  16. /// 箭射出去时的向量
  17. /// </summary>
  18. private Vector3 moveSpeed;
  19. private Vector3 gritySpeed;
  20. /// <summary>
  21. /// 飞行时间
  22. /// </summary>
  23. private float dTime;
  24. private Vector3 currentAngle;
  25. private AudioSource audioSource;
  26. #endregion
  27. #region Lifecycle
  28. private void FixedUpdate()
  29. {
  30. if (isStop) return;
  31. //计算物体的重力速度
  32. //v = at ;
  33. gritySpeed.y = gravity * (dTime += Time.fixedDeltaTime);
  34. //位移模拟轨迹
  35. transform.position += (moveSpeed + gritySpeed) * Time.fixedDeltaTime;
  36. currentAngle.x = Mathf.Abs(Mathf.Atan(gritySpeed.y / moveSpeed.z) * Mathf.Rad2Deg);
  37. if (transform.localEulerAngles.y > 260 && transform.localEulerAngles.y < 290)
  38. {
  39. currentAngle.x /= 3;
  40. }
  41. transform.eulerAngles = new Vector3(transform.localEulerAngles.x + currentAngle.x * Time.fixedDeltaTime, transform.localEulerAngles.y, transform.eulerAngles.z);
  42. }
  43. private bool isStop = false;
  44. /// <summary>
  45. /// 箭的触发检测
  46. /// </summary>
  47. /// <param name="other"></param>
  48. private void OnTriggerEnter(Collider other)
  49. {
  50. StopAllCoroutines();
  51. if (other.gameObject.layer == LayerMask.NameToLayer("Plane"))
  52. {
  53. isStop = true;
  54. SetTrailActive(false);
  55. transform.GetComponent<CapsuleCollider>().enabled = false;
  56. ProcessManager.GetInstance().AddStayArrow(gameObject);
  57. transform.GetChild(0).GetComponent<MeshRenderer>().materials[0].SetColor("_Color", new Color(175f / 255f, 175f / 255f, 175f / 255f, 1f));
  58. transform.GetChild(0).GetComponent<MeshRenderer>().materials[1].SetColor("_Color", new Color(175f / 255f, 175f / 255f, 175f / 255f, 1f));
  59. transform.localScale = new Vector3(5, 5, 3);
  60. transform.Rotate(new Vector3(10, 0, 0));
  61. }
  62. else
  63. {
  64. Destroy(gameObject);
  65. }
  66. // 根据层级判断目标类型
  67. if (other.gameObject.layer == LayerMask.NameToLayer("Enemy"))
  68. {
  69. // 击中部位判定
  70. other.GetComponentInParent<Enemy>().Hitted(1, other.GetType() == typeof(SphereCollider));
  71. }
  72. else if (other.gameObject.layer == LayerMask.NameToLayer("StageProperty") || other.gameObject.layer == LayerMask.NameToLayer("Barrel"))
  73. {
  74. // 道具触发
  75. other.GetComponent<StageProperty>().PropTrigger();
  76. }
  77. }
  78. #endregion
  79. #region Functions
  80. /// <summary>
  81. /// 初始化 射箭的时候调用
  82. /// </summary>
  83. /// <param name="rot"></param>
  84. /// <param name="speed"></param>
  85. public void Init(Vector3 rot, float speed)
  86. {
  87. //this.speed = speed;
  88. transform.eulerAngles = rot;
  89. audioSource = GetComponent<AudioSource>();
  90. StartCoroutine(DestroySelf());
  91. audioSource.clip = Resources.Load<AudioClip>("Voice/Arrow/Shoot");
  92. if (UserSettings.ins.openEffect) audioSource.Play();
  93. moveSpeed = Quaternion.Euler(new Vector3(transform.rotation.x, transform.rotation.y, 0)) * transform.forward * speed;
  94. currentAngle = transform.eulerAngles;
  95. gravity = -GameModule.GetInstance().GetData("g");
  96. SetTrailActive(true);
  97. }
  98. private void SetTrailActive(bool active)
  99. {
  100. transform.Find("Trail1").gameObject.SetActive(active);
  101. transform.Find("Trail2").gameObject.SetActive(active);
  102. }
  103. /// <summary>
  104. /// 3秒自然销毁
  105. /// </summary>
  106. /// <returns></returns>
  107. IEnumerator DestroySelf()
  108. {
  109. yield return new WaitForSeconds(3f);
  110. Destroy(gameObject);
  111. }
  112. #endregion
  113. }
  114. }