如何使用sqrMagnitude在Unity物体周围显示匹配的检测半径
问题修正方案
- 变量引用错误:代码中声明了
objectToFind变量,但实际调用GameObject.FindWithTag时赋值给了未定义的obj1,运行会直接抛出空引用异常 - 距离检测逻辑错误:
sqrMagnitude返回的是两点距离的平方值,原代码直接和radius * 1.75对比逻辑完全错误,要实现「实际距离小于radius」的判断,应该和radius * radius对比 - 半径显示缩放错误:默认的2D圆Sprite、3D平面/球体的原始大小为直径1单位,要对应半径为radius的实际范围,缩放值应该是
2 * radius而非直接用radius赋值 - 性能问题:
GameObject.FindWithTag每帧调用会产生不必要的性能消耗,无动态生成需求的话应该放到Start方法中执行一次即可
修正后代码
public class ObjectFinder : MonoBehaviour { public GameObject player; private GameObject objectToFind; public GameObject objectRadius; // 检测半径,单位为米 public float radius; // 缓存半径平方,避免每帧重复计算 private float _radiusSqr; void Start() { // 只在初始化时查找一次目标物体 objectToFind = GameObject.FindWithTag("ObjectFind"); // 预计算半径平方 _radiusSqr = radius * radius; // 初始化半径显示的大小,不需要每帧更新除非radius运行时动态修改 UpdateRadiusDisplay(); } void Update() { // 如果需要运行时动态修改radius,打开下面两行的注释 // _radiusSqr = radius * radius; // UpdateRadiusDisplay(); float distanceSqr = (objectToFind.transform.position - player.transform.position).sqrMagnitude; if (distanceSqr < _radiusSqr) { Debug.Log("Object Found"); } else { Debug.Log("Object out of range"); } } // 更新半径显示的大小 void UpdateRadiusDisplay() { // 原始可视化对象默认直径为1单位,缩放为2*radius对应直径2*radius,半径匹配设置值 objectRadius.transform.localScale = new Vector3(radius * 2, radius * 2, 1f); } }
如果需要保留原有代码中的1.75倍检测范围放大系数,只需修改半径平方计算逻辑为
_radiusSqr = (radius * 1.75f) * (radius * 1.75f);,显示的半径大小也可以同步调整为radius * 1.75f * 2来匹配实际检测范围
注意事项
- 如果你的可视化半径对象原始大小不是直径1单位,根据实际原始尺寸调整缩放系数即可
- 如果目标物体是动态生成/销毁的,可以在生成时主动赋值给
objectToFind变量,避免频繁调用查找方法 - 2D项目可以把距离计算换成
Vector2的sqrMagnitude,减少不必要的z轴计算
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

