https://docs.unrealengine.com/latest/CHN/Gameplay/HowTo/CharacterMovement/index.html

这里的demo是按照一些persona的机制来设定玩家怎样控制一个角色来进行各种行为的;

Test Project:D:\EngineStudy\Unreal\4.14\TestProject\HowTo_CharacterMove

需要额外的角色及角色动画的资源包是:D:\EngineStudy\Unreal\AnimStarterPack 把AnimStarterPack这个文件夹放到content文件夹下面即可路径匹配;

整体demo的思路:

  1. 创建gamemode资源,设定默认地图相关;设定input相关,即各种input控制快捷键设定;设定默认game mode(project setting里面)
  2. 创建主角character class blueprint;在gamemode里面设定默认的角色class blueprint;设定主角class blueprint里面的各种资源(如skeletal mesh,camera,SpringArm等)和速度等数值;添加各种表示状态的成员变量,比如JumpPressed,CrouchPressed,DisableMovement等bool型,在其event graph里面使用“InputAction Jump”之类的节点(Jump是在设定Input里面的设定行为名字),来设定这些成员变量,供以后流程使用,设定”Character Movement”这个component节点下的类似“MaxWalkSpeed”来控制角色位置在世界空间的改变;同时event graph里面也通过“InputAxis Turn”(Turn是input里面设定的)结合“Add Controller Yaw Input”类似节点设定camera的旋转;
  3. 创建一个Animation blueprint资源(会让你在创建时候选择使用哪个skeletal mesh,选择后,这个skeletal mesh的所有资源,包括sequence动画序列,自己创建的blend space都会自动和这个animation blueprint发生关联),并且将其设定到2中主角 character class blueprint的Skeletal mesh的detail里面;
  4. 修改3中的animation blueprint,添加控制动画的成员变量,可以和2中主角character blueprint的一些成员变量对应起来,比如也加上变量“IsJumping, IsCounching”等,这些变量在event graph里面被设定,设定的值来源于获取主角character实例(TryGetPawnOwner)下的2中那些成员变量;还可以为animation blueprint里面添加额外必需的变量,比如”Speed, Direction”,这些变量将控制blend space里面的blend方式,设定这些变量的值可以通过节点“Try Get Pawn Owner---GetActorRotation/GetVelocity/CalculateDirection”等;对于animation blueprint里面的event graph,如果打开会发现有默认的“Event Blueprint Update Animation”节点,用于更新动画,逐帧调用(可能某种情况也能禁掉);

4.1. 在animation blueprint里面会发现这个skeletal mesh对应的所有动画数据都存在了,在AssetBrowser窗口里面;接下来我们创建Blend Space资源,用于混合多个动作;在创建这种资源的时候,需要提示选择哪个skeletal mesh,选择我们的主角,发现所有的动画数据(可能没有blend space类型的,都是maya里面导出来原生动画流数据);按照这个demo中的,我们将blend space的横纵坐标正分别设定为Direction和Speed,这样和我们之前animation blueprint里面的两个变量可以对应起来(这样animation blueprint里面的两个变量可以在后面设置用来传入值到blend space里面的对应两个变量,进而控制各个动画的blend 状态):

横纵轴的设定及其范围;注意横轴方向是【-180,180】,我们在向左边的格子里面拖动画sequence的时候在横轴上是以中心向两边有着逆的动画,比如横轴5个点,中间点第三个点上拖前进动画,第二个点拖左边走动画,第四个点拖右边走动画,第一个点和第五个点拖入后退动画,这5个点都是对称的,而上面5个点和下面5个点一一对应相同,因为纵轴只是速度,不需要改变动画的混合形态,只是用一种即可;

类似的,我们可能需要多个blend space资源,对于这个,其实是为了实现跑动过程中,前走后走左走右走的无缝过渡,因为这些行为不好使用状态机来控制,利用状态机无法显示无缝过渡的;另外对于前跑后跑左跑右跑动画的无缝过渡,其实也是需要space blend的;其实,对于蹲下,然后起立跑动,也可以做成space blend来实现,但是利用状态机也是可以的,蹲下à起立à跑动,这三个状态并不需要太严谨的无缝衔接过渡,所以这里也就没有这种需求做成资源;

4.2. 创建完了需要的blend space资源,回到之前定义的animation blueprint资源里面搭建状态机;这个状态机主要是用来控制各个动画之间的转换条件,如蹲下转换到站立,走路转换到静止等;

4.2.1.        右键在主要视图(AnimGraph)创建一个状态机,和Entry节点相连接;

4.2.2.        从AssetBrowser中拖入各种动画序列或者之前我们创建的blend space;如果是我们在4.1中创建的blend space动画,那么双击它可以打开其内部内容,在4.1中创建的blend space是具有成员变量的,我们此时可以将animation blueprint的成员变量(Speed和Direction)传递给它们,这样,这个blend space根据传进来的成员变量来控制其具体怎样blend;

