我在Unity3D中制作游戏,目前正在为敌人制作AI。敌人需要走动并搜索玩家而不会碰壁。
敌人总是在它的本地z轴上向前移动,直到遇到障碍物或Raycast
发出的光线撞击物体为止。当Raycast
击中作为环境一部分的物体时,它会在所有7个方向上Raycast
对角线,左右并从前到后检查其附近的更多障碍物,如图所示这个形象。
然后,它所采用的路径取决于这些光线是否撞击另一个物体,并沿着光线没有击中任何物体的方向,即最佳方向。
最佳我的意思是:
我需要根据这些数据决定转向哪个方向。如果说fl和fr都是真的那么我会在两个方向之间随机决定。
我想优化这个过程,所以我不必使用多个if语句。我曾经想过使用比特掩码技术,因为有8个方向,如果你包括前向,每个比特可以代表一个方向。
任何想法,建设性批评等都是受欢迎的。谢谢你的时间。
答案 0 :(得分:1)
G,一天!
我最近一直在阅读关于Unity 2018中新路径查找系统的内容。我想知道你是否已经检查过了吗?
如果你想从头开始创建它,疯狂道具给你 - 但是,我会按照文档(在Unity网站上)在敌人GameObject上创建一个更新脚本,它将找到玩家GameObject的最短路径转换位置,确保调整障碍。
也可以在YouTube上浏览一下 - 有很多很棒的教程。
否则 - 如果你想要自己做,我个人做的方式(可能不是最优的)将在每一帧,扫描潜在的路径,然后找到最短的一个并通过基于预定的速度* time.deltaTime移动敌人来对其进行动作。可以在Devon Crawford的网站上找到该系统的精彩可视化(链接如下)。
Unity文档链接:https://docs.unity3d.com/Manual/Navigation.html Devon Crawford的网站:http://www.devoncrawford.io/software/pathfinding
答案 1 :(得分:1)
有些人说,不要过早地优化,它是所有邪恶的根源。这将是一个完美的例子。
我们在C#中编码而不是在汇编(甚至是C)中编码的原因不是性能,而是可读性。虽然有可能使代码运行得更快,但结果可能甚至无法衡量。这里的IF分支仍然非常小,我强烈建议不要用其他任何东西替换它 - 你会失去很多可读性,而不会获得太多,如果有任何表现。当你处理数以千计的对象(即实体)时,位掩码技术开始变得有效,但如果你的if分支适合几页,我不会碰它,除非我发现它是一个主要的阻力,通过测量它在剖析器中。如果您不确定自己在做什么,那么难以让您的代码运行得更慢。优先考虑的是使代码可读(绝对是你的情况,因为你不会在紧密的循环中运行它),并且易于修改。在某些情况下,最好将代码展开到更详细的if分支而不是将其打包成一个奇怪的循环 - 记住循环也是一条指令。