不绕弯子,先把这句话说清楚:
圆是啥?
从几何上看:所有到同一个点距离相等的一堆点。
从解析几何上看:这些点,刚好都满足一个方程。
在 Unity 里:圆 = 以某个位置为中心、一定半径的范围(2D/3D 里就是圈 / 球体)。
在 FPS 射击游戏里:
- 手雷爆炸范围
- 范围治疗 / 范围伤害
- 范围探测、雷达扫描
- 击退圈、毒圈、缩圈
背后全是“圆(或球)”在干活。
下面我会用大白话,一步一步把这件事讲清楚:
- 圆在几何上的直观定义
- 用方程来描述圆:解析几何视角
- 圆的常见计算:点在不在圆里、圆和线怎么交
- Unity 里如何“画一个圆 / 圈一个范围”
- 在 FPS 游戏里的圆:爆炸范围、AOE、感知范围等具体用法
- 一点拓展:从圆到球,从 2D 到 3D
- 把这些东西串一起的小结
一、圆究竟是个啥?先站在“肉眼几何”的视角看
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₀),想知道它在哪:
计算左边的数:
S = (x₀ - a)² + (y₀ - b)²和 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;
要找交点:
- 把直线的 y 代入圆方程;
- 得到关于 x 的一元二次方程;
- 解出来 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 手雷 / 榴弹 / 火箭弹的爆炸范围:伤害圆
场景:
你丢一颗手雷,砰的一声爆炸,
附近的敌人都掉血,离得越近伤害越高。
这背后就是:
爆炸点为圆心,某个半径为边界的圆形(或球形)区域,
所有在这个区域里的敌人都受影响。
典型逻辑:
- 爆炸发生时,用 OverlapSphere 找到周围一定半径内的所有碰撞体;
- 对每个目标算“距离爆心的距离”;
- 根据距离算伤害(可能是线性衰减 / 指数衰减 / 表定档位)。
伪代码:
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 <= radius或sqrDist <= radius²。
这就是圆的典型 FPS 用法之一:爆炸伤害圈。
5.2 范围技能 / AOE:治疗圈 / 增益圈 / 减速圈
很多 FPS + RPG 混合玩法里有这些东西:
- 医疗圈:在某个点释放,范围内队友持续回血;
- 减速圈:敌人走进去移动速度变慢;
- 增益圈:站在圈里攻击力/防御力提升;
- 静滞场:子弹进到圈里变慢、甚至停下。
这些都是以某点为中心、一定半径的“圆形区域效果”。
实现方式和爆炸差不多,只是多了“持续时间”:
- 每帧 / 每秒检查在圆内的单位;
- 对在圆内的单位施加Buff/伤害/减速等;
- 离开圆就移除效果。
可以用触发器(Trigger)+OnTriggerEnter/OnTriggerExit+ 半径为范围的 Collider,
也可以每帧Physics.OverlapSphere+ 手动判断。
5.3 视野范围 / 感知范围:谁在我的“雷达圈”里?
敌人 AI 常见的设定:
- 有一个“视野角度”(前方扇形);
- 有一个“最大视距”(圆形范围)。
这里“最大视距”就是一个以敌人位置为圆心、半径为视距的圆(如果只看平面)。
怎么判断玩家在不在这个“感知圆”里?
计算敌人与玩家之间的水平距离:
dx = player.x - enemy.xdz = player.z - enemy.z
算平方距离:
dx² + dz²;比较和
视距²:if((dx*dx+dz*dz)<=viewRadius*viewRadius){// 在感知范围内}
再叠加上“视野角”(点乘判断夹角)和“射线检测有无遮挡”,就是完整的视线逻辑。
5.4 雷达、扫描、地图圈:UI 上的“圆形高亮”
在 FPS 游戏里你经常看到:
- 小地图中,一个圆形范围表示你的雷达扫描范围;
- 扫描技能开启时,一个圈从角色辐射出去,圈到的敌人被标记;
- 毒圈 / 安全区 / 电磁圈:一个不断缩小的圆把战场越收越小。
这些更多是视觉表现上的圆,
背后逻辑仍然是“范围判断”。
例如:雷达扫描效果:
启动扫描,半径从 0 缓慢增大到最大值;
每帧:
- 根据当前半径 R,找到
OverlapSphere(center, R)内的敌人; - 把这些敌人标记出来(在 UI 上画个红点)。
- 根据当前半径 R,找到
视觉上则用:
- 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² 比较 → 在圆上/圆内/圆外。
- 算
- 对点 P(x₀, y₀):
圆与线、圆与圆相交:
- 利用代入、距离比较、判别式等方法可求交点和相交关系。
7.2 Unity 中的“圆 / 圆形范围”
2D:
CircleCollider2D表示圆形碰撞区;- 中心 + 半径。
3D:
Physics.OverlapSphere+ 距离判断 → 球体范围(投影到平面就是圆形范围);- 或者手写二维 (x,z) 距离来做平面圆判断。
绘制:
- Gizmos 画圆辅助;
- LineRenderer 或 mesh 拼出来的圆圈/环;
- Shader 在地面上画一个圆形贴图 / 动态扩散圈。
7.3 FPS 射击游戏中的圆形相关玩法
爆炸范围(半径伤害)
- 爆炸点为圆心,固定半径;
- 以球体检测范围内敌人,按距离衰减伤害。
范围技能 / AOE
- 医疗圈、减速圈、增益圈;
- 持续判定“在圆内”的单位,施加效果。
视野范围 / 感知圈
- 敌人 AI 的最大感知距离;
- 用平面圆判断玩家在不在这个范围内。
雷达 / 探测 / 扫描圈
- 动态扩散的圆形可视化;
- 半径随时间增长的“范围查找”。
近战范围 / 判定圈
- 用圆形/球体范围检测周围单位,决定被打到谁。
毒圈 / 安全区 / 战术圈
- 圆形区域不断缩小;
- 判断玩家在圈内还是圈外,决定扣血或安全。
7.4 一句把“圆”真装进脑子里的话
再用一句彻底大白话帮你收个尾:
在数学里,圆就是那堆“到某个点距离相等”的点,
写成方程就是(x - a)² + (y - b)² = r²。在 Unity 里,这堆点变成:
“以某个坐标为中心、半径为 r 的范围检测”,
用 OverlapSphere 或自己算距离就能搞定。在 FPS 游戏里,你看到的所有“范围爆炸”“治疗圈”“感知圈”“雷达圈”,
无论效果多炫,底层一般都只是:
判断一堆单位的坐标,是不是在“某个点为圆心、某个半径的圆(或球)”里面。
当你能从“纸上的圆”自然联想到:
- Unity 的 SphereCollider / OverlapSphere;
- FPS 里的各种圈圈范围逻辑;
说明你已经真的把“圆:用方程描述到某点距离相等的一堆点,以及在 Unity 和 FPS 游戏中的应用”这件事吃透了。