/
SyncPositionToEntitySystem.cs
102 lines (78 loc) · 3.7 KB
/
SyncPositionToEntitySystem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using EntitiesExt;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using UnityEngine;
using UnityEngine.Jobs;
using UnityEngine.Profiling;
namespace HybridTransformations {
/// <summary>
/// Synchronizes position data from the transform to the ECS world
/// </summary>
// Replaced by codegen
// ReSharper disable HeapView.DelegateAllocation
// ReSharper disable HeapView.ClosureAllocation
[UpdateInGroup(typeof(BeforeSimulationGroup))]
[UpdateAfter(typeof(PhysSimGroup))]
public partial class SyncPositionToEntitySystem : SystemBase {
#region [Fields]
private TransformContainerSystem _transformContainerSystem;
private ComponentLookup<Position> _positions;
private ComponentLookup<SyncPositionToEntity> _tagData;
private ComponentLookup<SyncPositionOffset> _syncPositionOffsets;
#endregion
protected override void OnCreate() {
base.OnCreate();
_positions = GetComponentLookup<Position>();
_tagData = GetComponentLookup<SyncPositionToEntity>(true);
_syncPositionOffsets = GetComponentLookup<SyncPositionOffset>(true);
_transformContainerSystem = World.GetExistingSystemManaged<TransformContainerSystem>();
EntityManager entityManager = EntityManager;
EntityQuery posQuery = new EntityQueryBuilder(WorldUpdateAllocator).WithAllRW<Position>()
.WithAll<SyncPositionToEntity>()
.Build(entityManager);
RequireForUpdate(posQuery);
}
protected override void OnUpdate() {
Profiler.BeginSample("SyncPositionToEntitySystem::OnUpdate (Main Thread)");
_positions.Update(this);
_tagData.Update(this);
_syncPositionOffsets.Update(this);
var alignedEntities = _transformContainerSystem.AlignedEntities;
SyncPositionToEntityJob syncPosJob = new SyncPositionToEntityJob
{
Entities = alignedEntities,
TagData = _tagData,
Positions = _positions,
OffsetArray = _syncPositionOffsets
};
var trmArray = _transformContainerSystem.RefArray;
Dependency = syncPosJob.Schedule(trmArray, Dependency);
alignedEntities.Dispose(Dependency);
Profiler.EndSample();
}
[BurstCompile]
private struct SyncPositionToEntityJob : IJobParallelForTransform {
[ReadOnly]
public NativeArray<Entity> Entities;
[ReadOnly]
[NativeDisableParallelForRestriction]
public ComponentLookup<SyncPositionToEntity> TagData;
[ReadOnly]
[NativeDisableParallelForRestriction]
public ComponentLookup<SyncPositionOffset> OffsetArray;
[NativeDisableParallelForRestriction]
public ComponentLookup<Position> Positions;
public void Execute(int index, [ReadOnly] TransformAccess transform) {
Entity entity = Entities[index];
if (!TagData.HasComponent(entity)) return;
if (!Positions.TryGetComponent(entity, out Position data)) return;
data.Value = transform.position;
if (OffsetArray.TryGetComponent(entity, out SyncPositionOffset offset)) {
data.Value += offset.Value;
}
Positions[entity] = data;
}
}
}
}