记录 Unity的 Tiny Mode 的早期版本

版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室 https://blog.csdn.net/u010019717/article/details/84931497

对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/[email protected]/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与Uni​​ty 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为例

                  没看到图片资源在哪里?  

截图2018-12-10 17.55.22.png

使用 Base64 进行序列化了 。 

             https://qiita.com/smith/items/1013a49fb90cfca7230e

缺陷:

  • 由于图像数据的  静态地定义,因此不可能通过资源量进行存储器压缩
  • 执行Base64是通过DOM完成的,GC离开了浏览器
  • 我找不到可以触摸DOM的I / F(对不起)
  • 因为它是在脚本中共同定义的,所以即使替换了某些图像,脚本也会重新DL
  • 无法准备您不想提前发布的图像

因为语言要转向C#,那么我们无法使用npm包

猜你喜欢

转载自blog.csdn.net/u010019717/article/details/84931497
今日推荐