What's wrong with my MonoBehaviour Class Conversion ?

[DisallowMultipleComponent]
[RequiresEntityConversion]
public class RegionSharedComponentData : MonoBehaviour, IConvertGameObjectToEntity
{


    [System.Serializable]
    public struct Region : ISharedComponentData
    {
        public int2 value;
    }

   
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var Config = new Region
        {
            value = transform.position.ToRegionIndex()
        };
       // Debug.Log($"Region : X:{Config.value.x} Z: {Config.value.y}");
        dstManager.AddSharedComponentData(entity, Config);
    }
}

The Editor is not able to convert suscenes anymore (No more binaries Data Generated)

with Error:
ArgumentException: CWBR.ClientAndServer.Components.Region has no valid proxy shared component data. Please create one…
Unity.Entities.Serialization.SerializeUtilityHybrid.SerializeSharedComponents (Unity.Entities.EntityManager manager, System.Int32[ ] sharedComponentIndices) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Entities.Hybrid/HybridSerializeUtility.cs:57)
Unity.Entities.Serialization.SerializeUtilityHybrid.Serialize (Unity.Entities.EntityManager manager, Unity.Entities.Serialization.BinaryWriter writer, UnityEngine.GameObject& sharedData) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Entities.Hybrid/HybridSerializeUtility.cs:14)
Unity.Scenes.Editor.EditorEntityScenes.WriteEntityScene (Unity.Entities.EntityManager scene, Unity.Entities.Hash128 sceneGUID, System.String subsection, Unity.Collections.NativeArray`1[T] entityRemapInfos) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/EditorEntityScenes.cs:325)
Unity.Scenes.Editor.EditorEntityScenes.WriteEntityScene (UnityEngine.SceneManagement.Scene scene, Unity.Entities.Hash128 sceneGUID, Unity.Entities.GameObjectConversionUtility+ConversionFlags conversionFlags) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/EditorEntityScenes.cs:145)
Unity.Scenes.Editor.EditorEntityScenes.WriteEntityScene (Unity.Scenes.SubScene scene) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/EditorEntityScenes.cs:37)
Unity.Scenes.Editor.SubSceneInspectorUtility.RebuildEntityCache (Unity.Scenes.SubScene[ ] scenes) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/SubSceneInspectorUtility.cs:242)
UnityEngine.Debug:LogException(Exception)
Unity.Scenes.Editor.SubSceneInspectorUtility:RebuildEntityCache(SubScene[ ]) (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/SubSceneInspectorUtility.cs:247)
Unity.Scenes.Editor.SubSceneInspector:OnInspectorGUI() (at Library/PackageCache/com.unity.entities@0.0.12-preview.33/Unity.Scenes.Editor/SubSceneInspector.cs:85)
UnityEngine.GUIUtility:processEvent(Int32, IntPtr)

From memory scd requires you to set it up specifically between worlds.

Hi @tertle
Sorry im not getting what you mean ?

I don’t use scd so it’s been a while since i’ve had to deal with it.

But from memory serialization of shared components still requires a legacy SharedComponentDataProxy which is found via reflection.

Just look at the source code where your error occurred

                var proxyType = TypeUtility.GetProxyForDataType(sharedData.GetType());
                if (proxyType == null)
                    throw new ArgumentException($"{sharedData.GetType()} has no valid proxy shared component data. Please create one..");
public static Type GetProxyForDataType(Type componentDataType)
        {
            s_ErrorAssemblyNames.Clear();
            Type proxyType;
            if (!s_ComponentToProxy.TryGetValue(componentDataType, out proxyType))
            {
                foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (s_VisitedAssemblies.Contains(assembly))
                        continue;

                    try
                    {
                        foreach (var type in assembly.GetTypes())
                        {
                            if (!typeof(ComponentDataProxyBase).IsAssignableFrom(type) || type.IsAbstract)
                                continue;

                            var t = type;
                            while (t.BaseType != typeof(ComponentDataProxyBase))
                                t = t.BaseType;
                            s_ComponentToProxy[t.GetGenericArguments()[0]] = type;
                        }
                    }
                    catch (ReflectionTypeLoadException)
                    {
                        s_ErrorAssemblyNames.Add(assembly.GetName().Name);
                    }

                    s_VisitedAssemblies.Add(assembly);
                }

                s_ComponentToProxy.TryGetValue(componentDataType, out proxyType);
            }
            if (proxyType == null && s_ErrorAssemblyNames.Count > 0)
                Debug.LogWarning($"Found no Proxy class for {proxyType}, but was also unable to load the following assemblies, so it may be in one of them.\n- {string.Join("\n- ", s_ErrorAssemblyNames)}");

            return proxyType;
        }

This will obviously change at some point as ComponentDataProxyBase is depreciated.

1 Like

thank you!