Они не одинаковы, потому что !=
в C #, используемом между двумя ссылочными типами, у которых не перегружен оператор равенства, будет выполнять сравнение ссылок. Это означает, что он проверит, ссылается ли переменная на тот же экземпляр базового объекта. Так что prefab != selectedObject
будет только оценивать как ложное, если prefab и selectedObject - это один и тот же экземпляр объекта (iirc проверяет идентификатор объекта на равенство).
Насколько я понимаю, вы хотите, чтобы оно оценивалось как false и, следовательно, активировало кнопку тогда и только тогда, когда выбранные объекты не являются клонами префабов. К счастью, в Unity3D есть способ определить, создан ли GameObject из определенного префаба. Это называется PrefabUtility
.GetCorrespondingObjectFromSource . Так что это может соответствовать вашим требованиям:
Изменить эту часть:
for (var i = selection.Count - 1; i >= 0; --i)
{
selectedObject = selection[i];
if (prefab != null && selection.Count > 0
&& prefab != selectedObject)
GUI.enabled = true;
}
К этому:
for (var i = selection.Count - 1; i >= 0; --i)
{
var selectedObject = selection[i];
if (prefab != null && selection.Count > 0
&& prefab != PrefabUtility
.GetCorrespondingObjectFromSource(selectedObject))
GUI.enabled = true;
}