YuHang’s Blog

实习这俩月

实习期参与的项目为FTS类型游戏,项目仍处于内部开发阶段所以不能透露项目信息,现以常见端游为例,分析UE4中常规需求的技术实现。

实习总结

小地图

玩家位置标识

在小地图中,显示玩家在小地图 中的位置,这里有两种情况:

  1. 小地图中显示全部地图时(英雄联盟的地图):此时玩家移动时,玩家所对应的标识在小地图中进行相应的平移
  2. 小地图中显示部分地图时(CS中的地图):此时玩家对应的表示始终保持在地图中央,当玩家移动时,背景地图进行相应的平移

标记功能

在很多游戏的地图中会有标记功能(如英雄联盟小地图的右击事件),实现方式在事件触发之后在触发位置做相应的动作就行了,但是需要注意的是,当地图覆盖其他的控件时,是否要允许点击/触摸事件下传。在UE4中image可以下传事件,Button则会消化事件。

地图遮罩

有时候需要对地图进行一定的遮罩,在UE中可以在widget中重写onPaint函数或者缩放遮盖物的图片实现

第三方库接入

有一些需要接入的第三方库没有对UE4提供支持,这时要去写一个UE的插件开提供对于UE的接入。对于Android端来说,会通过APL编写一个清单文件,记录了需要在andorid设备上申请的权限。实习期接的库是使用JNI调用C++的相关接口,所以需要Java env,之后在源码中在初始化的adnroid的时候将java env传出完成环境配置。

击杀提示

需求是做出红框部分的功能

这里的逻辑是在玩家死亡的时候将伤害类型,伤害源,被击杀玩家发送到服务器,再由服务器同步到各个客户端,在客户端将这个数据拼成一条完整的击杀提示。

伤害类型定义

UE中对于伤害的事件类型定义分为点伤害(PointDamage)范围伤害(RadialDamage),如果我们要扩展更多的伤害类型(例如坠崖死亡)则需要在原有的基础上扩展,通过重写DamageEvent,将各种伤害类型分离开。

网络通信

详见这篇文章,在PC端进行模拟的时候有一点需要注意:当使用单例的DelegateManager来统一控制各种代理的时候,在一台PC上开多个客户端,每个客户端上会收到很多次传值,这是由于UE在一个进程中模拟多个客户端,所以产生的Manager只有一个,但是这一个manager下面挂了很多个客户端(以五个客户端为例),服务器收到提示之向五个客户端都发送一个数据,所以manager收到了五次,manager作为代理的发出者向所有客户端发送数据,所以所有客户端都会收到五次数据。通过对输入数据做过滤(一个人不可能被击杀两次)或者对controller做判断(只接受来自于自己发出的数据)可以过滤多余数据。

动画

客户端接收到数据之后需要播放相应的动画,动画是在时间轴上增加关键帧实现的

item维护

这个做法是将widget作为一个父容器,承载着许多小的ItemWidget,每一个item为一条提示,包含了内容,生命周期,id等属性。在父容器中对Item进行维护:有新的消息到来的时候create一个Item,并加入一个等待队列之中。当有空位显示的时候将开启生命周期并显示到相应的位置,生命周期结束则进行销毁。这种做法易于扩展,但是频繁的创建/销毁item会使效率降低而且触发GC引起卡顿。

顶替轮播

在方案一淘汰之后的第一想法:当有输入进来之后去判断Widget中文本的状态,判断是添加一个文本还是更新一次文本,之后播放相应的动画。

解耦和的事件触发

上一套做完之后发现维护成本很大,因为动画的播放依赖于文本框的结构,当需要增加一个文本框的时候,整个动画的逻辑都需要更改,所以又换了一套方案。

这套方案将数据与动画分隔开,当有新的数据来的时候,将数据缓存到一个数组中。动画那边只负责播动画,播完动画拿数据,没有数据就等待。这样之后维护起来就很方便了。。

自由镜头

自由镜头也做了几版需求,详情在这里

相关文章

实习期也对自己接触到的东西做了一些总结:
快速入门:https://leaf-eater.github.io/2017/09/03/Unreal新手笔记(一)-从蓝图到C/
UE编程架构:https://leaf-eater.github.io/2017/09/03/Unreal新手笔记(二)——编程架构/
网络代理:https://leaf-eater.github.io/2017/09/03/Unreal新手笔记(三)——网络代理/
镜头控制:https://leaf-eater.github.io/2017/09/03/Unreal新手笔记(四)——镜头控制/