优化条件的方法?

Ways to optimize conditional?

我正在使用 Unity3D 制作游戏,目前正在为敌人创建 AI。敌人需要四处走动并在没有 运行 进入墙壁的情况下搜索玩家。

敌人总是在它的局部 z 轴上向前移动,直到遇到障碍物或 Raycast 发出的射线击中物体。当 Raycast 击中一个属于环境一部分的物体时,它会在所有 7 个对角方向、左右和前后方向上 Raycast 检查它附近是否有更多障碍物,如图所示这张图片。

然后,它所采用的路径取决于这些光线是否击中另一个物体并沿着光线没有击中任何东西的方向前进,即最佳 方向.

最佳我的意思是顺序:

  1. fl 或 fr
  2. l 或 r
  3. bl 或 br
  4. b

我需要根据这些数据决定转向哪个方向。如果说 fl 和 fr 都为真,那么我会在两个方向之间随​​机决定。

我想优化这个过程,这样我就不必使用多个 if 语句。我曾想过使用位掩码技术,因为有 8 个方向,如果包括前向,每个位都可以代表一个方向。

欢迎任何想法、建设性批评等。谢谢你的时间。

G,一天!

我最近阅读了很多关于 Unity 2018 中新的寻路系统的内容。我想知道你是否已经检查过它了?

如果你想从头开始创建它,疯狂的道具给你 - 但是,我会按照文档(在 Unity 网站上)在敌人的 GameObject 上创建一个更新脚本,它会找到到玩家 GameObject 的变换位置,确保针对障碍物进行调整。

也可以在 YouTube 上浏览一下 - 那里有很多很棒的教程。

否则 - 如果您想自己做,我个人会采用的方式(可能不是最佳方式)是在每一帧扫描潜在路径,然后找到最短的一个并根据预定速度移动敌人来采取行动 * time.deltaTime。可以在 Devon Crawford 的网站(下方 link)上找到该系统的出色可视化。

Unity 文档 Link:https://docs.unity3d.com/Manual/Navigation.html 德文克劳福德的网站:http://www.devoncrawford.io/software/pathfinding

不要过早优化,有人说这是万恶之源。这将是一个完美的例子。

我们用 C# 而不是汇编(甚至 C)编码的原因不是性能,而是可读性。虽然可以使您的代码 运行 稍微快一点,但结果可能甚至无法衡量。这里的 IF 分支仍然非常小,我强烈建议不要用其他任何东西替换它 - 你会失去很多可读性,同时不会获得太多,如果有的话。当您处理数以千计的对象(即实体)时,位掩码技术开始变得有效,但是如果您的 if 分支适合几页,我不会触摸它,除非我通过测量它发现它是一个主要的拖累探查器。如果您不确定自己在做什么,那么让您的代码 运行 变慢并不难。优先考虑的是使代码可读(绝对是在你的情况下,因为你不会 运行 将它放在一个紧密的循环中),并且易于修改。在某些情况下,最好将代码展开到更冗长的 if 分支中,而不是将其打包到一些奇怪的循环中——记住循环也是一条指令。