#Stop LinkedEntityGroup from being added to prefabs
1 messages · Page 1 of 1 (latest)
if you don't want to make changes to the package, i have a post processing baking system to do this
https://gitlab.com/tertle/com.bovinelabs.core/-/blob/0.15.3/BovineLabs.Core.Authoring/Entities/RemoveLinkedEntityGroupSystem.cs
(That said I don't think this behaviour changed recently, it's existed since 1.0 was first released. I wrote this back in dec 2022 to solve the problem)
Hmm, because I remember that I didn't see it on my prefabs until today.
I only know about this because my DestroyEntitySystem complains about LinkedEntityGroup isnt included in the query.
But this system run fine just before today
🤷♂️ nothing has changed with the code
if you want to edit in the actual entities package
change
internal Entity CreateEntityForPrefab(GameObject prefab)
{
var instanceId = prefab.GetInstanceID();
var entity = CreateEntityForGameObject(prefab, 0, _DefaultArchetypePrefab, 0);
_GameObjectToEntity[instanceId] = entity;
// Make sure prefab root is dynamic
var counters = new TransformUsageFlagCounters();
counters.Add(TransformUsageFlags.Dynamic);
_ReferencedEntities.Add(entity, counters);
// Now register the Prefab for lazy baking
_AdditionalGameObjectsToBake.Add(instanceId);
// Add all children
var allTransforms = prefab.GetComponentsInChildren<Transform>(true);
var linkedEntityGroupArray = new NativeArray<LinkedEntityGroupBakingData>(allTransforms.Length, Allocator.Temp);
// Assign self to first position in linked entity group
linkedEntityGroupArray[0] = new LinkedEntityGroupBakingData {Value = entity};
for(int i = 1; i < allTransforms.Length; i++)
{
var childGameObject = allTransforms[i].gameObject;
var childEntity = CreateEntityForGameObject(childGameObject, 0, _DefaultArchetypePrefab, 0);
_GameObjectToEntity[childGameObject.GetInstanceID()] = childEntity;
linkedEntityGroupArray[i] = new LinkedEntityGroupBakingData {Value = childEntity};
}
var buffer = _EntityManager.AddBuffer<LinkedEntityGroupBakingData>(entity);
buffer.AddRange(linkedEntityGroupArray);
linkedEntityGroupArray.Dispose();
return entity;
}```
into
internal Entity CreateEntityForPrefab(GameObject prefab)
{
var instanceId = prefab.GetInstanceID();
var entity = CreateEntityForGameObject(prefab, 0, _DefaultArchetypePrefab, 0);
_GameObjectToEntity[instanceId] = entity;
// Make sure prefab root is dynamic
var counters = new TransformUsageFlagCounters();
counters.Add(TransformUsageFlags.Dynamic);
_ReferencedEntities.Add(entity, counters);
// Now register the Prefab for lazy baking
_AdditionalGameObjectsToBake.Add(instanceId);
// Add all children
var allTransforms = prefab.GetComponentsInChildren<Transform>(true);
if (allTransforms.Length > 1)
{
var linkedEntityGroupArray = new NativeArray<LinkedEntityGroupBakingData>(allTransforms.Length, Allocator.Temp);
// Assign self to first position in linked entity group
linkedEntityGroupArray[0] = new LinkedEntityGroupBakingData {Value = entity};
for(int i = 1; i < allTransforms.Length; i++)
{
var childGameObject = allTransforms[i].gameObject;
var childEntity = CreateEntityForGameObject(childGameObject, 0, _DefaultArchetypePrefab, 0);
_GameObjectToEntity[childGameObject.GetInstanceID()] = childEntity;
linkedEntityGroupArray[i] = new LinkedEntityGroupBakingData {Value = childEntity};
}
var buffer = _EntityManager.AddBuffer<LinkedEntityGroupBakingData>(entity);
buffer.AddRange(linkedEntityGroupArray);
linkedEntityGroupArray.Dispose();
}
return entity;
}```
but i personally prefer not to fork the entities package
Well thanks, I'm just expressing my confusion.
hence i just use my post processing baking system
but yeah, it's deliberate added but i strongly disagree with it
I can confirm, this behavior has been this way for a while (at least since early pre-releases).
My apologize, I might remember it incorrectly.
However the problem is still the same. LinkedEntityGroup takes a lot of space because there is no [InternalBufferCapacity(0)] defined.
Also it prevents entities from being destroyed by a query if it don't include the component.