Fix Missing Script replacing in prefab

#1995
This commit is contained in:
Wojtek Figat
2024-02-26 20:34:59 +01:00
parent 2f87b87b45
commit 2d5d001a44

View File

@@ -67,25 +67,6 @@ public class MissingScriptEditor : GenericEditor
base.Initialize(layout);
}
private void FindActorsWithMatchingMissingScript(List<MissingScript> missingScripts)
{
foreach (Actor actor in Level.GetActors(typeof(Actor)))
{
for (int scriptIndex = 0; scriptIndex < actor.ScriptsCount; scriptIndex++)
{
Script actorScript = actor.Scripts[scriptIndex];
if (actorScript is not MissingScript missingActorScript)
continue;
MissingScript currentMissing = Values[0] as MissingScript;
if (missingActorScript.MissingTypeName != currentMissing.MissingTypeName)
continue;
missingScripts.Add(missingActorScript);
}
}
}
private void RunReplacementMultiCast(List<IUndoAction> actions)
{
if (actions.Count == 0)
@@ -104,16 +85,54 @@ public class MissingScriptEditor : GenericEditor
}
}
private void ReplaceScript(ScriptType script, bool replaceAllInScene)
private void GetMissingScripts(Actor actor, string currentMissingTypeName, List<MissingScript> missingScripts)
{
var actions = new List<IUndoAction>(4);
// Iterate over the scripts of this actor
for (int i = 0; i < actor.ScriptsCount; i++)
{
if (actor.GetScript(i) is MissingScript otherMissing &&
otherMissing.MissingTypeName == currentMissingTypeName)
{
missingScripts.Add(otherMissing);
}
}
// Iterate over this actor children (recursive)
for (int i = 0; i < actor.ChildrenCount; i++)
{
GetMissingScripts(actor.GetChild(i), currentMissingTypeName, missingScripts);
}
}
private void ReplaceScript(ScriptType script)
{
var missingScripts = new List<MissingScript>();
if (!replaceAllInScene)
missingScripts.Add((MissingScript)Values[0]);
var currentMissing = (MissingScript)Values[0];
var currentMissingTypeName = currentMissing.MissingTypeName;
if (_shouldReplaceAllCheckbox.Checked)
{
if (currentMissing.Scene == null && currentMissing.Actor != null)
{
// Find all missing scripts in prefab instance
GetMissingScripts(currentMissing.Actor.GetPrefabRoot(), currentMissingTypeName, missingScripts);
}
else
{
// Find all missing scripts in all loaded levels that match this type
for (int i = 0; i < Level.ScenesCount; i++)
{
GetMissingScripts(Level.GetScene(i), currentMissingTypeName, missingScripts);
}
}
}
else
FindActorsWithMatchingMissingScript(missingScripts);
{
// Use the current instance only
foreach (var value in Values)
missingScripts.Add((MissingScript)value);
}
var actions = new List<IUndoAction>(4);
foreach (var missingScript in missingScripts)
actions.Add(AddRemoveScript.Add(missingScript.Actor, script));
RunReplacementMultiCast(actions);
@@ -149,7 +168,7 @@ public class MissingScriptEditor : GenericEditor
var cm = new ItemsListContextMenu(180);
for (int i = 0; i < scripts.Count; i++)
cm.AddItem(new TypeSearchPopup.TypeItemView(scripts[i]));
cm.ItemClicked += item => ReplaceScript((ScriptType)item.Tag, _shouldReplaceAllCheckbox.Checked);
cm.ItemClicked += item => ReplaceScript((ScriptType)item.Tag);
cm.SortItems();
cm.Show(_dropPanel, _replaceScriptButton.BottomLeft - new Float2((cm.Width - _replaceScriptButton.Width) / 2, 0));
}