using UnityEngine;public class ArrowProjectile : MonoBehaviour
{public Transform startPoint; // 弓箭的起点public Transform endPoint; // 弓箭的终点public float gravity = -9.81f; // 重力加速度(通常在地球上约为-9.81)private float totalFlightTime; // 总飞行时间public float fx;private Vector3 startPosition;private Vector3 endPosition;public float horizontalVelocity = 10f; // 水平方向的初速度private float verticalInitialVelocity; // 垂直方向的初速度float t;// Start is called before the first frame updatevoid Start(){t = Time.time;// 确保起点和终点已设置if (startPoint == null){Debug.LogError("ArrowProjectile requires a startPoint Transform.");enabled = false;return;}if (endPoint == null){Debug.LogError("ArrowProjectile requires an endPoint Transform.");enabled = false;return;}startPosition = startPoint.position;endPosition = endPoint.position;// 计算水平方向位移float horizontalDisplacement = Vector3.Distance(startPoint.position, endPoint.position) * Vector3.Normalize(endPoint.position - startPoint.position).magnitude;// 计算总飞行时间(假设水平方向是匀速运动)//horizontalVelocity = 10.0f; // 设置一个默认的水平初速度值totalFlightTime = horizontalDisplacement / horizontalVelocity;fx = 1 / totalFlightTime;// 计算竖直方向的初速度(使箭矢能够刚好到达终点)float verticalDisplacement = endPosition.y - startPosition.y;// 根据抛物线方程:y = v0y * t + 0.5 * g * t²// 解方程:v0y = (y - 0.5 * g * t²) / tverticalInitialVelocity = (verticalDisplacement - 0.5f * gravity * totalFlightTime * totalFlightTime) * fx;// 将箭的初始位置设置为起点transform.position = startPosition;// 可选:设置箭的初始方向transform.rotation = Quaternion.LookRotation(endPoint.position - startPoint.position);}// Update is called once per framevoid Update(){// 计算当前飞行时间float currentTime = Time.time - t;if (currentTime <= totalFlightTime){// 计算当前位置float timeRatio = currentTime * fx;float horizontalPosition = startPosition.x + horizontalVelocity * currentTime;float verticalPosition = startPosition.y + verticalInitialVelocity * currentTime + 0.5f * gravity * currentTime * currentTime;float depthPosition = startPosition.z + (endPosition.z - startPosition.z) * timeRatio;transform.position = new Vector3(horizontalPosition, verticalPosition, depthPosition);// 可选:使箭始终面向移动方向Vector3 moveDirection = new Vector3(1.0f, verticalInitialVelocity + gravity * currentTime, (endPosition.z - startPosition.z) * fx);transform.rotation = Quaternion.LookRotation(moveDirection);}else{// 到达终点时销毁箭Destroy(gameObject);}}
}
