接着上次我们继续来玩 Tiny Mode
创建一个新项目
菜单 -> tiny -> file -> new project
创建新的项目 TinyNew
我们可以看到,在 Asset 目录下创建了一个新的名为 TinyNew 的目录
下面有一个 TinyNew.utproject 文件
这个文件就是 tiny mode 的项目文件了
和 Unity 不同,tiny mode 不存在 Scene
双击项目文件,就可以加载项目了
项目的 Inspector 如图
可以选择 Build 类型,需要加载的模块
还有显示设置以及物理设置
从可加载的模块看我们现在基本也可以知道 Tiny Mode 现有的功能有哪些
物理选项只有一个重力,可以看出相比 Unity 本体非常的精简
我们要做的是平面上球触边弹的效果,所以重力设置为 0
开始创建主实体
以前我们的各种玩意,都是放在 GameObject 上的,在 ECS 中,GameObject 没有了,用来放内容的变成了 Entity,所以还是老一套,需要一个 Entity 来放置摄像机什么的
创建一个新的 Entity 现阶段只能从 Tiny 菜单 Create EntityGroup 或者层级图中,点击 Create EntityGroup
我们在 Entities 目录下新建一个 MainGroup,点击后
在 EntityGroup 的 Inspector 中可以看到两个按钮
- Load: 加载这个组的一个 Entity 实例到层级图中,方便操作
- Set as StartUp: 设置为初始 Group,游戏启动时,会自动加载,不能被 Unload
我们把 MainGroup 设置为启动加载
在 MainGroup 右边的小菜单里面选择 Camera 新增一个 Camera
再 Create Empty,新建一个空组件,命名为 Spawner,用来产生球球
再 Create Empty,新建一个空组件,命名为 Border,作为边界
导入一个矩形 Sprite, 这里导入 Sprite 的方式和 Unity 本体是一样的,就不多说明了
在 Border 下面 Create 2D Object -> Sprite
做4个边
给4个边加上 RigidBody2D 和 BoxCollider2D 来做物理效果
刚体和碰撞检测的选项都比较简单
说一下刚体的几个 BodyType
- Static:静态,不做物理模拟,质量无限,不会同其他 static 和 kinematic 做碰撞检测
- Kinematic:运动学,质量无限,运动靠 velocity,质量无限,所以不受力的作用,不会同其他 static 和 kinematic 做碰撞检测,移动靠设置他的 Position 或 velocity
- Dynamic:动态,全物理模拟,和其他三种类型的刚体做碰撞检测,一般靠给其施加一个力来运动,当然也可以直接设置 velocity 和 Position 但是意义不大
- BulletDynamic:子弹动态,和动态差不多,但是使用的连续碰撞检测,更精确,也更消耗资源,好处是不会因为速度过快而穿过其他刚体
所以我们的边界选择什么很明显了-> Static
其他几个参数:
- freezeRotation:如果 true 则不能旋转
- friction:摩擦力,0 代表无摩擦,1 代表大摩擦,1 以上代表比 1 大的摩擦(废话)
- restitution:弹性系数,0 代表完全吸收,1 代表完全反弹
- density:密度,决定刚体的 质量 = 密度 * 体积
这里我们选择全反弹 restitution 设置为 1
自定义我们的产生器 spawner
我们自定义一个组件来产生小球
在 菜单 -> Tiny -> Component
新建一个 Spawner 组件
点击组件,在 inspector 中可以对其字段来做修改
如果 hide_flags 设置为 hide in inspectors 则在层级图中即使添加到实体上了也不会显示出来
add new field 可以添加任意可玩的数值和属性类型
点击属性名称可以修改之,下面可以设置默认值
最后设置如下
我们在延时 1.5s 后每 1.5s 创建一个 spawnedGroup 的实体 最多 maxCount 个
类型右边的 3 个图标分别是
- 是否数组类型
- 编辑器是否可见:比如我们的 curCount 这个字段编辑器不可见,因为是不用编辑也不能编辑
- 子菜单 字面上的意思,Document 选项应该和自动生成文档的内容有关
生成器组件有了,我们继续来搞生成系统
菜单,创建 TypeScript System (后面省略哪里的菜单了哦)
1 |
|
我们可以看到生成了一个继承 ut.ComponentSystem 的类,重写一个 OnUpdate 函数
是不是和 Unity ECS 的方式一毛一样
ut 是 unity tiny 的简称
文件名修改为 SpawnSystem
1 |
|
代码如上,循环 World 中的每一个 Spawner 来操作
至此,生成器组件完成,我们在 MainGroup 的 Spawn 元素的 insepector 中点击 Add Tiny Component 增加一个 Spawner 组件
于是就可以在编辑器中设置这个自定组件的值了
spawnedGroup 设置为 game.BallGroup
maxCount 设置为 10
创建球球实体
创建新的实体组 名为 BallGroup
点击 Load 按钮
放到层级图中
加入一个 2d sprite UnitBall 如图
新建一个新的空组件 BallFlag 用来代表实体是球球
再增加 CircleCollider2D RigidBody2D 组件到球球
调整好圆形检测的半径
做好之后 Unload BallGroup,后面我们都通过 Spawner 来生成球球
球球的行为
我们需要一个脚本来控制球球生成的地方,并且给一个力让他跑起来
菜单 创建 TypeScript Behavior
1 | namespace game { |
NewBehaviourFilter 相当于是 Unity ECS 中的 GetEntityGroup 中的 struct
将会获得有这个过滤器下字段的所有 Entity
所以我们需要给 UnitBall 增加一个 空的 BallFlag 来确认他是球球
- OnEntityEnable. Called only once, the first frame this entity is matched by this behaviour. 获得此Entity的第一帧执行
- OnEntityUpdate. Called every frame on matching entities.
- OnEntityDisable. Called only once, the first frame this entity is marked as disabled by this behaviour. 设置为 disable 的第一帧执行
球球行为代码如下
1 | namespace game { |
运行
到此我们的工作告一段落,unity 执行后
会在我们的默认浏览器打开一个窗口
在浏览器中使用开发者模式可以看到打印
也可以扫描二维码在移动设备上查看效果
运行效果如图