Unity 2018.4.4f1
Addressables 1.1.5
Remove an entry in a group causes the following exception:
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.AddressableAssets.GUI.AddressableAssetEntryTreeView.RemoveEntry (System.Object context) (at Library/PackageCache/com.unity.addressables@1.1.5/Editor/GUI/AddressableAssetsSettingsGroupTreeView.cs:904)
UnityEditor.GenericMenu.CatchMenu (System.Object userData, System.String[] options, System.Int32 selected) (at /Users/builduser/buildslave/unity/build/Editor/Mono/GUI/GenericMenu.cs:119)
The culprit is this function, I’m guessing item.entry.parentGroup gets GC:
protected void RemoveEntry(object context)
{
if (EditorUtility.DisplayDialog("Delete selected entries?", "Are you sure you want to delete the selected entries?\n\nYou cannot undo this action.", "Yes", "No"))
{
List<AssetEntryTreeViewItem> selectedNodes = context as List<AssetEntryTreeViewItem>;
if (selectedNodes == null || selectedNodes.Count < 1)
return;
var entries = new List<AddressableAssetEntry>();
HashSet<AddressableAssetGroup> modifiedGroups = new HashSet<AddressableAssetGroup>();
foreach (var item in selectedNodes)
{
if (item.entry != null)
{
//important part here
m_Editor.settings.RemoveAssetEntry(item.entry.guid, false);
entries.Add(item.entry);
modifiedGroups.Add(item.entry.parentGroup);
}
}
foreach (var g in modifiedGroups)
g.SetDirty(AddressableAssetSettings.ModificationEvent.EntryModified, entries, false, true);
m_Editor.settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryRemoved, entries, true, false);
}
}
Changing to this fixes it.
[code=CSharp] protected void RemoveEntry(object context)
{
if (EditorUtility.DisplayDialog("Delete selected entries?", "Are you sure you want to delete the selected entries?\n\nYou cannot undo this action.", "Yes", "No"))
{
List<AssetEntryTreeViewItem> selectedNodes = context as List<AssetEntryTreeViewItem>;
if (selectedNodes == null || selectedNodes.Count < 1)
return;
var entries = new List<AddressableAssetEntry>();
HashSet<AddressableAssetGroup> modifiedGroups = new HashSet<AddressableAssetGroup>();
foreach (var item in selectedNodes)
{
if (item.entry != null)
{
//important part here
entries.Add(item.entry);
modifiedGroups.Add(item.entry.parentGroup);
m_Editor.settings.RemoveAssetEntry(item.entry.guid, false);
}
}
foreach (var g in modifiedGroups)
g.SetDirty(AddressableAssetSettings.ModificationEvent.EntryModified, entries, false, true);
m_Editor.settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryRemoved, entries, true, false);
}
}
I just replicated it with an empty project.