4.2.3.        这个数据的传输使用流是这样的:主角character class blueprint来通过获取input的改变来存储一些类似于“JumpPressed,JogPressed”这样的变量;然后主角的animation blueprint的event graph视图里面通过拿到主角(指针)进而访问其内部的变量,然后将变量设给自己对应的变量,比如“IsJumping, IsJoging”这样的变量,同时也设定一些自己的其他如Speed/Direction这样的变量; 然后在状态机视图中拖入的blend space资源其内部可以使用这些animation blueprint的成员变量,把他们的值(Direction/Speed变量)传给自己这个BlendSpace的成员变量(对应的Direction/Speed)

进而控制自己这个blend space进行怎样的blend;

4.2.4.        在将各种动画序列资源拖到状态机视图里面进行搭建状态机的时候,各个状态之间的转换可以添加条件,

,着这些条件确定了是否从A状态转换到B状态,可以里面之前animation blueprint的成员变量(如”IsJumping/IsJoging”这些成员变量之前已经从主角character class blueprint里面拿到了对应的值);

4.2.5.        设定状态转换条件的时候有些节点很管用,比如

GetPlayerController---WasInputKeyJustPressed;

TimeRemaining(… …): 得到这个动画剩余时间是多少

4.3. 构建完状态机即可;

《Note --- Unreal 4 --- PersonaHowToMovement》的更多相关文章

  1. 《Note --- Unreal 4 --- matinee》

    https://docs.unrealengine.com/latest/CHN/Engine/Matinee/index.html https://docs.unrealengine.com/lat ...

  2. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

  3. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》

    ---------------------------------------------------------------------------------------------------- ...

  4. 《Note --- Unreal 4 --- behavior tree》

    Web: https://docs.unrealengine.com/latest/INT/Engine/AI/BehaviorTrees/index.html Test project: D:\En ...

  5. 《Note --- Unreal 4 --- B project --- Second UV issue》

    Second uv 可以通过editor来生成: 这部分内容都是在staticMeshEditor这个文件夹下面的代码里: 关于UI的相应机制,有个文件UICommandList.cpp例如我点击st ...

  6. 《Velocity 模板使用指南》中文版[转]

    转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607931.aspx <Velocity 模板使用指南>中文版 源文见 htt ...

  7. 《程序设计中的组合数学》——polya计数

    我们在高中的组合数学中常常会碰到有关涂色的问题,例如:用红蓝两种颜色给正方形的四个顶点涂色,会有几种不同的方案.在当时,我们下意识的认为,正方形的四个顶点是各不相同的,即正方形是固定的.而实际上我们知 ...

  8. 《how to design programs》12章函数复合

    我们写代码时要学会适应辅助函数.作者提出了一个问题,如何对一个表排序.排序函数读取一个表,产生另一个表.排序函数的合约和用途如下: (sort empty) ;; expected value: em ...

  9. 《Oracle Applications DBA 基础》- 9 - Concurrent Processing[Z]

    <Oracle Applications DBA 基础>- 9 - Concurrent Processing================================== 参考资料 ...

随机推荐

  1. 【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

     单向验证: 第一步: 生成key: keytool -genkey -alias mykey -keyalg RSA -keystore d:/key/testkey keytool -export ...

  2. ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17)

    在删除数据库的时候报标题所示错误 mysql> drop database test; ERROR (HY000): Error dropping database (can't rmdir ' ...

  3. Sublime Text 3 全程详细图文原创教程(持续更新中。。。)

    一. 前言 使用Sublime Text 也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知.最初也是不知道从何下手,满世界地查找资料,但能查阅到的资料,苦于它们的零碎.片面,不够系统 ...

  4. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  5. docker对数据卷容器进行备份

    转载请注明出处 官网的数据以及各大博客都没有对这个的具体说明,本人也是理解了好久. 我们使用docker的过程中,使用共享的数据卷是经常的,那么.我们要怎么进行备份呢?   首先,我们得了解下面4个命 ...

  6. 基于WebGL 的3D呈现A* Search Algorithm

    http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现 ...

  7. 分享在winform下实现模块化插件编程-优化版

    上一篇<分享在winform下实现模块化插件编程>已经实现了模块化编程,但我认为不够完美,存在以下几个问题: 1.IAppContext中的CreatePlugInForm方法只能依据完整 ...

  8. 使用PowerShell 监控运行时间和连接情况

    概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...

  9. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

  10. LCS记录

    如题:求两个序列的最长公共序列.(如:"ABCBDAB"与"BCDB"最长公共序列为"BCDB")代码如下: #define MAX_SIZ ...