ue4技术分享

1. 介绍:
  • 用户体验(UE)是什么。

UE是指用户与设计的交互过程,是把用户的需求、兴趣、思维方式等融入产品设计中的方式。UE能根据用户的需求,结合设计理念,从视觉、交互、结构、内容等方面,提供一种有效的交互设计。

  • UE引擎是什么

UE引擎是指Unreal Engine(虚幻引擎)的简称,它是由Epic Games(Epic游戏公司)开发的一款高度先进的游戏开发工具。虚幻引擎是一种3D图形渲染引擎,为开发者提供了一系列强大的功能。

虚拟引擎具有开放源代码和许可的特点,允许开发者自由地使用和定制引擎的功能,从而满足不同项目的需求,使很多游戏开发者、影视制作公司和虚拟现实(VR)和增强现实(AR)开发者使用UE引擎作为他们的首选工具。

2. UE引擎版本
  • UE4和UE5版本对比

UE5和UE4在可视化、光照、动画、开发流程和性能优化等方面有很多区别

  • UE4:

(1) 需要自行收集和导入资源

(2) 对于大规模场景和高细节模型的渲染需要更多的计算资源和时间

(3) 动画系统较为简单,需要更多手动操作和脚本编写

(4) 需要使用静态网格或者LOD来处理细节模型,限制场景的复杂性和真实感

  • UE5:

(1) 引入Quixel Bridge插件,提供了大量的高质量资源,包括纹理、材质和3D模型,方便开发者快速创建场景

(2) 改进了性能和优化方面。它针对各种硬件配置进行了优化,提供了更好的性能表现,特别是在大规模场景和复杂模型方面

(3) 提供更好的动画工具和系统,引入MetaHuman工具可以帮助开发者创建高度逼真的动画

(4) 在可视化方面进行了大量改进。引入Nanite的新技术,它可以实现实时渲染高质量的细节模型,无论是静态对象还是动态对象

(5) 引入lumen的全局光照系统,允许实时光线追踪,动态光源和反射方面提供更加逼真的效果

3. UE引擎的应用
  • 应用领域

(1)最常见的应用游戏开发,如《堡垒之夜》、《生化危机2:重制版》、《控制》、《绝地求生》(UE4引擎)、《古墓丽影》

(2)虚拟现实(VR)和增强现实(AR),用于教育、培训、娱乐和模拟等领域

(3)影视制作:创建特效、虚拟场景和动态灯光,后期制作。如《星球大战:曼达洛人》、《神奇女侠1984》使用UE引擎制作的特效场景

(4)建筑和可视化,用来创建建筑的可视化模型、室内设计方案和虚拟漫游体验

(5)教育和培训:创建交互式的虚拟实验室、仿真训练环境、教育游戏

(6)动画制作、艺术创作、广告营销等

4. UE引擎工具的安装

(1)首先打开ue4的官网ue4的官网,进入页面

(2)注册并登录epic games帐号,虚幻引擎是基于epic games 中,需要登录才可使用

  • 官网直接注册即可,但是由于服务器不稳定等因素,可能需要多次尝试

(3)下载epic games客户端并登录,找到虚幻引擎 -> 库,即可下载引擎版本,可多个版本共存,通过启动虚幻引擎创建项目工程

5.UE引擎学习demo

下载压缩包后需将文件至于通过虚幻引擎对应版本的项目文件下的plugins文件夹内,然后重启虚幻引擎,虚幻引擎将自动引入对应的插件,和进行版本的匹配

  • 问题1:可能会出现图形驱动版本不适配的情况,需要进行更新驱动程序

  • 问题2:可能会存在项目编辑器打开失败的情况,有一定原因也是由于网络原因,加载失败

打开编辑器后可对当前已选择的项目工程模板进行设计,以ue4与echats图表库交互为例:

需下载所需的echarts的demo示例代码:


  • 得到一个html文件需引入ue4自执行代码
    ue4版本
