UE4总结三

1,状态机:用于两个动作之间的切换条件,右键选择State Machines


创建了一个状态机, 可是它是空的


双击状态机进入编辑,创建一个状态,连线


创建state后双击发现又有一个同样的编辑框,将调整好的一维混合树动画拖动到里面,连线


再创建一个状态机,箭头 代表切换条件,双击可以在里面设置一个变量,当变量满足可以从站立状态切换到跳跃状态


对于从站立到跳跃分为了好几个状态机切换


从JumStart到JumpLoop,也即从起跳到下一次跳跃循环的切换条件是该动画有没有播完,使用Time Remaining节点,跳跃动画刚播放值为1,播放完为0,小于等于0说明播放完了,进入跳跃循环状态,对于从IdelWalkRun到JumStart和从JumpLoop到JumpEnd状态的切换条件只需设置一个bool值判断即可


实现效果:

 


材质溶解过程讲解:


步骤,创建一个球体,创建一个材质,双击,首先选择一个噪波,


将这种贴图放入资源中,在回到新建材质的双击编辑中,

在图中看到将贴图导入,Texture Sample中最上面的出口应该是本身,第二到最后一个分别为RGBA四个变量出口,将Alpha和0.9比较,如果A》=B(也即0.9》=材质的该点的Alpha值),则为1,否则为0,输出的值在右侧显示出来,如果我们想要动态的,要加入时间函数,比如time的sin函数


点击左上角的绿色对勾退出编辑界面,将材质拖动到球体中,效果如下


但是这个效果只是初步实现,对于高光高边的效果,这样做


高边指的是球体表面撕裂的所有口子的边上都是高光效果

代码这样:原理是得到两个不同时间sin的撕裂效果的图片,然后得到差值再叠加上一张撕裂图片即可

3,新建场景,创建天空盒,在视图左侧输入sky,找到拖动到场景中即可,在视图的左侧,山峰是地貌用来画地貌的,水稻这个图标是植被


4,对于材质要放到另一个项目中,需要这样操作,找到材质,选择右侧的放大镜图标跳转到资源的目录文件中,右键材质---->资源操作--->合并,会弹出该资源涉及的其他资源


 点击确定,放置到另一个项目目录中,在另一个项目中双击材质发现有资源缺失,比如贴图丢了,其实贴图导进来的,只不过需要重新定义


5,在蓝图划线后双击线段出现一个点,可以从这个点再分支出一条线,


6,pawn,character和controlle和objectr的关系

pawn是一种可以被控制的游戏物体,通过自己独有的controller来移动,character是pawn的一个专门版本,可以对人形动物设计,controller是控制一个对应的pawn,object是ue4中最基础的类,包含了Actor和其他东西


7,在项目设置中坐标轴变化的值再Axis Mapping设置,一瞬间动作的值再Action Mapping设置,



8,pitch,roll,yaw

pitch是绕x轴旋转,叫做俯仰角,yaw是绕y轴旋转,叫偏航角,roll绕z轴旋转,叫翻滚角


9,动画蓝图中分为动画图表和事件图表两部分,动画图表主要是状态机的切换。而动画图表里面的变量是通过事件图表里面的组件里取得的


10,如何查看运行游戏的错误日志,在窗口--->开发者工具--->信息日志


11 ,对于开门和关门的渐变动画我们可以通过时间轴来完成,步骤:

打开门物体,在事件图表中输入时间轴


我们添加一个函数,设置两点,起点值为0,终点值为-130,时间变化从0到0.5秒,

给门添加box collider设置大小,当人物碰到box区域自动调用开门函数,在Collision属性中碰撞预设值设为overLapAllDynamic也即相交就自动触发,在事件图表中

 


12,对于人物碰到物品,物品就消失的逻辑



13,对蓝图逻辑的注释,选中按c键,对连线的取消,按ctrl在点击箭头即可取消连线


14,如果要想不同的骨骼共用同一套动画,参考http://www.52vr.com/extDoc/ue4/CHN/Engine/Animation/AnimHowTo/Retargeting/index.html#使用不同骨架重定向


15,对于碰撞的触发可以在碰撞体的属性中Tag设置标签,如果碰撞到标签为xx的物体,就...



