我正在实现一个NPC,在虚拟空间中行走,特别是一只猫。我有一系列的动画短片(3-5秒)。我的第一本能是在最后一个动画结束时随机选择一个动画,但我意识到它看起来不太现实,因为它会经常改变行为,即使下一个动画仅限于物理上偶然的可能性。
我想要的解决方案类似于行为树(http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_乔木_为_AI_多么_他们_work.php),其中每个动画都有一个下一个动画的加权列表。也就是说,如果猫在走路,它有80%的机会继续行走,20%的人坐下来,0%的人睡觉。基本上使用马尔可夫模型来得到合适的下一步。
但是,我不知道这是否是一个好的解决方案,也不知道如何生成从当前动画到潜在的下一个动画+概率的映射。30个动画*下一个动画=900个重量。这需要手工计算。
猫有时会在遇到障碍时做出反应,但问题的首要问题是选择一个现实的动画序列,而不提前挑选它们。在这棵树上还会有其他一些输入,比如靠近一个人,房间里的位置,最后一次吃东西的时间等等。
发布于 2016-06-06 05:57:14
通常,您需要将猫的逻辑从动画中分离出来。
首先,您需要编写猫逻辑。我发现了一种很好的方法,就是将逻辑分解成层。
猫可能有某种动机或需要(吃、睡等)。随着时间的推移,这种情况会慢慢增加,在做这些事情时会减少(想想看,西姆斯)。如果您愿意,可以使用模糊逻辑来选择满足最大需求的当前任务。
现在,在每一个时刻,猫都有一项任务(找食物,找床睡觉,找地方到处跑,等等,懒也是一项任务)。这些任务告诉猫该去哪里,想做什么。
现在有第三层-行动。每个目标都有一系列的行动要做(站起来,走向,蹲着,吃,等等)。每项行动都要对其执行负责。例如,步行动作应该检查障碍物,把猫从A点送到B点,可能包含并执行子动作(跳过障碍物,蹲在家具下面等等)。
现在,当猫有需要,一个任务和一个动作,你可以选择正确的动画为该行动。了解当前和下一个动画,你应该能够从一个过渡到另一个。如果任务说猫应该在走到枕头前躺下,那么动画就是排队--步行--停--坐--躺。
如果将动画作为节点映射到图中,并在可转换的动画之间连接节点,则可以有效地完成动画排队(例如,步行坐下是可能的,但跳到咀嚼是可能的)。然后,您可以使用此图上的A*将动画从每个动画排队到任何其他动画。
猫需要休息和吃东西。让“休息”的任务找到一个地方休息,走猫那里,放下它和休息。让“休息”任务不时检查条件,如果环境变得不舒服,让任务结束。检查猫现在想要什么更多,如果它还想休息-重复前面的部分。当猫休息-选择新的任务。
发布于 2016-06-05 09:31:48
我认为您正在寻找的是有限状态机或有限状态机。简而言之,这是改变全国人大行为的一种方式:S,根据他们目前的状况。
这就像一棵行为树,但浓缩成了NPC返回的一些“国家”。行为树允许行为具有更大的灵活性,但也需要更多的数据来加权概率(一个聪明的方法是使用标记,正如scriptin在他的回答中所建议的)。当您使用状态时,您将为状态中的这些操作确定一组操作和概率。要实际改变当前动作,可能会有80%左右的偏差来保持相同的动作,如果要改变动作,则使用不同的概率来选择新的动作。
在您的例子中,状态可以(稍微简化一点):
每个州都有不同的改变状态的概率,例如愤怒或伤痕累累的状态可能不会持续很长时间。不同的州对什么是合法的也可能有不同的规则(从“困倦”改为“嬉戏”可能是非法的,但猫似乎并不在乎这一点)。不同的事件会触发状态发生变化。
有一个看通过搜索FSM和AI网络,你可以看到它是如何工作的。解释它似乎很复杂,但它真的很简单。
发布于 2016-06-05 11:09:32
您可以使用标记:
因此,对于每个动画,您可以有几个标记:
有了这些,您只能通过设置诸如"A->B只有当final_movement_tag(A) == initial_movement_tag(B)才可能“这样的限制来筛选可能的组合,这将导致更少的数量。有了这些可能的组合,你就可以做你所描述的--增加概率。添加概率可能基于活动标记,因为停留在同一个活动中比更改活动更有可能。
因此,使用标记,您可以自动创建FSM/行为树中的所有转换,如果您对某些组合不满意,可以稍后对它们进行优化。
https://softwareengineering.stackexchange.com/questions/319530
复制相似问题