news 2026/2/17 4:30:09

游戏中的圆:从几何到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
游戏中的圆:从几何到实战

不绕弯子,先把这句话说清楚:

圆是啥?
从几何上看:所有到同一个点距离相等的一堆点
从解析几何上看:这些点,刚好都满足一个方程
在 Unity 里:圆 = 以某个位置为中心、一定半径的范围(2D/3D 里就是圈 / 球体)。
在 FPS 射击游戏里:

  • 手雷爆炸范围
  • 范围治疗 / 范围伤害
  • 范围探测、雷达扫描
  • 击退圈、毒圈、缩圈
    背后全是“圆(或球)”在干活。

下面我会用大白话,一步一步把这件事讲清楚:

  1. 圆在几何上的直观定义
  2. 用方程来描述圆:解析几何视角
  3. 圆的常见计算:点在不在圆里、圆和线怎么交
  4. Unity 里如何“画一个圆 / 圈一个范围”
  5. 在 FPS 游戏里的圆:爆炸范围、AOE、感知范围等具体用法
  6. 一点拓展:从圆到球,从 2D 到 3D
  7. 把这些东西串一起的小结

一、圆究竟是个啥?先站在“肉眼几何”的视角看

1.1 小学教过的那句:到定点距离相等的点的集合

小学老师一般会这么说:

圆:平面上到某个固定点距离等于一个定值的点的集合。

翻译成大白话:

  • 先在纸上点一个点 O,当圆心;
  • 再拿个圆规,脚尖扎在 O 上,把圆规张开 r cm;
  • 然后绕一圈画过去;
  • 圆规尖尖走过的所有点,就是这个圆。

这里几个关键词:

  • “固定点” → 圆心;
  • “距离等于一个定值 r” → 半径;
  • “所有满足这个条件的点” → 这堆点连起来形成的就是圆。

注意:圆本质上不是一个“粗线条”,而是无数个点组成的边界。

1.2 圆和圆盘:边和里面别搞混

很多人说“圆形”,其实混用了两个概念:

  • 圆(circle):

    • 严格意义上是“边界那条线”——圆周:
    • 到圆心距离等于r 的点。
  • 圆盘 / 圆域(disk):

    • 圆内部 + 圆上的点:
    • 到圆心距离小于等于r 的点。

在游戏里说“爆炸范围”一般指的是“圆盘”(范围区域),
而不是只在圆周上炸一圈。

先把这个概念放在心里,后面讲方程和范围判断会用到。


二、解析几何:用方程描述“到某点距离相等的一堆点”

现在给圆戴上“坐标”和“方程”的帽子。

2.1 平面直角坐标系里的“圆”

建立一个坐标系:

  • 水平轴:x 轴;
  • 竖直轴:y 轴;
  • 原点 O(0,0)。

假设有一个圆:

  • 圆心 C 在 (a, b);
  • 半径 r。

按照定义:

点 P(x, y) 在这个圆上
⇔ P 到 C 的距离 = r。

用“平面两点距离公式”来写:

距离 PC = √[(x - a)² + (y - b)²]

条件 PC = r,就是:

√[(x - a)² + (y - b)²] = r

两边平方(r>0,不用担心平方损伤):

(x - a)² + (y - b)² = r²

这就是一个圆的标准方程

  • 所有满足这个方程的点 (x, y) 都在圆周上;
  • 不满足的点,要么在圆内,要么在圆外。

特别地,如果圆心刚好在原点 (0,0),方程更简单:

x² + y² = r²

2.2 圆的三种“关系”判断:在圆上 / 圆内 / 圆外

给你一个圆:

(x - a)² + (y - b)² = r²

给你一个点 P(x₀, y₀),想知道它在哪:

  1. 计算左边的数:

    S = (x₀ - a)² + (y₀ - b)²
  2. 和 r² 比较:

    • 如果 S = r² → 点在圆上;
    • 如果 S < r² → 点在圆内;
    • 如果 S > r² → 点在圆外。

这段逻辑在游戏里就是“判断一个单位是不是在某个范围之内”的基础。

2.3 圆的一般方程:x² + y² + Dx + Ey + F = 0

你有时候会看到圆写成这样:

x² + y² + Dx + Ey + F = 0

这是“展开后的版本”。

标准方程:

(x - a)² + (y - b)² = r² x² - 2ax + a² + y² - 2by + b² = r² x² + y² - 2ax - 2by + (a² + b² - r²) = 0

对应:

D = -2a E = -2b F = a² + b² - r²

