对Unity推出的 Tiny Mode 还是很感兴趣的。 一个是使用的ECS ,ecs以后在Unity中肯定是无处不在的, 一个是为什么一开始采用的编程语言是TypeScript , TS语言在H5游戏引擎中太常见了, 国产三剑客 白鹭,Layerbox, Cocos . 但是Unity引擎不理应是C#么。感兴趣的是Unity在H5 上有了进步,为什么Unity不能接入微信? 我才一个主要原因生成的包体太大了。
因为这个TinyMode 和现有的Unity运行时不是一套,相当于针对H5单独实现的。 只不过进行了包装可以在Unity下方便的使用。熟悉的界面和流程。
虽然暂时只支持2D, 以后应该都会有的
支持哪些平台? Project Tiny支持HTML5目标。它支持2D WebGL和2D Canvas渲染目标。
https://blogs.unity3d.com/cn/2018/12/05/project-tiny-preview-package-is-here/ (有系列视频 !)
Project Tiny是一种新的模块化Unity运行时和编辑器模式,旨在构建可以即时加载而无需安装的游戏和体验。截至今天,它可以通过软件包管理器作为Unity 2018.3的预览包,称为Tiny Mode。
Project Tiny为开发人员提供了快速创建高质量2D即时游戏和可播放广告所需的工具,这些游戏体积小,并且可以在各种移动设备上快速启动。
Project Tiny使用模块化架构构建,允许您选择要包含的功能。它采用纯数据导向的ECS方法,可以在较小的代码大小下实现高性能。目前的功能集专注于构建即时2D游戏和可播放广告。在未来的版本中,将添加其他功能以构建即时3D和AR游戏和体验。
虽然Project Tiny目前使用Typescript编写游戏逻辑,但在预览期间它将被C#替换。
重要的是要注意,一旦对C#的支持准备就绪,我们将删除Typescript 。
https://unity.com/cn/solutions/instant-games/2d-games-and-playables
https://forum.unity.com/threads/is-there-somewhere-to-get-the-tiny-package.593866/
https://forum.unity.com/forums/project-tiny.151/
文档: https://docs.unity3d.com/Packages/com.unity.tiny@0.13/manual/index.html
执行一些Sample项目 , 在 Unity工程下, 有两个文件夹, TinyExport 肯定是Play时执行Build 生成的, 并且 在浏览器中可以执行的~~~ 就是生成H5 了
引擎概述
ECS概述
实体
组件
系统
Scheme模式定义与Data数据定义
对于Unity开发人员
Unity开发人员熟悉GameObject和Component概念。 GameObjects以Transform层次结构组织,存储在asset中( Scenes或Prefabs) -- 用于游戏中的后续实例化。 组件Component是附加到游戏对象的脚本。它们保存Unity运行时每帧执行的数据和逻辑,通常是通过实现Unity预定义的MonoBehaviour消息,如Awake,Update和OnDestroy。
uTiny与Unity共享概念。实体Entities是简化的游戏对象,没有强制Transform组件。事实上,uTiny中的实体只是一个数字,仅此而已。您可以通过向实体添加组件Component来将数据附加到实体。 uTiny运行时针对动态组件分配进行了优化 - 这使得将组件附加到实体是一种轻量级操作 。
uTiny中的组件Component是plain old data(POD)对象,没有附加逻辑。要提供逻辑,您必须编写一个系统System。系统是用JavaScript编写的,由它处理的组件定义。您可以将系统视为每帧为每个实体执行一次其组件签名相同 的函数。
要安排执行系统,只需在uTiny编辑器中启用它们,并定义它们的Execute Before和Execute After约束,以控制它们何时在帧中执行。
作为Unity开发人员学习uTiny的挑战如下:
1、采用纯 实体 - 组件 - 系统(ECS)开发模型
2、从C#切换到JavaScript (后面还是会更改为 C# )
3、限制uTiny运行时支持的内容 (Play就是Build 执行 这个不太好)
为了简化这个不同,我们尝试使uTiny运行时API与Unity API保持类似。我们还提供Unity中托管的资产管道。
对于Web开发人员
WIP
uTiny运行时使用C ++编写,并通过Emscripten编译为JavaScript
引擎概述
uTiny是一个独立于Unity运行时的轻量级游戏运行时。 uTiny Editor Extension使Unity开发人员能够为uTiny运行时生成内容。
实体组件系统概述
介绍实体组件系统如何工作以帮助您生成内容。 ECS围绕数据导向设计的概念而构建。
实体
实体在概念上代表游戏中的单个对象或角色。它由表示实体数据的单个id和组件的位掩码定义。
可以通过两种方式之一创建实体。
组件
组件代表数据块。
系统
系统执行您的逻辑并转换您的数据。系统对匹配特定签名的所有实体进行操作。
-- javascript --
function (shed, world) {
}
Scheme模式定义与Data数据定义
在uTiny中,所有类型都是动态的。没有编译。可以动态创建和注册类型。
Demo - 简单输入
Unity和uTiny中简单运动行为的比较。
Unity3d示例
在Unity 中创建行为时,您的数据和逻辑将合并在一个文件中。在下面的示例中,Speed变量与逻辑放在一起。
using UnityEngine;
public class MovementBehaviour : MonoBehaviour
{
public float Speed = 100;
void Update()
{
var dt = Time.deltaTime;
var direction = new Vector3();
if (Input.GetKey(KeyCode.UpArrow))
{
direction.y += 1;
}
if (Input.GetKey(KeyCode.DownArrow))
{
direction.y -= 1;
}
if (Input.GetKey(KeyCode.RightArrow))
{
direction.x += 1;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
direction.x -= 1;
}
direction.Normalize();
direction *= Speed * dt;
var position = transform.localPosition;
position += direction;
transform.localPosition = position;
}
}
你的例子
在ECS模型中,您的数据和逻辑是分开的。您将组件定义视为纯数据(通过编辑器)。将组件添加到编辑器中的实体就像将MonoBehaviours添加到GameObjects一样。
JS代码
function (sched, world) {
world.forEachEntity([ut.Core2D.Transform, game.Movement],
function (entity, transform, movement) {
var dt = sched.elapsed() / 1000;
var direction = new Vector3f(0, 0, 0);
if (Input.getKey(ut.input.KeyCode.UpArrow)) {
direction.y += 1;
}
if (Input.getKey(ut.input.KeyCode.DownArrow)) {
direction.y -= 1;
}
if (Input.getKey(ut.input.KeyCode.RightArrow)) {
direction.x += 1;
}
if (Input.getKey(ut.input.KeyCode.LeftArrow)) {
direction.x -= 1;
}
direction.normalize();
direction.multiplyScalar(movement.speed() * dt);
var position = transform.localPosition();
position.add(direction);
transform.setLocalPosition(position);
});
};
};
图片资源: 以三消Demo为例
没看到图片资源在哪里?
使用 Base64 进行序列化了 。
https://qiita.com/smith/items/1013a49fb90cfca7230e
缺陷:
- 由于图像数据的 静态地定义,因此不可能通过资源量进行存储器压缩
- 执行Base64是通过DOM完成的,GC离开了浏览器
- 我找不到可以触摸DOM的I / F(对不起)
- 因为它是在脚本中共同定义的,所以即使替换了某些图像,脚本也会重新DL
- 无法准备您不想提前发布的图像
因为语言要转向C#,那么我们无法使用npm包