他山之石

在web前端领域,在UI制作方面有着悠久的历史,且一直都基于html+js+css技术,更利于技术的沉淀,是否能把web领域的优秀实践借鉴到游戏中呢?

上古时期流行的是dreamwaver的可视化编辑方式;而开源兴起后,作为最活跃的开源社区,相关技术百花齐放。react,angular,vue就是这些方案中的佼佼者。

其中react应该是最早探索非web领域使用的方案,比如react native正是这方面的探索,也验证了这种模式也适用于原生UI的制作。到了 React 16.2.0之后,更进一步的支持开发者定制自己的Host渲染器:于是有人将react适配到微信小程序,适配到three.js来做3D游戏,嵌入式系统等等,正所谓“Learn once, Write anywhere”。而本文正是利用该能力实现react在UE4上的移植。

如何实现自己的渲染器

首先,UE4下使用react你必须得有个js环境。试试这个:puerts。

其次,你得实现react的一些钩子。说白了也不高深,就是一些回调,react在UI控件的创建,更新,删除时会调用这些回调:

创建控件调用createInstance回调,告诉你要创建的是啥UI控件(Button,Text。。),属性(宽,高,颜色。。)是什么。

控件添加到UI树上调用appendChild回调,告诉你某UI控件,其父节点是什么。

控件属性的更新调用prepareUpdatecommitUpdate,告诉你原属性是啥,新属性是啥。

控件的删除调用removeChild回调。

。。。

细节可以参见源码。仅200多行代码,即完成了react和umg的对接。

React+UMG+Typescript=?

看个UI组件的实例:

class StatusBar extends React.Component<Props, State> {constructor(props: Props) {super(props);if ((props.initialPercent || 0) < 0) {throw new Error('initialPercent < 0');}this.state = {percent: props.initialPercent || 0.5};}get color(): LinearColor {return {R: 1 - this.state.percent , G: 0, B: this.state.percent};}onIncrement = () => this.setState({percent: this.state.percent + 0.01});onDecrement = () => this.setState({percent: this.state.percent - 0.01});render() {return (<HorizontalBox>{this.props.name}({this.state.percent.toFixed(2)})<ProgressBar Percent={this.state.percent} Slot={SlotOfProgressBar} FillColorAndOpacity={this.color}/><Button OnClicked={this.onIncrement} >+</Button><Button OnClicked={this.onDecrement} >-</Button></HorizontalBox>);}
}

用过react的人会很熟悉,但不一定每个人都用过,说明下:

  • 我们用ProgressBar,Button,Text,HorizontalBox组件组成了一个更复杂的组件:StatusBar
  • 两个按钮,一个是+,一个是-,点击后会导致percent属性的变化
  • percent的变化,会导致ProgressBar的进度条和颜色发生变化。percent同时也会显示到屏幕上。

该组件的使用接着看代码:

class Hello extends React.Component<Props, State> {constructor(props: Props) {super(props);}render() {return (<CanvasPanel><VerticalBox Slot={SlotOfVerticalBox}>{this.props.names.map((name, idx) => <StatusBar name={name} key={idx}/>)}</VerticalBox></CanvasPanel>);}
}//渲染到屏幕
ReactUMG.render(<Hello names={["Health:", "Energy:"]}/>);

代码说明:

  • 又写了个叫Hello的组件;
  • 这组件会把N个StatusBar组件渲染到VerticalBox下,渲染多少个,取决于外部传入的names数组属性;
  • ReactUMG.render渲染一个Hello组件到屏幕,传入两个字符串元素的数组。

最终效果

优势

  • 组件化利于重用。
  • 相比蓝图的二进制格式,react的文本方式无论是对人,对版本管理都更友好些,更容易多人协作。
  • 别看那些标签长得像html,其实这是Typescript的JSX语法:UI标签的属性是能自动提示的,名字拼写错误,赋值了错误的类型都会编译错误。JSX语法没接触过可能需要一段时间去适应,但好几个新出的技术都采用了相类似的思路(Flutter的Widget,iOS13的SwiftUI,都是仿JSX的语法),这可能表示业界认为这种UI表达方式比较优秀。

劣势

  • 没有可视化编辑工具前,美术不见得能写jsx,而部分团队的UI制作是完全交给美术团队的。能提供一个蓝图到jsx双向转换的工具或者能解决这问题。

展望