"object"!=typeof ue&&(ue={}),
ue4=function(functoid)
    {
         "object"!=typeof ue.interface && (delete ue.interface,ue.interface={});
         return function(key,json,cback,timeout){
                   if( "object"!=typeof ue["$receive"] || "function"!=typeof ue["$receive"]["asyn"]){
                    console.error("[ue.$receive.asyn] drop message .... key"+key+" json"+JSON.stringify(json));
                    return ;
                   }
                   "string"==typeof key&&("function"==typeof json&&(timeout=cback,cback=json,json=null));
                   var backid=functoid(cback,timeout);
                   void "string"!==typeof json?ue["$receive"].asyn(key,JSON.stringify(json),backid):ue["$receive"].asyn(key,json,backid);
                } ;
    }(
        function(callback,timeout){
            if("function"!=typeof callback)
                return"";
            var funcid=function(){return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,function(t){return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)})}();
            return ue.interface[funcid]=callback,setTimeout(function(){delete ue.interface[funcid]},1e3*Math.max(2,parseInt(timeout)||0)),funcid
        }
    );

ue5版本

"object"!=typeof ue||"object"!=typeof ue.interface?("object"!=typeof ue&&(ue={}),ue.interface={},ue.interface.broadcast=function(e,t){if("string"==typeof e){var o=[e,""];void 0!==t&&(o[1]=t);var n=encodeURIComponent(JSON.stringify(o));"object"==typeof history&&"function"==typeof history.pushState?(history.pushState({},"","#"+n),history.pushState({},"","#"+encodeURIComponent("[]"))):(document.location.hash=n,document.location.hash=encodeURIComponent("[]"))}}):function(e){ue.interface={},ue.interface.broadcast=function(t,o){"string"==typeof t&&(void 0!==o?e.broadcast(t,JSON.stringify(o)):e.broadcast(t,""))}}(ue.interface),(window.ue5=ue.interface.broadcast);

执行js调用ue

ue4("js2ue", "hello world!")
或
ue5("js2ue", "hello world!")

执行ue调用js

ue.interface.ue2js = function(ueData){
    var jsonObj = JSON.parse(ueData);
    myChart.setOption(jsonObj);
 };

完整代码

<!DOCTYPE html>
<html lang="en" style="height: 100%">

<head>
  <meta charset="utf-8">
</head>

<body style="height: 100%; margin: 0">
  <div id="container" style="height: 100%"></div>
  <script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.4.3/files/dist/echarts.min.js"></script>
  <script type="text/javascript">
    "object" != typeof ue || "object" != typeof ue.interface ? ("object" != typeof ue && (ue = {}), ue.interface = {}, ue.interface.broadcast = function (e, t) { if ("string" == typeof e) { var o = [e, ""]; void 0 !== t && (o[1] = t); var n = encodeURIComponent(JSON.stringify(o)); "object" == typeof history && "function" == typeof history.pushState ? (history.pushState({}, "", "#" + n), history.pushState({}, "", "#" + encodeURIComponent("[]"))) : (document.location.hash = n, document.location.hash = encodeURIComponent("[]")) } }) : function (e) { ue.interface = {}, ue.interface.broadcast = function (t, o) { "string" == typeof t && (void 0 !== o ? e.broadcast(t, JSON.stringify(o)) : e.broadcast(t, "")) } }(ue.interface), (window.ue5 = ue.interface.broadcast);
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};

    var option;

    option = {
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [120, 200, 150, 80, 70, 110, 130],
          type: 'bar'
        }
      ]
    };

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }

    ue.interface.ue2js = function (stringJSON) {
      const json = JSON.parse(stringJSON)
      myChart.setOption(json);

      ue5("js2ue", "hello world!")
    };

    window.addEventListener('resize', myChart.resize);
  </script>
</body>

</html>

将html文件引入虚幻引擎流程

  • 新创建项目后,创建关卡蓝图,引入控件蓝图

  • 新增控件蓝图
    设计器增加画布和webUI interface

  • 图表引入html文件以及js调用ue流程

  • 增加点击按钮,点击后触发ue2js事件更新echarts数据,刷新页面图表



    执行游戏即可看到如下效果:
    更新前


  • 更新后

附参考:
1、UE4 利用WEBUI插件完成UE与JS的交互 (UE4嵌入WEB)
2、UE4_Echarts图表_WebUI_JS和UE交互 视频

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,529评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,683评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,905评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,318评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,325评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,754评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,081评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,088评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,653评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,651评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,766评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,359评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,083评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,491评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,654评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,367评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,836评论 2 367

推荐阅读更多精彩内容