Arrow.cs 4.6 KB

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