Unreal Engine 潜行检测:用 AI 搭建带视野锥的哨兵
如何在 Unreal Engine 中制作潜行检测:哨兵在 120 度范围内扫视,视野锥半角 45 度、射程 1500,带视线检测、红灯和 Spotted 文字,由 AI 搭建。
Unreal Engine 中的潜行哨兵是三个小点子:一个会转动的头部,一个它每秒问很多次的问题,即我能看到玩家吗,以及一个反应,也就是灯和文字。回答这个问题需要两个条件:玩家在角度之内,并且中间没有任何东西挡着。最简单的做法,是用一个请求让 AI 一次搭好整个系统,包括视野锥、视线和警戒状态。
在这篇演示中,Ultimate Engine CoPilot 搭建了一个左右来回扫视的哨兵,玩家进入视野锥时,它的灯变红并显示 “Spotted!”。你会看到完整的提示词、AI 发现并修复的一个摆放问题,以及一段通俗易懂的视野锥原理说明。
完成后的哨兵是什么样
一根顶部带灯的高柱缓缓地左右转动。你站在它身后时,灯保持绿色:它没有看到你。现在你走到它前面,进入那道淡淡的光锥之内,灯变成红色,屏幕顶部出现一行红色文字 “Spotted!”。你走出去,片刻之后灯变回绿色,文字也消失了。

玩家在视野锥之内,文字显示 Spotted!
提示词
复制下面这段,改一改角度或射程,看看 AI 会搭出什么:
Make a stealth sentry. Create BP_Sentry in /Game/Series/EP42_Sentry, a tall pillar with a lamp on top that slowly turns left and right through 120 degrees, with a vision cone of 45 degrees half-angle and 1500 units range drawn as a pale cone of light. The lamp is green while nothing is seen. When the player is inside the cone and in line of sight, the lamp turns red and the text Spotted! shows in the top centre below the existing Blizzard box; when the player leaves the cone, the lamp goes back to green after 1 second and the text is removed. Keep the range, the angle and the turn speed as variables. Place one sentry near the player start facing the open snow. Then play test it: check the lamp is green with the player behind it, teleport the player into the cone and check the lamp is red and the text shows, teleport the player out and check it returns to green, and fix anything that does not work.
看看这些数字:120 度、45 度、1500 个单位和 1 秒。再看一个短语:“在视线内 (in line of sight)”。它告诉 AI,墙壁必须挡住视野。一个能透视墙壁的哨兵,算不上潜行游戏。
AI 如何搭建它
AI 读取项目和 HUD,然后搭建哨兵:一根立柱、一个灯头、两个材质(一个给灯,一个给半透明的光锥),以及一个角度和射程相同的聚光灯,用来照亮地面。接着是逻辑:头部按转动速度转动,视野检测在每次 Tick 运行,一个一秒的计时器让红色在玩家离开后再保持片刻,这样灯就不会闪烁。
光锥不只是装饰。它与真实的视野射程和角度大小一致,所以你看到的,就是哨兵看到的。

哨兵图表:头部转动,视野检测每个 Tick 运行,灯和文字随之反应。
摆放位置的问题
检测逻辑是正常的,但最初的摆放朝向与玩家起点相同,即朝着废墟,而前方 270 个单位处的一根废墟立柱挡住了视野。哨兵始终看不到玩家。AI 探测了地形,在东边找到一片开阔的雪地,把哨兵移到那里。Blueprint 逻辑不需要任何改动。然后所有情况都通过了。
报告

各项检查、位置修复和说明。
报告里有一张表,列出了每项检查:
- 哨兵身后:没有被发现,绿色。头部在一秒内转动约 21 度。
- 哨兵前方:一秒内被发现,红色,Blizzard 框下方显示文字。
- 离开之后:半秒内仍是红色,一秒后变绿,文字被移除。
- 在哨兵和玩家之间放一根立柱会挡住检测,把它移走后检测恢复。
它如实说明了自己没有做的事:
- 在视野锥内的检查中,扫视被冻结在中间位置,所以传送位置每次都给出相同的结果。头部扫到一半时的检测没有单独测试。
- 灯的颜色是从它的光读取的,没有通过画面确认。
- 主菜单遮罩盖住了一部分截图。
它还指出,文字和灯都是在一秒延迟之后才消失,而不是玩家离开的那一瞬间。而且光锥从灯处水平射出,灯高 430 个单位,所以站在离立柱不到约 350 个单位处的玩家位于它的下方,不会被看到。
视野锥的工作原理,通俗讲
在每个 Tick,哨兵比较两样东西:头部所朝的方向,以及指向玩家的方向。如果两者之间的夹角小于半角 45 度,并且距离小于射程,玩家就在视野锥内。接着它从灯向玩家发出一条射线检测。如果这条线先撞到别的东西,比如墙或立柱,玩家就是被遮住的。
如果玩家被看到,灯变红,文字出现。如果没有,一个一秒的计时器开始运行,之后灯变绿,文字消失。正是这个延迟让哨兵显得公平。由于射程、角度、转动速度和延迟都是变量,改四个数字,就能做出懒散的守卫,也能做出高度警觉的守卫。
扩展思路
- 第三种颜色,黄色,表示哨兵起疑但还没有看到玩家。
- 看到玩家时会追击的哨兵。
- 警报声,以及被唤醒的其他哨兵。
哨兵提示词的四个技巧
- 用数字给出角度、射程和转动速度。
- 写上“在视线内”,让墙壁挡住视野。
- 说明玩家离开后会发生什么,以及多久之后。
- 要求 AI 从视野锥的后方、内部和外部分别测试。
常见问题
在 Unreal Engine 5 中,如何制作视野锥?
把哨兵朝向与指向玩家的方向之间的夹角和半角比较,用射程检查距离,再向玩家发出一条射线检测,确认中间没有东西挡住视野。
为什么哨兵需要射线检测?
角度和距离只能说明玩家在前方。从灯到玩家的射线检测可以确认中间没有墙或立柱挡路。
为什么哨兵一开始始终看不到玩家?
它最初的摆放朝向前方 270 个单位处的一根废墟立柱,挡住了视线。AI 把哨兵移到开阔的雪地上,逻辑不需要任何改动。
在你的项目中试试
在 产品页面 了解 Ultimate Engine CoPilot 能搭建什么,或者到 Fab 上获取。 了解 AI Blueprint 生成器 的工作原理。
本系列的更多搭建: Unreal Engine 尖刺陷阱、Unreal Engine 钥匙门 和 Unreal Engine 传送门。