Я разрабатываю инструмент редактора с открытым исходным кодом для 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
Unity3D MissingReferenceException при удалении BoxCollider ⇐ C#
Место общения программистов C#
-
Anonymous
1728676953
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 [b]вызывается только один раз[/b].
Также я проверил, что процесс создания с вызовом AddSelectionBox< /em>, он не происходит в момент нажатия кнопки финализации.
Поэтому, пожалуйста, мне нужна помощь в этом. Это ссылка на ветку разработки https://github.com/JAFS6/BoxStairsTool/tree/feature/BoxStairsTool. Здесь вы обнаружите, что вышеупомянутый метод [b]FinalizeStairs[/b] содержит код, который удаляет BoxStairs. только сценарий, и в этот момент он не выдает ошибок.
Любая идея или совет по этому поводу будет очень полезен. Заранее спасибо.
[b]Изменить:[/b]
Минимальный, полный и проверяемый пример:
[b]Asset/BoxStairs.cs[/b]
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;
}
}
}
[b]Asset\Editor\BoxStairsEditor.cs[/b]
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);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/40801369/unity3d-missingreferenceexception-when-removing-boxcollider[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия