|
|
@@ -61,26 +61,37 @@ public class Arrow : MonoBehaviour
|
|
|
{
|
|
|
CalculateParabolaAngle(absoluteRay.point);
|
|
|
|
|
|
- float maxAngleX = 5;
|
|
|
if (!hasParabolaAngle) return;
|
|
|
+
|
|
|
+ float baseAngleX = this.transform.eulerAngles.x;
|
|
|
+ if (baseAngleX > 180) baseAngleX = baseAngleX - 360;
|
|
|
+ baseAngleX *= -1;
|
|
|
+
|
|
|
float absoluteAngleX = parabolaAngleInRadian / Mathf.PI * 180;
|
|
|
- if (absoluteAngleX > maxAngleX) {
|
|
|
- absoluteAngleX = maxAngleX;
|
|
|
+
|
|
|
+ float deltaAngleX = absoluteAngleX - baseAngleX;
|
|
|
+ float maxDeltaAngleX = 5;
|
|
|
+
|
|
|
+ float finalAngleX = this.offsetAngle;
|
|
|
+ if (Mathf.Abs(deltaAngleX) > maxDeltaAngleX) {
|
|
|
+ finalAngleX += baseAngleX;
|
|
|
+ finalAngleX += deltaAngleX > 0 ? maxDeltaAngleX : -maxDeltaAngleX;
|
|
|
+ } else {
|
|
|
+ finalAngleX += absoluteAngleX;
|
|
|
}
|
|
|
- float finalAngleX = absoluteAngleX + this.offsetAngle;
|
|
|
+
|
|
|
float vy = Mathf.Sin(finalAngleX / 180 * Mathf.PI) * this.mySpeed;
|
|
|
float vx = Mathf.Cos(finalAngleX / 180 * Mathf.PI) * this.mySpeed;
|
|
|
float deltaX = Mathf.Sqrt(
|
|
|
Mathf.Pow(absoluteRay.point.x - this.shootOutPosition.x, 2) +
|
|
|
Mathf.Pow(absoluteRay.point.z - this.shootOutPosition.z, 2)
|
|
|
);
|
|
|
- float deltaY = absoluteRay.point.y - this.shootOutPosition.y;
|
|
|
float tx = deltaX / vx;
|
|
|
- float finalDeltaY = vy * tx + 0.5f * Physics.gravity.y * tx * tx;
|
|
|
- float dy = finalDeltaY - deltaY;
|
|
|
- if (Mathf.Abs(dy) < 0.62f) { //再靶子范围内,则用update运算物理
|
|
|
+ float dy = vy * tx + 0.5f * Physics.gravity.y * tx * tx;
|
|
|
+
|
|
|
+ if (Mathf.Abs(dy) < 0.62f) { //在靶子范围内,则用update运算物理
|
|
|
finalPoint = absoluteRay.point;
|
|
|
- finalPoint.y += dy;
|
|
|
+ finalPoint.y = absoluteRay.transform.parent.position.y + dy;
|
|
|
useUpdatePhysics = true;
|
|
|
parabolaAngleInRadian = finalAngleX / 180 * Mathf.PI;
|
|
|
RandomUseSideCamera();
|