反过来,我们也可以通过 D、E、F 把圆心和半径解出来:

  • 圆心:(a, b) = (-D/2, -E/2)
  • 半径:r = √(a² + b² - F)

不过在游戏开发里,几乎不需要写这么复杂的一般式,
通常都是“一个中心坐标 + 一个半径”的形式。


三、圆的常用几何运算:线和圆怎么交,圆和圆怎么交

虽然游戏里不一定直接写方程,但很多逻辑本质就是“求交点/判断相交”。

3.1 圆与点:是否在范围内

这已经讲过一遍,换一种游戏化说法:

  • 爆炸中心:C(cx, cy);
  • 某个敌人位置:P(px, py);
  • 爆炸半径:R;

判断是否被炸到:

dx = px - cx dy = py - cy S = dx*dx + dy*dy if (S <= R*R) // 在爆炸范围内 else // 不在范围内

注意:用的是 S 和 R²,而不是先开根号算距离再比较,
因为开根号比较慢,用平方比大小就行。

这在 Unity 里是非常经典的写法。

3.2 圆与直线:有没有交点,交在哪?

在 2D 中,如果你有:

  • 圆:(x - a)² + (y - b)² = r²
  • 直线:y = kx + c

要找交点:

  1. 把直线的 y 代入圆方程;
  2. 得到关于 x 的一元二次方程;
  3. 解出来 x,再求 y。

判别式 Δ 会告诉你:

  • Δ > 0:两个交点(直线穿过圆);
  • Δ = 0:一个交点(切线);
  • Δ < 0:没有交点(直线与圆相离)。

这一套在游戏里可以用来做:

  • “子弹轨迹(线)与范围区(圆)的交点”;
  • 判断“玩家从哪儿进入某个圆形区域”。

不过,实际游戏里更常用的是射线 + 圆碰撞公式封装(用 Physics 系统)。

3.3 圆与圆:相交 / 相切 / 相离 / 内含

两个圆:

  • C1:(x1, y1),半径 r1
  • C2:(x2, y2),半径 r2

计算它们圆心之间的距离 d:

dx = x2 - x1 dy = y2 - y1 d = √(dx² + dy²)

然后对比 d 和 r1+r2 以及 |r1-r2|:

  • 若 d > r1 + r2 → 相离(两个圆离得远,完全不挨着);
  • 若 d = r1 + r2 → 外切(两个圆外部刚好接触一点);
  • 若 |r1 - r2| < d < r1 + r2 → 相交(两个圆重叠,有两个交点);
  • 若 d = |r1 - r2| → 内切(一个在另一个里面,内侧刚好接触);
  • 若 d < |r1 - r2| → 内含(一个完全包在另一个里面,不接触)。

在游戏里,这可以变成:

  • “两个范围伤害圆有没有覆盖重叠”;
  • “毒圈与安全区的关系”。

不过,实战中经常直接用“圆心距离对比半径和”这最简单一条:

相交/重叠:d <= r1 + r2

四、Unity 里怎么表示“圆”和“圆形范围”?

Unity 本质是 3D 引擎,但可以在 2D/3D 里表达“圆”的概念。

4.1 2D 圆形:CircleCollider2D 和 Gizmos

在 2D 模式下:

  • 可以给物体加CircleCollider2D
  • 这就是一个以某点为中心、一定半径的圆形碰撞体。

它可以用于:

  • 检测玩家与敌人是否接触;
  • 判定攻击范围;
  • 触发区域(比如进入某个圈就触发事件)。

如果你只是想在场景视图里画个圆当参考,可以用OnDrawGizmos

voidOnDrawGizmos(){Gizmos.color=Color.green;DrawCircle(transform.position,radius,32);}voidDrawCircle(Vector3center,floatradius,intsegments){floatangleStep=360f/segments;Vector3prev=center+newVector3(radius,0,0);for(inti=1;i<=segments;i++){floatangle=angleStep*i*Mathf.Deg2Rad;Vector3next=center+newVector3(Mathf.Cos(angle)*radius,Mathf.Sin(angle)*radius,0);Gizmos.DrawLine(prev,next);prev=next;}}

这里通过分段连线的方式近似画圆。

4.2 3D 圆形范围:平面上的半径检查 + SphereCollider

在 3D FPS 里,场景是三维的,但很多范围逻辑是在地面上(水平面)做的:

  • 我们可以把“圆”当作“以 (x, z) 为平面坐标的范围”;
  • y 是高度,只要在一定差值内就算同一平面。

例如爆炸范围(横向是圆,实际上空间里是个“圆柱体”或球体)。

两个方案:

