Assign WeakReferences inside the Editor

has anyone found a good method to assign WeakReferences inside the editor?

the unity manual example does not work: Weakly reference an object | Entities | 1.0.16

the inspector just shows “No GUI Implemented” and i already tried to do a custom implementation without luck.

Thanks!

turned out the example works, it was just the naughty attributes package that interfered

convenient but actually naughty :smiley:

Did you have any luck with weak entity reference?

far from optimal current solution

using Unity.Collections;
using Unity.Entities;
using Unity.Entities.Content;
using UnityEngine;

public partial class MaterialReferenceSystem : SystemBase
{
    public NativeArray<WeakObjectReference<Material>> MaterialArray;
    public Material[] LoadedMaterials;

    private bool _finishedLoading = false;

    public Entity MaterialReferenceEntity;

    protected override void OnCreate()
    {
        MaterialReferenceEntity = EntityManager.CreateEntity();
        EntityManager.SetName(MaterialReferenceEntity, "MaterialReferenceEntity");

        EntityManager.AddSharedComponentManaged(MaterialReferenceEntity, new MaterialsSharedComponent
        {
            Materials = new Material[System.Enum.GetValues(typeof(TileMaterialType)).Length]
        });

        MaterialArray = new NativeArray<WeakObjectReference<Material>>(System.Enum.GetValues(typeof(TileMaterialType)).Length, Allocator.Persistent);
        LoadedMaterials = new Material[System.Enum.GetValues(typeof(TileMaterialType)).Length];

        var materialMappingData = Resources.Load<MaterialMapping>("ScriptableObjects/TileMaterialMappings");

        if (materialMappingData != null)
        {
            for (int i = 0; i < materialMappingData.Materials.Length; i++)
            {
                MaterialArray[i] = materialMappingData.Materials[i];
                MaterialArray[i].LoadAsync();
            }
        }
        else
        {
            Debug.LogWarning("MaterialMappingData not found in Resources folder.");
        }
    }

    protected override void OnDestroy()
    {
        MaterialArray.Dispose();
    }

    protected override void OnUpdate()
    {
        if(_finishedLoading)
        {
            return;    
        }
        _finishedLoading = true;
        for (int i = 0; i < MaterialArray.Length; i++)
        {
            if (MaterialArray[i].LoadingStatus == ObjectLoadingStatus.Completed)
            {
                LoadedMaterials[i] = MaterialArray[i].Result;
            }
            else
            {
                _finishedLoading = false;
            }
        }
        if (_finishedLoading)
        {
            EntityManager.SetSharedComponentManaged(MaterialReferenceEntity, new MaterialsSharedComponent
            {
                Materials = LoadedMaterials
            });
            LoadedMaterials = null;
        }
    }
}

the ScriptiableObject materials are assigned “blind” in an array, tried a whole day to find a solution with an enum named array, but no luck.

Still hoping that someone finds a better solution :slight_smile: