react可视化编辑器_UE4下玩转react
他山之石
在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相关推荐
- 基于React+Koa实现一个h5页面可视化编辑器-Dooring
前言 前段时间笔者一直忙于数据可视化方面的工作,比如如何实现拖拽式生成可视化大屏,如何定制可视化图表交互和数据导入方案等,这块需求在B端企业中应用非常大,所以非常有探索价值. 本篇文章并非和数据可视化 ...
- React 可视化开发工具 Shadow Widget 非正经入门(之四:flux、mvc、mvvm)
本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 在 MVC.MVVM.Flux 框架之间如何做选择. 1. React Flux 框架 ...
- 玩转 React(二)- 新型前端开发方式
这是<玩转 React>系列的第二篇.在该篇中,我们来了解下,React 的出现到底给我们的开发方式带来了什么样的变化. 我的感触可以用一个字来形容,爽!主要爽在以下两个方面. 视图是数据 ...
- react 数据可视化_使用d3创建数据可视化并在2020年做出React
react 数据可视化 Data visualisation and application technologies have evolved greatly over the past decad ...
- react html编辑器,wangEditor富文本编辑器+react+antd的使用
搜索热词 1.github上发现富文本编辑器: 2.结合react+antd的具体使用: 案例使用场景:MyModal为弹窗,弹窗显示 编辑名称及描述.描述使用wangeditor富文本编辑器实现. ...
- [react] 请描述下事件在react中的处理方式是什么?
[react] 请描述下事件在react中的处理方式是什么? 所有时间都挂载到 document 上,然后捕获对应的 dom. 类似事件委托 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容 ...
- [react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景?
[react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景? 在 React 中使用 class 继承 React.Component,就可以在类里面使用各种各样的钩子函数,比如 ...
- react可视化_如何使用React和Popmotion.io可视化煎饼算法
react可视化 What you are going to see below was supposed to be part of my solution to an exercise given ...
- 仿美团下拉菜单 html,React Native仿美团下拉菜单的实例代码
本文介绍了React Native仿美团下拉菜单的实例代码,最近也在学习React Native,顺便分享给大家 在很多产品中都会涉及到下拉菜单选择功能,用的最好的当属美团了,其效果如下: 要实现上面 ...
最新文章
- 数据结构c语言函数大全,数据结构习题库(c语言版).doc
- java--uploadify3.1多文件上传
- Jmeter之ForEach控制器(配合正则表达式使用)
- 常用LINQ关键字用法汇总
- 全国计算机等级考试题库二级C操作题100套(第04套)
- vlan间路由的问题
- java corba_Java编写CORBA的一个简单例子(CORBA入门)
- 取消关机shutdown -c
- 儿童心理健康的十项注意
- bootstrap table 合并行_ElementUI Table组件如何使用合并行或列功能深入解析
- Redis单台的安装部署及集群部署
- LayaAir UI 组件 # Image 位图、Label 标签
- 对外汉语偏误语料库_哇,9大对外汉语必备语料库,每个都很有“性格”!!...
- 动画专题:属性动画:插值器AccelerateDecelerateInterpolator 加速插值器
- 通俗易懂的UART协议帧格式
- 机器学习之监督学习-分类模型K近邻(KNN)算法实现
- Port vlan Tag vlan
- 使用chrome console检查css selector/xpath的有效性|百度云盘如何获取文件库中的目录文字
- 体检明明不查乙肝,但是体检报告就是不合格,公司不让入职
- tp3.2.3 图片打水印