方案 A:用球碰撞体(SphereCollider)
  • 给一个不可见物体加SphereCollider,勾选isTrigger
  • 半径 = 爆炸范围;
  • 爆炸时让这个物体激活一下,然后对 OnTriggerEnter 里面的对象施加伤害。

代码概念:

publicclassExplosion:MonoBehaviour{publicfloatradius=5f;publicfloatdamage=100f;voidStart(){Collider[]cols=Physics.OverlapSphere(transform.position,radius);foreach(varcolincols){// 假设有 Health 组件varhp=col.GetComponent<Health>();if(hp!=null){hp.TakeDamage(damage);}}}}

这里的OverlapSphere就是以某点为中心、某个半径的“球体范围检测”。
如果你只在水平面上考虑,那就是个“圆形范围”。

方案 B:手写“圆内检测”(更贴近我们前面讲的公式)

你也可以自己写:

voidDoExplosion(Vector3center,floatradius){Collider[]cols=Physics.OverlapSphere(center,radius);foreach(varcolincols){Vector3targetPos=col.transform.position;// 只在水平面上做圆判断,不管高度Vector2c=newVector2(center.x,center.z);Vector2p=newVector2(targetPos.x,targetPos.z);floatsqrDist=(p-c).sqrMagnitude;if(sqrDist<=radius*radius){// 在圆形范围内}}}

虽然用了 OverlapSphere 找到“可能在范围内”的物体,
但进一步筛选“在水平面上的圆内/圆外”,就是我们前面讲的“圆方程判定”。


五、FPS 射击游戏里,“圆”的各种实际用法

下面我们从玩家视角出发,看看 FPS 游戏里,到底有多少地方在悄悄用“圆”。

5.1 手雷 / 榴弹 / 火箭弹的爆炸范围:伤害圆

场景:
你丢一颗手雷,砰的一声爆炸,
附近的敌人都掉血,离得越近伤害越高。

这背后就是:

爆炸点为圆心,某个半径为边界的圆形(或球形)区域,
所有在这个区域里的敌人都受影响。

典型逻辑:

  1. 爆炸发生时,用 OverlapSphere 找到周围一定半径内的所有碰撞体;
  2. 对每个目标算“距离爆心的距离”;
  3. 根据距离算伤害(可能是线性衰减 / 指数衰减 / 表定档位)。

伪代码:

voidExplode(){Collider[]cols=Physics.OverlapSphere(transform.position,radius);foreach(varcolincols){varhp=col.GetComponent<Health>();if(hp!=null){floatdist=Vector3.Distance(transform.position,col.transform.position);floatdamageFactor=Mathf.Clamp01(1-dist/radius);// 越近越接近 1floatfinalDamage=maxDamage*damageFactor;hp.TakeDamage(finalDamage);}}}

如果只想简化为“在范围内全吃满伤害”:

  • 只需判断dist <= radiussqrDist <= radius²

这就是圆的典型 FPS 用法之一:爆炸伤害圈

5.2 范围技能 / AOE:治疗圈 / 增益圈 / 减速圈

很多 FPS + RPG 混合玩法里有这些东西:

  • 医疗圈:在某个点释放,范围内队友持续回血;
  • 减速圈:敌人走进去移动速度变慢;
  • 增益圈:站在圈里攻击力/防御力提升;
  • 静滞场:子弹进到圈里变慢、甚至停下。

这些都是以某点为中心、一定半径的“圆形区域效果”

实现方式和爆炸差不多,只是多了“持续时间”:

  • 每帧 / 每秒检查在圆内的单位;
  • 对在圆内的单位施加Buff/伤害/减速等;
  • 离开圆就移除效果。

可以用触发器(Trigger)+OnTriggerEnter/OnTriggerExit+ 半径为范围的 Collider,
也可以每帧Physics.OverlapSphere+ 手动判断。

5.3 视野范围 / 感知范围:谁在我的“雷达圈”里?

敌人 AI 常见的设定:

  • 有一个“视野角度”(前方扇形);
  • 有一个“最大视距”(圆形范围)。

这里“最大视距”就是一个以敌人位置为圆心、半径为视距的圆(如果只看平面)。

怎么判断玩家在不在这个“感知圆”里?

  1. 计算敌人与玩家之间的水平距离:

    • dx = player.x - enemy.x
    • dz = player.z - enemy.z
  2. 算平方距离:dx² + dz²

  3. 比较和视距²

    if((dx*dx+dz*dz)<=viewRadius*viewRadius){// 在感知范围内}

再叠加上“视野角”(点乘判断夹角)和“射线检测有无遮挡”,就是完整的视线逻辑。

5.4 雷达、扫描、地图圈:UI 上的“圆形高亮”

在 FPS 游戏里你经常看到:

  • 小地图中,一个圆形范围表示你的雷达扫描范围;
  • 扫描技能开启时,一个圈从角色辐射出去,圈到的敌人被标记;
  • 毒圈 / 安全区 / 电磁圈:一个不断缩小的圆把战场越收越小。

这些更多是视觉表现上的圆
背后逻辑仍然是“范围判断”。

例如:雷达扫描效果:

  1. 启动扫描,半径从 0 缓慢增大到最大值;

  2. 每帧:

    • 根据当前半径 R,找到OverlapSphere(center, R)内的敌人;
    • 把这些敌人标记出来(在 UI 上画个红点)。

视觉上则用:

  • LineRenderer 画一个圆圈;
  • 用 shader 在地面上画一个 expanding circle;
  • 用 UI 画一个放大中的圆形框。

这些圆的绘制,一般都是通过三角形拼出来的,但逻辑上你就当“画圆”就行。

5.5 近战攻击圆 / 判定圈:谁在我身边一圈都挨打

很多 FPS 里的近战攻击,其实不是一个小矩形,而是:

  • 以玩家位置为中心;
  • 在身体前方开一个扇形 / 半圆形;
  • 范围内的敌人全部受到伤害。

简化一点的实现直接用圆:

  • 玩家位置 = 圆心;
  • 半径 = 武器攻击范围(加上一点前方偏移);
  • 检测“在圆内的敌人”,都算命中。

Unity 实现也非常直接:OverlapSphere + 距离判定。


六、从圆到球:FPS 中其实用得更多的是“球形范围”

虽然我们一直在说“圆”,但 FPS 场景是 3D 的,
大部分“范围”其实是个“球体”,只是在设计上更多关注水平投影。

6.1 球的解析几何方程:三维版的圆

球心在 (a, b, c),半径 R 的球:

(x - a)² + (y - b)² + (z - c)² = R²

类比圆的方程,仅仅多了一个维度。

点 P(x₀, y₀, z₀) 在球内/球外判断:

S = (x₀ - a)² + (y₀ - b)² + (z₀ - c)² if (S < R²) 在球内 if (S = R²) 在球面上 if (S > R²) 在球外

Unity 的Physics.OverlapSphere就是在做这个事:
把这个球内的所有碰撞体找出来。

6.2 在 FPS 里如何折中:球体 + 水平面“圆”的双重视角

大多数 FPS 的“范围逻辑”其实是这么用的:

  • 底层检测用“球体”:方便、简单、性能好;
  • 策划设计和玩家理解时,在脑子里更偏“地面上的一个圆圈”。

比如爆炸效果:

  • 逻辑上:OverlapSphere找到球体内所有敌人;
  • 视觉上:在地面画一个圆形爆炸纹理 / 冲击波;
  • 玩家感知:站在圈里就会被炸。

所以,你可以记一句:

数学上:圆是 2D,球是 3D;
游戏里:很多“圆”其实是球,只是我们习惯在地上看投影。


七、把“圆 + Unity + FPS 应用”串成一整套理解

最后,用一段比较系统的总结,把前面所有内容串起来。

7.1 数学层面的“圆”

  • 几何定义:

    • 圆 = 平面上所有到某个点距离等于 r 的点;
    • 圆盘 = 距离小于等于 r 的点集合。
  • 解析几何表示:

    • 标准方程:(x - a)² + (y - b)² = r²
    • 特例(圆心在原点):x² + y² = r²
  • 位置关系判断:

    • 对点 P(x₀, y₀):
      • S = (x₀ - a)² + (y₀ - b)²
      • S 与 r² 比较 → 在圆上/圆内/圆外。
  • 圆与线、圆与圆相交:

    • 利用代入、距离比较、判别式等方法可求交点和相交关系。

7.2 Unity 中的“圆 / 圆形范围”

  • 2D:

    • CircleCollider2D表示圆形碰撞区;
    • 中心 + 半径。
  • 3D:

    • Physics.OverlapSphere+ 距离判断 → 球体范围(投影到平面就是圆形范围);
    • 或者手写二维 (x,z) 距离来做平面圆判断。
  • 绘制:

    • Gizmos 画圆辅助;
    • LineRenderer 或 mesh 拼出来的圆圈/环;
    • Shader 在地面上画一个圆形贴图 / 动态扩散圈。

7.3 FPS 射击游戏中的圆形相关玩法

  1. 爆炸范围(半径伤害)

    • 爆炸点为圆心,固定半径;
    • 以球体检测范围内敌人,按距离衰减伤害。
  2. 范围技能 / AOE

    • 医疗圈、减速圈、增益圈;
    • 持续判定“在圆内”的单位,施加效果。
  3. 视野范围 / 感知圈

    • 敌人 AI 的最大感知距离;
    • 用平面圆判断玩家在不在这个范围内。
  4. 雷达 / 探测 / 扫描圈

    • 动态扩散的圆形可视化;
    • 半径随时间增长的“范围查找”。
  5. 近战范围 / 判定圈

    • 用圆形/球体范围检测周围单位,决定被打到谁。
  6. 毒圈 / 安全区 / 战术圈

    • 圆形区域不断缩小;
    • 判断玩家在圈内还是圈外,决定扣血或安全。

7.4 一句把“圆”真装进脑子里的话

再用一句彻底大白话帮你收个尾:

在数学里,圆就是那堆“到某个点距离相等”的点,
写成方程就是(x - a)² + (y - b)² = r²

在 Unity 里,这堆点变成:
“以某个坐标为中心、半径为 r 的范围检测”,
用 OverlapSphere 或自己算距离就能搞定。

在 FPS 游戏里,你看到的所有“范围爆炸”“治疗圈”“感知圈”“雷达圈”,
无论效果多炫,底层一般都只是:
判断一堆单位的坐标,是不是在“某个点为圆心、某个半径的圆(或球)”里面。

当你能从“纸上的圆”自然联想到:

  • Unity 的 SphereCollider / OverlapSphere;
  • FPS 里的各种圈圈范围逻辑;

说明你已经真的把“圆:用方程描述到某点距离相等的一堆点,以及在 Unity 和 FPS 游戏中的应用”这件事吃透了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 8:06:37

Unity视锥体:摄像机视野的6面墙

先把“视锥体”这俩字用一句人话说死: Unity 里的视锥体(Frustum),就是摄像机能看到的那一块 3D 空间—— 长得像一个被削了尖的“斜着的方锥体”, 里面的东西能被照进屏幕,外面的东西对摄像机来说就“看不见”。 整个 Unity 渲染、剔除、选中物体、后处理特效里, 这个视…

作者头像 李华
网站建设 2026/2/7 12:37:08

LFM2-1.2B:边缘智能时代的轻量级大模型革命

LFM2-1.2B&#xff1a;边缘智能时代的轻量级大模型革命 【免费下载链接】LFM2-1.2B 项目地址: https://ai.gitcode.com/hf_mirrors/LiquidAI/LFM2-1.2B 导语 Liquid AI推出的LFM2-1.2B以12亿参数实现边缘设备高性能AI推理&#xff0c;重新定义轻量级大模型行业标准&am…

作者头像 李华
网站建设 2026/2/7 19:46:47

企业级数据中台建设:datart在电商行业的应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个电商数据中台可视化系统&#xff0c;集成销售数据、用户行为数据、库存数据等多个数据源。系统需要包含以下功能&#xff1a;1) 实时销售看板&#xff08;GMV、订单量、转化…

作者头像 李华
网站建设 2026/2/14 22:59:08

3步掌握note-gen工作区:从混乱到井然有序的终极指南

3步掌握note-gen工作区&#xff1a;从混乱到井然有序的终极指南 【免费下载链接】note-gen 一款专注于记录和写作的跨端 AI 笔记应用。 项目地址: https://gitcode.com/GitHub_Trending/no/note-gen 你是否曾经打开电脑&#xff0c;发现笔记文件散落在桌面、下载文件夹和…

作者头像 李华
网站建设 2026/2/15 5:20:27

AI推理引擎轻量化部署终极指南:突破资源瓶颈的完整解决方案

AI推理引擎轻量化部署终极指南&#xff1a;突破资源瓶颈的完整解决方案 【免费下载链接】vllm A high-throughput and memory-efficient inference and serving engine for LLMs 项目地址: https://gitcode.com/GitHub_Trending/vl/vllm 在边缘计算和嵌入式AI应用快速发…

作者头像 李华
网站建设 2026/2/14 23:29:35

llama.cpp SYCL后端终极配置实战:从编译失败到GPU加速全流程

llama.cpp SYCL后端终极配置实战&#xff1a;从编译失败到GPU加速全流程 【免费下载链接】llama.cpp Port of Facebooks LLaMA model in C/C 项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp 你是否在Arch Linux上配置llama.cpp SYCL后端时遭遇过"icx…

作者头像 李华