我是靠谱客的博主 仁爱八宝粥,最近开发中收集的这篇文章主要介绍[玩转UE4/UE5动画系统>设计篇>动画状态机设计模式] 之 洋葱模式(Onion Pattern),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。

在这里插入图片描述
工程文件: 玩转UE4(GitHub)
在这里插入图片描述

文章目录

    • 0. 声明
    • 1. 前言
      • 1.1 什么是(软件)设计模式
      • 1.2 什么是动画状态机设计模式
    • 2. 洋葱模式(Onion Pattern)
      • 2.1 核心思想
      • 2.2 主要解决
      • 2.3 适用场景
      • 2.4 必要语法机制
      • 2.5 关键逻辑
      • 2.6 命名建议
    • 3. 应用实例
    • 4. 小结

0. 声明

动画状态机设计模式是本人在学习和实践UE4/5动画系统时的一点总结和尝试,目前尚不完善,聊胜于无,抛砖引玉,仅供大家参考。这些设计经验也不是本人首创,仅作总结,由于水平有限,如有不当之处敬请大家指正。

1. 前言

1.1 什么是(软件)设计模式

设计模式(Design pattern)一词源于面向对象编程领域,详见百度词条软件设计模式

简言之,设计模式就是(软件)设计经验或套路。它能够帮助开发者解决代码结构上的问题,使代码可靠,结构清晰优雅易于维护,同时也更加易于阅读。

1.2 什么是动画状态机设计模式

动画状态机设计模式和软件设计模式并没有太大关系,仅沿用了上文中设计模式一词,请大家不要混淆。顾名思义,动画状态机设计模式就是针对虚幻引擎动画模块中动画状态机的设计经验和套路,即设计模式。在虚幻的游戏项目中,动画状态机已经相当庞大且复杂,但在老王查阅到的资料和教程中还没发现其设计模式的总结。究其原因,可能是虚幻引擎动画模块还在进化和完善阶段并具有区别于面向对象语言的一些特性,使得目前还不具备建立其设计模式体系的条件。

但是毕竟它的复杂度摆在那里,虚幻动画状态机是基于图形化设计的,这使得复杂的状态机逻辑与一目了然的文本代码相比,可读性较低。所以在现阶段,提出动画状态机设计模式这一概念也是有一定意义的:

  • 能够帮助初学者快速复用这些经验上手开发。
  • 便于阅读及开发者这之间的交流。
  • 便于一些关于动画状态机的教程的语言描述。

所以老王斗胆提出这个聊胜于无的动画状态机设计模式概念,纯粹抛砖引玉。当然也希望随着虚幻引擎的不断完善,动画状态机设计模式的内容也随之丰富和完善。

下文中,老王将尝试总结动画状态机设计模式 之 洋葱模式。

2. 洋葱模式(Onion Pattern)

在这里插入图片描述

2.1 核心思想

将某一个系统的动画状态由基础到细节纵向划分若干层次,分层实现。

犹如一层一层的洋葱,所以老王将其命名为洋葱模式。

2.2 主要解决

将状态机的基础逻辑和细节逻辑解耦合,降低系统的复杂度,同时可实现基础逻辑在不同细节逻辑中的复用。

2.3 适用场景

适用于一些具有”由基础到细节“层次关系的动作模块。

2.4 必要语法机制

软件设计模式的实现需要相应语法机制的支持,一种语言(类似Godot中的GDScript 3.x)如果没有静态变量机制,那么它将无法仅用代码实现单例模式(Singleton Pattern)。每一个动画状态机设计模式也需要相应的(语法)机制的支持。

  • 状态机嵌套: 在UE4/5 中,状态机不能直接嵌套(包含)另一个状态机,但可以通过状态机接嵌套(包含)状态再由状态嵌套(包含)状态机的方式实现状态机嵌套。

  • 姿态缓存: 这个机制有两个主要作用:1.存储姿态缓存以后,可以在其它状态机中使用这个状态机而无须重复实现逻辑;2. 只计算一次。假设有两个状态机A和B,A的内部状态为A0(初始状态)、A1、A2…;B的内部状态为B0(初始状态)、B1、B2…;且B1和B2中都包含(使用)A的缓存,当状态机B处于B1状态时,状态机A处于A2状态,这时如果保持状态机A的内部控制变量不变,状态机B由B1跳转到B2以后,状态机依然保持在A2状态,而不是从初始状态A0重新计算。

2.5 关键逻辑

先实现基础状态的状态机(即:基础状态机),并将其输出姿态缓存。然后使用姿态缓存构建细节状态的状态机(即:细节状态机)。

2.6 命名建议

为了便于阅读,建议对基础状态机和细节状态机分别使用带有Base和Detail后缀的命名,或者添加相应的注释。

3. 应用实例

本部分实例参考了advanced locomotion system v4中一些状态机的设计方法。

功能描述

  • 假定我们要实现一个角色八方位地面运动状态机(如下图:八方位地面运动状态机)。
  • 并在此基础上实现诸如正常、昂首挺胸、疲惫等不同步态的叠加效果(如下图:叠加体态)。

八方位地面运动状态机
叠加体态
使用洋葱模式实现

Step 1:实现基础状态机

注:八方位地面运动状态机的实现不唯一,下图仅为示意图。

该状态机最外圈的状态分别为各个方向由速度变量Speed控制的走/跑混合空间,这意味着该状态机可以实现八方位的走/跑移动。

在这里插入图片描述

将上述状态机命名为:8-direction Movement : Base 并缓存。
在这里插入图片描述

Step 2:实现细节状态机

添加一个新的状态机并命名为:8-direction Movement : Gait Detail。这意味着我们要在此状态机中添加步态(Gait)细节。

注:细节状态机可以有多层。

在这里插入图片描述

8-direction Movement : Gait Detail的实现:

在这里插入图片描述
其中Normal、Excited以及Tired三种状态中都包含8-direction Movement : Base状态机。三种状态之间的切换可以新添加一个枚举标志位Gait来控制。

Normal状态:

在这里插入图片描述
Excited状态:

在这里插入图片描述

Tired状态:

在这里插入图片描述

注:细节状态机的每个状态都可以通过不同的逻辑为基础状态机添加不同的细节;但仅就本例来讲,上述三种状态的逻辑基本相同,也可以使用一个状态并通过切换不同的Additive动画来实现。

4. 小结

动画状态机设计模式以及洋葱模式暂时介绍到此。再次声明:聊胜于无,抛砖引玉,仅供大家参考!

最后

以上就是仁爱八宝粥为你收集整理的[玩转UE4/UE5动画系统>设计篇>动画状态机设计模式] 之 洋葱模式(Onion Pattern)的全部内容,希望文章能够帮你解决[玩转UE4/UE5动画系统>设计篇>动画状态机设计模式] 之 洋葱模式(Onion Pattern)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部