这个尝试只是一个抛砖引玉,有兴趣的可以试试并一起完善。目前也只提供了UE4版本,如果在Unity也想使用,可以按照UE4的思路整一发,毕竟也没几行代码。

react可视化编辑器_UE4下玩转react相关推荐

  1. 基于React+Koa实现一个h5页面可视化编辑器-Dooring

    前言 前段时间笔者一直忙于数据可视化方面的工作,比如如何实现拖拽式生成可视化大屏,如何定制可视化图表交互和数据导入方案等,这块需求在B端企业中应用非常大,所以非常有探索价值. 本篇文章并非和数据可视化 ...

  2. React 可视化开发工具 Shadow Widget 非正经入门(之四:flux、mvc、mvvm)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 在 MVC.MVVM.Flux 框架之间如何做选择. 1. React Flux 框架 ...

  3. 玩转 React(二)- 新型前端开发方式

    这是<玩转 React>系列的第二篇.在该篇中,我们来了解下,React 的出现到底给我们的开发方式带来了什么样的变化. 我的感触可以用一个字来形容,爽!主要爽在以下两个方面. 视图是数据 ...

  4. react 数据可视化_使用d3创建数据可视化并在2020年做出React

    react 数据可视化 Data visualisation and application technologies have evolved greatly over the past decad ...

  5. react html编辑器,wangEditor富文本编辑器+react+antd的使用

    搜索热词 1.github上发现富文本编辑器: 2.结合react+antd的具体使用: 案例使用场景:MyModal为弹窗,弹窗显示 编辑名称及描述.描述使用wangeditor富文本编辑器实现. ...

  6. [react] 请描述下事件在react中的处理方式是什么?

    [react] 请描述下事件在react中的处理方式是什么? 所有时间都挂载到 document 上,然后捕获对应的 dom. 类似事件委托 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容 ...

  7. [react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景?

    [react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景? 在 React 中使用 class 继承 React.Component,就可以在类里面使用各种各样的钩子函数,比如 ...

  8. react可视化_如何使用React和Popmotion.io可视化煎饼算法

    react可视化 What you are going to see below was supposed to be part of my solution to an exercise given ...

  9. 仿美团下拉菜单 html,React Native仿美团下拉菜单的实例代码

    本文介绍了React Native仿美团下拉菜单的实例代码,最近也在学习React Native,顺便分享给大家 在很多产品中都会涉及到下拉菜单选择功能,用的最好的当属美团了,其效果如下: 要实现上面 ...

最新文章

  1. 数据结构c语言函数大全,数据结构习题库(c语言版).doc
  2. java--uploadify3.1多文件上传
  3. Jmeter之ForEach控制器(配合正则表达式使用)
  4. 常用LINQ关键字用法汇总
  5. 全国计算机等级考试题库二级C操作题100套(第04套)
  6. vlan间路由的问题
  7. java corba_Java编写CORBA的一个简单例子(CORBA入门)
  8. 取消关机shutdown -c
  9. 儿童心理健康的十项注意
  10. bootstrap table 合并行_ElementUI Table组件如何使用合并行或列功能深入解析
  11. Redis单台的安装部署及集群部署
  12. LayaAir UI 组件 # Image 位图、Label 标签
  13. 对外汉语偏误语料库_哇,9大对外汉语必备语料库,每个都很有“性格”!!...
  14. 动画专题:属性动画:插值器AccelerateDecelerateInterpolator 加速插值器
  15. 通俗易懂的UART协议帧格式
  16. 机器学习之监督学习-分类模型K近邻(KNN)算法实现
  17. Port vlan Tag vlan
  18. 使用chrome console检查css selector/xpath的有效性|百度云盘如何获取文件库中的目录文字
  19. 体检明明不查乙肝,但是体检报告就是不合格,公司不让入职
  20. tp3.2.3 图片打水印

热门文章

  1. solr4.5分组查询、统计功能介绍
  2. Linux笔记(更改权限chmod,更改所有组chown,umask,隐藏权限chattr)
  3. 系统异常和不稳定的原因总结
  4. sublime text 3 使用过程总结记录
  5. Objective C 链式调用 1
  6. Java知多少(23)类的基本运行顺序
  7. 前端开发大众手册(转)
  8. android 调用手机震动
  9. JSON 序列化和反序列化——JavaScriptSerializer实现
  10. python server page_python web-server