16,对于触发检测,如果是人物,就触发。如果是人,说明能强转成功,就继续,不是人,就不能强转,就不触发



17,一个bool值Print String打印的时候必须勾选Print To Screen才能显示


18,对于连线,要想清晰不乱,可以向下图一样设置左右两个节点保证看的清楚


19,AI系统:(摘自http://www.gameres.com/384827.html)

大量不同环境状态进行选择时就不能用switch,光看代码都很累,当前可以选择AI模型包括FSM有限状态机和Behavior Tree(行为树)两大类。


FSM流程图:


缺点:1,多个状态机会出现死锁 2,无法大规模扩展


行为树类型节点有5种:

1,顺序节点(Sequence):属于组合节点,顺序执行子节点,只要碰到一个子节点返回false,则停止继续执行,并返回false,否则返回true,类似于程序中的逻辑与。

2,选择节点(Selector):属于组合节点,顺序执行子节点,只要碰到一个子节点返回true,则停止继续执行,并返回true,否则返回false,类似于程序中的逻辑或。

3,平行节点(Parallel Node):提供了平行的概念,无论子节点返回值是什么都会遍历所有子节点。所以不需要像Selector/Sequence那样预判哪个Child Node应摆前,哪个应摆后。Parallel Node增加方便性的同时,也增加实现和维护复杂度。

4,条件节点(Condition):属于叶子节点,判断条件是否成立。

5,执行节点(Action):属于叶子节点,执行动作,一般返回true。

行为树的流程图:(对于行为树的状态这样看:当前打伞下面的3个状态时顺序判断,因此打伞状态为sequence)



黑板:

黑板就是这样一个共享数据的结构,它对于多个系统间通信是很有帮助的,从程序设计的角度上来说,它提供一种数据传递的方式,有助于系统的封装和解耦合。对于各个子系统而言,只需要把自己的运算的结果数据记录在黑板上,至于这个数据谁会去用,并不需要关心,反过来也是一样,对于自己的运算时需要用到的数据,可以从黑板上去获取,至于这个数据是谁提供的,也不需要关心,只要这个数据在黑板上,就够可以认为是合法数据。这就提供的了一种灵活性,各个子系统的设计也会相对独立。

好处:

  • 解耦合:黑板做为独立的数据模块,可以”超然”于所有的模块之外,提供一些额外的数据维护和管理的功能,这个让我想到了那些内存数据库,比如redis和memcached,从某种程度上,黑板就像程序内的数据库。
  • 共享性:黑板的数据是共享的,比如我们要去拿一个数据,我们不需要先拿到它的实例(还需要考虑是否为null),然后再通过get方法去取数据,我们只需要存一个黑板的实例,然后通过黑板获取数据的方法来获取。这就类似设计模式中的Facade方法,黑板提供了这样一个facade层,使得RWD的接口保持统一。
  • 数据的维护和管理:黑板提供数据的RWD,生命期,作用域等内容,让我们可以从管理数据的漩涡中解脱出来,让专业的人做专业的事。

举个一个很简单的游戏中的例子来说明最后一点,比如我们在游戏中有一个技能,可以给角色提供一种狂暴状态,持续10秒,游戏中很多别的系统在计算中,需要检查该角色是否有这样的一个狂暴的状态,然后做一些后续的判断。在这样一个例子中,常规的做法可能是,在角色上存一个变量,技能触发的时候,置成True,然后维护一个计时器,设为10秒,每帧检查这个计时器,当时间到了,就把这个值再置成False,再提供一个get方法给外部系统调用。这样的逻辑正确,但相对繁琐,不够优雅,如果我们换用黑板系统来维护这个数据应该怎么写呢?就一句话player.GetBB().SetValue(BBKEY_FURIOUS, true).SetExpiredTiime(10)

我们先获取了黑板的实例(GetBB),然后设置了变量为True(SetValue),然后再设置了过期时间为10秒(SetExpiredTime),这样在10秒内如果访问这个变量,会返回True,但如果过了10秒,这个变量就会返回False,而所有对于数据的管理就被完整的封装在了黑板的实现中


行为树中注意的是,在写task时什么时候设置变量为public类型,答:一旦涉及到从黑板中读取时就要设置为public,在行为树调用task,在属性中就能设置该值了


猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/78915967
今日推荐