Unity3D MissingReferenceException при удалении BoxColliderC#

Место общения программистов C#
Ответить
Anonymous
 Unity3D MissingReferenceException при удалении BoxCollider

Сообщение Anonymous »

Я разрабатываю инструмент редактора с открытым исходным кодом для Unity3D https://github.com/JAFS6/BoxStairsTool и пишу CustomEditor.
Я создаю основной GameObject и Я прикрепляю к нему свой скрипт BoxStairs. Этот скрипт прикрепляет к тому же GameObject BoxCollider.
В моем коде CustomEditor у меня есть метод, который отвечает за удаление обоих двух компонентов, прикрепленных перед завершением редактирования.
Это код:
private void FinalizeStairs ()
{
Undo.SetCurrentGroupName("Finalize stairs");
BoxStairs script = (BoxStairs)target;
GameObject go = script.gameObject;
BoxCollider bc = go.GetComponent();

if (bc != null)
{
Undo.DestroyObjectImmediate(bc);
}
Undo.DestroyObjectImmediate(target);
}

Этот метод вызывается в методе OnInspectorGUI после нажатия кнопки
public override void OnInspectorGUI ()
{
...
if (GUILayout.Button("Finalize stairs"))
{
FinalizeStairs();
}
}

Оба метода относятся к классу
[CustomEditor(typeof(BoxStairs))]
public sealed class BoxStairsEditor : Editor

Фактически удаляются два компонента, но после удаления BoxCollider появляется следующая ошибка:

MissingReferenceException: объект типа BoxCollider был уничтожен, но вы все еще пытаетесь получить к нему доступ.

Я пытался найти, где ошибка возникает при просмотре трассировки:
Your script should either check if it is null or you should not destroy the object.
UnityEditor.Editor.IsEnabled () (at C:/buildslave/unity/build/Editor/Mono/Inspector/Editor.cs:590)
UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1154)
UnityEditor.InspectorWindow.DrawEditors (UnityEditor.Editor[] editors) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1030)
UnityEditor.InspectorWindow.OnGUI () (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:352)
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

Но ни один из моих скриптов там не отображается.
Я просматривал код, в котором я ссылаюсь на BoxCollider< /em> и единственное место — это место, где он создается, когда создается лестница, которая срабатывает после изменения в инспекторе.
Он находится в классе:
[ExecuteInEditMode]
[SelectionBase]
public sealed class BoxStairs : MonoBehaviour

Это код:
/*
* This method creates a disabled BoxCollider which marks the volume defined by
* StairsWidth, StairsHeight, StairsDepth.
*/
private void AddSelectionBox ()
{
BoxCollider VolumeBox = Root.GetComponent();

if (VolumeBox == null)
{
VolumeBox = Root.AddComponent();
}

if (Pivot == PivotType.Downstairs)
{
VolumeBox.center = new Vector3(0, StairsHeight * 0.5f, StairsDepth * 0.5f);
}
else
{
VolumeBox.center = new Vector3(0, -StairsHeight * 0.5f, -StairsDepth * 0.5f);
}

VolumeBox.size = new Vector3(StairsWidth, StairsHeight, StairsDepth);

VolumeBox.enabled = false;
}

Я пытался прокомментировать тело этого метода, чтобы разрешить удаление BoxCollider без этой «ссылки», но ошибка все равно появляется, так что, я думаю, этот метод это не проблема.
Кроме того, я удалил BoxCollider вручную, не нажимая кнопку Finalize для запуска этого кода, щелкнув правой кнопкой мыши компонент на инспектор «Удалить компонент», и ошибка не появляется, после этого нажмите «Завершить лестницу», и проблем не возникнет.
Как упоминал @JoeBlow в комментариях, я проверил, что < Strong>Метод FinalizeStairs вызывается только один раз.
Также я проверил, что процесс создания с вызовом AddSelectionBox< /em>, он не происходит в момент нажатия кнопки финализации.
Поэтому, пожалуйста, мне нужна помощь в этом. Это ссылка на ветку разработки https://github.com/JAFS6/BoxStairsTool/ ... StairsTool. Здесь вы обнаружите, что вышеупомянутый метод FinalizeStairs содержит код, который удаляет BoxStairs. только сценарий, и в этот момент он не выдает ошибок.
Любая идея или совет по этому поводу будет очень полезен. Заранее спасибо.
Изменить:
Минимальный, полный и проверяемый пример:
Asset/BoxStairs.cs
using UnityEngine;
using System.Collections.Generic;

namespace BoxStairsTool
{
[ExecuteInEditMode]
[SelectionBase]
public sealed class BoxStairs : MonoBehaviour
{
private GameObject Root;

private void Start ()
{
Root = this.gameObject;
this.AddSelectionBox();
}

private void AddSelectionBox()
{
BoxCollider VolumeBox = Root.GetComponent();

if (VolumeBox == null)
{
VolumeBox = Root.AddComponent();
}

VolumeBox.size = new Vector3(20, 20, 20);

VolumeBox.enabled = false;
}

}
}

Asset\Editor\BoxStairsEditor.cs
using UnityEngine;
using UnityEditor;

namespace BoxStairsTool
{
[CustomEditor(typeof(BoxStairs))]
public sealed class BoxStairsEditor : Editor
{
private const string DefaultName = "BoxStairs";

[MenuItem("GameObject/3D Object/BoxStairs")]
private static void CreateBoxStairsGO ()
{
GameObject BoxStairs = new GameObject(DefaultName);
BoxStairs.AddComponent();

if (Selection.transforms.Length == 1)
{
BoxStairs.transform.SetParent(Selection.transforms[0]);
BoxStairs.transform.localPosition = new Vector3(0,0,0);
}

Selection.activeGameObject = BoxStairs;
Undo.RegisterCreatedObjectUndo(BoxStairs, "Create BoxStairs");
}

public override void OnInspectorGUI ()
{
if (GUILayout.Button("Finalize stairs"))
{
FinalizeStairs();
}
}

private void FinalizeStairs ()
{
Undo.SetCurrentGroupName("Finalize stairs");
BoxStairs script = (BoxStairs)target;
GameObject go = script.gameObject;
BoxCollider bc = go.GetComponent();

if (bc != null)
{
Undo.DestroyObjectImmediate(bc);
}
Undo.DestroyObjectImmediate(target);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/408 ... oxcollider
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»