Learning about Pony, a new (at least for me) programming language that designed to be elixir-python-golang like (imho), got me to this page:
It's interesting to see the memory usage of those language-framework, also Crystal, despite inability to utilize multicore still could perform as good as Golang's default muxer (which is not the best).
programming: the action or process of writing computer programs. | rants: speak or shout at length in a wild, [im]passioned way.
2018-06-12
2018-06-01
Hybrid ECS in Unity
Previously we tried the Pure ECS to create a Pong animation, this article will show example snippet of how to use Hybrid ECS. With hybrid ECS we can use normal game object to act as the entity. What you need to do is:
class SomeSystem1 : ComponentSystem {
ComponentGroup group;
protected override void OnUpdate() {
if(group == null || group.CalculateLength() < 1) {
group = GetComponentGroup(typeof(Direction2D), typeof(Coord2D), typeof(Health)); // must be cached as data member }
var dirs = group.GetComponentArray<Coord2D>();
// do something with it,
// note that if you want to use Job/Schedule,
// you must use [Inject]
}
}
class SomeSystem2 : ComponentSystem {
struct Data {
public GameObjectArray gameObjects;
public ComponentArray<Position2D> Positions;
public ComponentArray<Heading2D> Headings;
public ComponentArray<Health> Healths;
}
[Inject] Data data;
protected override void OnUpdate() {
// do something with data.*
// inherit from JobComponentSystem
// if you want to use Job/Schedule
// also read this
}
}
One of the biggest benefit of using Hybrid ECS than Pure ECS is that you don't have to wait/implement missing component/system (Animation for example) that not yet implemented by Unity to make stuff works correctly.
This is the example the difference between creating hybrid ECS way and standard/normal way (btw this is not using a correct composition of component, just minimal conversion between those two):
Difference between prefab in Hybrid ECS way and in normal way:
Update 2019-05-07: see this video for better understanding how to use DOTS (the ECS new name on unity 2019)
- create a prefab,
- drag-and-drop your custom Component script (MonoBehavior, not a struct that inherited from IComponentData, so must be exactly one class per file) to the prefab,
- then add the GameObjectEntity script to the prefab.
- Next, you can instantiate the prefab as usual.
- Use a class inherited from ComponentSystem to manipulate the values of those components.
class SomeSystem1 : ComponentSystem {
ComponentGroup group;
protected override void OnUpdate() {
if(group == null || group.CalculateLength() < 1) {
group = GetComponentGroup(typeof(Direction2D), typeof(Coord2D), typeof(Health)); // must be cached as data member }
var dirs = group.GetComponentArray<Coord2D>();
// do something with it,
// note that if you want to use Job/Schedule,
// you must use [Inject]
}
}
class SomeSystem2 : ComponentSystem {
struct Data {
public GameObjectArray gameObjects;
public ComponentArray<Position2D> Positions;
public ComponentArray<Heading2D> Headings;
public ComponentArray<Health> Healths;
}
[Inject] Data data;
protected override void OnUpdate() {
// do something with data.*
// inherit from JobComponentSystem
// if you want to use Job/Schedule
// also read this
}
}
One of the biggest benefit of using Hybrid ECS than Pure ECS is that you don't have to wait/implement missing component/system (Animation for example) that not yet implemented by Unity to make stuff works correctly.
This is the example the difference between creating hybrid ECS way and standard/normal way (btw this is not using a correct composition of component, just minimal conversion between those two):
Difference between prefab in Hybrid ECS way and in normal way:
Example code for the system:
For more info, see this slide Unity ECS Intro.