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
}
}