使用 XNA/AI/AI 引擎创建游戏
如今,创建一个针对特定主题的整体解决方案是普遍的做法。这些解决方案通常被称为引擎。每天都会涌现出新的引擎。例如,针对 3D 图形、声音、网络甚至人工智能,尤其是游戏的人工智能。这些用于游戏的 AI 引擎解决了游戏开发过程中经常出现的几个问题,例如寻路、决策、学习、移动、战术和转向行为等。因此,存在着许多 AI 引擎和库,它们提供了一些这些算法。这些算法使您能够使您的游戏更加智能和具有挑战性。
SharpSteer 由 Bjoern Graf 和 Michael Coles 开发,它是 OpenSteer(C++)的 C# 版本,OpenSteer 是一个开源库,用于帮助构建游戏和动画中自主角色的转向行为,它根据 MIT 许可证进行分发 [1]。它的最后一个版本发布于 2008 年 3 月,专为 XNA 2.0 设计,但它也适用于 3.1。人们希望将其移植到 XNA 4.0,但转换尚未完成 [2]。顾名思义,SharpSteer 的职责在于转向行为,例如凝聚、分离、对齐等等。它的当前版本包含 200 个模拟鸟群物体(也称为鸟群)的演示 [3]。在 SharpSteer 中,鸟群可以是游戏中任何东西(足球运动员、敌方士兵、汽车)。它至少需要具有 SharpSteer 的 IVehicle 接口。最重要的类是 SteerLibrary.cs。它是 SharpSteer 的核心,包含了转向行为的主要算法。
- 对齐行为:沿附近其他车辆的平均方向移动
// Alignment behavior
public Vector3 SteerForAlignment(float maxDistance, float cosMaxAngle, List<IVehicle> flock)
- 凝聚行为:向附近车辆的平均位置移动。
// Cohesion behavior
public Vector3 SteerForCohesion(float maxDistance, float cosMaxAngle, List<IVehicle> flock)
- 分离行为:远离附近其他车辆以避免拥挤
// Separation behavior -- determines the direction away from nearby boids
public Vector3 SteerForSeparation(float maxDistance, float cosMaxAngle, List<IVehicle> flock)
这三个函数获得了三个相等的参数:浮点值 maxDistance 定义了其他车辆影响此车辆的临近区域。浮点值 cosMaxangle 定义了其他车辆不会影响此车辆的角度边界。显然,IVehicle 列表包含所有可能影响此车辆的车辆。但这还不是全部。还有
- 回避行为:远离特定车辆。
// evasion of another this
public Vector3 SteerForEvasion(IVehicle menace, float maxPredictionTime)
值 menace 是应该避免的车辆。值 maxPredictionTime 是预测 menace 未来位置的时间点。
此外还有数十种其他行为
public Vector3 SteerForWander(float dt)
// Seek behavior
public Vector3 SteerForSeek(Vector3 target)
// Flee behavior
public Vector3 SteerForFlee(Vector3 target)
// Path Following behavior
public Vector3 SteerToFollowPath(int direction, float predictionTime, Pathway path)
public Vector3 SteerToStayOnPath(float predictionTime, Pathway path)
// Obstacle Avoidance behavior
public Vector3 SteerToAvoidObstacle(float minTimeToCollision, IObstacle obstacle)
// avoids all obstacles in an ObstacleGroup
public Vector3 SteerToAvoidObstacles<Obstacle>(float minTimeToCollision, List<Obstacle> obstacles)
where Obstacle : IObstacle
// Unaligned collision avoidance behavior: avoid colliding with other
// nearby vehicles moving in unconstrained directions. Determine which
// (if any) other other this we would collide with first, then steers
// to avoid the site of that potential collision. Returns a steering
// force vector, which is zero length if there is no impending collision.
public Vector3 SteerToAvoidNeighbors<TVehicle>(float minTimeToCollision, List<TVehicle> others)
where TVehicle : IVehicle
// Given two vehicles, based on their current positions and velocities,
// determine the time until nearest approach
public float PredictNearestApproachTime(IVehicle other)
// Given the time until nearest approach (predictNearestApproachTime)
// determine position of each this at that time, and the distance
// between them
public float ComputeNearestApproachPositions(IVehicle other, float time)
// avoidance of "close neighbors" -- used only by steerToAvoidNeighbors
// XXX Does a hard steer away from any other agent who comes withing a
// XXX critical distance. Ideally this should be replaced with a call
// XXX to steerForSeparation.
public Vector3 SteerToAvoidCloseNeighbors<TVehicle>(float minSeparationDistance, List<TVehicle> others)
where TVehicle : IVehicle
// ------------------------------------------------------------------------
// pursuit of another this (& version with ceiling on prediction time)
public Vector3 SteerForPursuit(IVehicle quarry)
public Vector3 SteerForPursuit(IVehicle quarry, float maxPredictionTime)
public Vector3 SteerForTargetSpeed(float targetSpeed)
Simple AI 是 Piotr Witkowski 为 XNA 开发的引擎,它具有网格地图、寻路算法、路径跟踪以及寻路、跟随路径、到达、保持编队等行为。 [4] 与专门针对凝聚、对齐和分离等转向行为的 SharpSteer 相反,该引擎专注于使用 A* 进行各种图和寻路。因此,行为与表示为网格的图相关联,并且它们依赖于寻路算法。
该库非常轻量级。它只提供了 A*、深度和广度搜索。它适用于 XNA 3.1 和 4.0。由于体积小巧,它具有高度适应性。
如果您想编写自己的引擎,您需要考虑其结构设计。您应该考虑其用途,即它是一个更通用的解决方案还是专门针对特定类型的游戏。此外,必须有一个用于决策的通用机制,即哪种行为是当前行为,即使用了哪种 AI 算法。因此,每个算法都必须服从这种机制。尽管如此,您的 AI 引擎机制包含一个接口,用于您的算法与游戏世界交互,因为没有感官(输入)就无法做出适当的反应(输出)。当然,行为和智能行动游戏对象的动画之间应该存在联系。此外,您的引擎架构使它适用于扩展引擎本身及其算法,任何希望编写自己的行为或安装新 AI 技术的人都可以这样做。与往常一样,您应该重视可重用性、适应性和可维护性。因此,完整的 AI 引擎将拥有一个中心池,其中包含可以应用于任何类型的游戏对象的任何类型的游戏(无论是射击游戏还是文字冒险游戏)的预定义 AI 算法,如果 AI 引擎是一个通用解决方案。
应该讨论可用的引擎(可能不仅仅是 XNA),用于处理 AI。
例如,Nelxon 网站 [7] 列出了以下用于人工智能的引擎
- Engine Nine – 包含寻路和转向行为
- SharpSteer – 我发现它有很多用途……
- 基于状态机的行为模型 - 好文章,样本旧了……
- 转向行为、避障 - 好的示例(西班牙语)
可以在此处找到一些有趣的代码示例:http://create.msdn.com/en-US/education/catalog/?devarea=11
nexuschild 深入研究
- ↑ http://opensteer.sourceforge.net/
- ↑ http://sharpsteer.codeplex.com/
- ↑ a b http://www.red3d.com/cwr/boids/
- ↑ http://simpleai.codeplex.com/
- ↑ http://xnapathfindinglib.codeplex.com/team/view
- ↑ 伊恩·米林顿著《游戏人工智能》
- ↑ http://www.nelxon.com/681/xdsk2/ Nelxon,XSDK2 - 用于使用 XNA 4.0 的开发人员的资源