Unity开发:求直线上指定距离红点的坐标(反射投掷功能)

求解直线上红点的坐标
已知图中标注的所有参数,且红点与参考点的距离为0.2,需要获取该红点坐标并传入Debug.DrawLine(需Vector3参数),用于实现带反射效果的投掷功能。
现有代码:
using UnityEngine; public class raycast : MonoBehaviour { void Update() { RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up); if (hit.collider != null) { float angle = 360 - Mathf.Abs(transform.eulerAngles.z); Debug.DrawLine(transform.position, hit.point); float totalRot = 270 - (90 + angle); print(hit.point); } } }
解决方案
要计算目标红点坐标,核心是利用方向向量的单位化与距离缩放,步骤如下:
- 确定参考点(当前物体位置
transform.position)和直线方向(transform.up,对应物体的上方向) - 将方向向量单位化(确保长度为1),乘以设定的距离0.2,得到从参考点到红点的偏移量
- 参考点坐标加上偏移量,即为红点的最终坐标
修改后的代码如下:
using UnityEngine; public class raycast : MonoBehaviour { // 红点与参考点的距离,可在Inspector面板中调整 public float redPointDistance = 0.2f; void Update() { RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up); if (hit.collider != null) { // 计算红点坐标 Vector3 redPointPos = transform.position + transform.up.normalized * redPointDistance; // 绘制参考点到红点的直线(用红色区分) Debug.DrawLine(transform.position, redPointPos, Color.red); // 保留原有碰撞射线的绘制 Debug.DrawLine(transform.position, hit.point); print("红点坐标:" + redPointPos); print("碰撞点坐标:" + hit.point); } } }
特殊情况处理
如果直线方向不是transform.up,而是基于图中标注角度计算的方向,可以通过旋转向量生成目标方向:
// 假设已知角度angle(单位:度),生成对应方向向量 Vector3 targetDirection = Quaternion.Euler(0, 0, angle) * Vector3.up; Vector3 redPointPos = transform.position + targetDirection.normalized * redPointDistance;
由于是2D场景,Vector3的z轴会自动继承参考点的数值(默认0),完全适配Debug.DrawLine的参数要求。
内容的提问来源于stack exchange,提问作者Smile3329
相关产品推荐
相关产品推荐

