Изменения положения ручки сбрасываются при воспроизведении - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу создать ProbeManager, где я могу перемещаться по зондам, используя Handles.Вот мой MonoBehaviour и его Custom Editor:

MonoBehaviour:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class ProbeManager : MonoBehaviour
{
    public Probe[] probes;

    [System.Serializable]
    public class Probe
    {
        public Vector3 pos;
        public float radius;
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.white;
        for (int i = 0; i < probes.Length; i++)
        {
            Probe probe = probes[i];
            Gizmos.DrawWireSphere(probe.pos, probe.radius);
        }
    }
}

Пользовательский редактор:

using UnityEngine;
using UnityEditor;
using System;

[CustomEditor(typeof(ProbeManager))]
public class ProbeManagerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
    }

    protected virtual void OnSceneGUI()
    {
        ProbeManager probe_manager = (ProbeManager)target;

        EditorGUI.BeginChangeCheck();

        for (int i = 0; i < probe_manager.probes.Length; i++)
        {
            probe_manager.probes[i].pos = Handles.PositionHandle(probe_manager.probes[i].pos, Quaternion.identity);
        }

        EditorGUI.EndChangeCheck();
    }

}

Проблема заключается в том, что при смене зондовСвойства, будь то radius или position - Инспектор , работает нормально.Но когда я пытаюсь переместить их с помощью Дескрипторы , они телепортируются обратно в предыдущую позицию после того, как я нажму Play.

Я подозреваю, что это как-то связано с сериализацией, но это так :(

1 Ответ

0 голосов
/ 21 апреля 2019

Я должен был сделать это через serializedObject:

using UnityEngine;
using UnityEditor;
using System;
[CustomEditor(typeof(ProbeManager))]
public class ProbeManagerEditor : Editor
{
    SerializedProperty probes_prop;
    private void OnEnable()
    {
        probes_prop = serializedObject.FindProperty("probes");
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
    }

    protected virtual void OnSceneGUI()
    {
        ProbeManager probe_manager = (ProbeManager)target;

        for (int i = 0; i < probe_manager.probes.Length; i++)
        {
            EditorGUI.BeginChangeCheck();
            Vector3 position = Handles.PositionHandle(probe_manager.probes[i].pos, Quaternion.identity);

            SerializedProperty probe = probes_prop.GetArrayElementAtIndex(i);
            SerializedProperty probe_pos = probe.FindPropertyRelative("pos");
            if (EditorGUI.EndChangeCheck() == true)
            {
                probe_pos.vector3Value = position;
                serializedObject.ApplyModifiedProperties();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...