|
|
@@ -0,0 +1,56 @@
|
|
|
+using System.Collections;
|
|
|
+using System.Collections.Generic;
|
|
|
+using UnityEngine;
|
|
|
+using UnityEngine.UI;
|
|
|
+
|
|
|
+/**瞄准器负载检测 */
|
|
|
+public class AimLoadChecker : MonoBehaviour
|
|
|
+{
|
|
|
+ [SerializeField] GameObject outTip;
|
|
|
+
|
|
|
+ void Start()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Update is called once per frame
|
|
|
+ void Update()
|
|
|
+ {
|
|
|
+ bool needActiveOutTip = false;
|
|
|
+ if (ArmBow.ins && ArmBow.ins.IsCanShoot() && TargetBody.ins) {
|
|
|
+ RaycastHit ray = CrossHair.ins.GetRaycastHit();
|
|
|
+ if (ray.transform && ray.transform.gameObject.name == "TargetBody") {
|
|
|
+ float mySpeed = Arrow.speed;
|
|
|
+ if (GameAssistUI.ins) {
|
|
|
+ mySpeed *= (1 + GameAssistUI.ins.shootScaleValue);
|
|
|
+ }
|
|
|
+ Vector3 destination = ray.point;
|
|
|
+ Vector3 startPoint = BowCamera.ins.transform.position;
|
|
|
+ float deltaX = Mathf.Sqrt(
|
|
|
+ Mathf.Pow(destination.x - startPoint.x, 2) +
|
|
|
+ Mathf.Pow(destination.z - startPoint.z,2)
|
|
|
+ );
|
|
|
+ float deltaY = destination.y - startPoint.y;
|
|
|
+ float a = 0.5f * Physics.gravity.y * Mathf.Pow(deltaX, 2) / Mathf.Pow(mySpeed, 2);
|
|
|
+ float b = deltaX;
|
|
|
+ float c = a - deltaY;
|
|
|
+ bool hasParabolaAngle = Mathf.Pow(b, 2) - 4 * a * c >= 0;
|
|
|
+ if (hasParabolaAngle) {
|
|
|
+ float res1 = (-b + Mathf.Pow(Mathf.Pow(b, 2) - 4*a*c, 0.5f)) / (2 * a);
|
|
|
+ float res2 = (-b - Mathf.Pow(Mathf.Pow(b, 2) - 4*a*c, 0.5f)) / (2 * a);
|
|
|
+ float parabolaAngle = Mathf.Min(Mathf.Atan(res1), Mathf.Atan(res2)) / Mathf.PI * 180;
|
|
|
+
|
|
|
+ needActiveOutTip = parabolaAngle > 5;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ActiveOutTip(needActiveOutTip);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void ActiveOutTip(bool value)
|
|
|
+ {
|
|
|
+ if (outTip.activeSelf != value) {
|
|
|
+ outTip.SetActive(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|