Внутри OnSelectionChange()
внутри сценария EditorWindow:
Я хочу проверить, идентичен ли выбранный объект преобразованию одному из проверяемых преобразований. selections
это список test
это массив
Сначала я хочу проверить, совпадает ли одно из данных преобразования в text
с данными преобразования выбранного объекта. Затем в редакторе в иерархии я удаляю объект, и теперь это null
. Теперь selected
- это null
. Теперь я хочу проверить, что если объект null
, но также был идентичным в первой проверке, тогда установите флаг на true
, а если он не null
или не идентичен, установите флаг на false
.
private void OnSelectionChange()
{
selectionChanged = true;
var selections = Selection.objects.OfType<GameObject>().ToList();
var test = TransformSaver.LoadTransforms();
if (selections.Count > 0)
tempsel = selections;
if (tempsel.Count > 0)
{
for (int x = 0; x < tempsel.Count; x++)
{
for (int i = 0; i < test.Length; i++)
{
var selected = tempsel[x];
if (selected.transform.parent == test[i].parent &&
selected.transform.name == test[i].name &&
selected.transform.localPosition == test[i].pos &&
selected.transform.localRotation == test[i].rot &&
selected.transform.localScale == test[i].scale)
{
hasLoaded = true;
}
}
}
for (int y = 0; y < selections.Count; y++)
{
if (selections[y] == null && hasLoaded == true)
{
hasLoaded = false;
}
}
}
}
Следующим шагом является использование флага, чтобы решить, следует ли включить true или false кнопку внутри OnGUI:
private void Load()
{
if (selectionChanged)
{
if (hasLoaded == true)
{
GUI.enabled = true;
}
else
{
GUI.enabled = false;
}
}
if (GUILayout.Button("Load"))
{
TransformSaver.LoadTransform();
hasLoaded = false;
}
}
Но пока безуспешно.
Основная логика цели, как я понимаю, может быть, они должны быть другими, но вот как я объясняю, что я хочу сделать:
Для сравнения данных преобразований между выборками и проверкой.
Установите флаг в значение true, если данные идентифицируются в одном или нескольких объектах выборок по отношению к тестовому массиву.
Чтобы проверить, являются ли один или несколько объектов выборки нулевыми, и являются ли они нулевыми, проверьте, были ли они идентифицированы в первой проверке (1).
Если оба выбранных объекта один или несколько, а тест Преобразовывает данные, один или несколько идентифицируются, а также только в нулевое значение, тогда для другого флага устанавливается значение true.
Используйте новый флаг, если он равен true или false, чтобы решить, следует ли включить true / false, кнопка «Загрузить»
Последний класс TransformSaver, из которого тест получает массив данных Transforms: (У меня есть еще одна кнопка «Сохранить», которая сохраняет выборку объектов, а затем я использую LoadTransforms()
, чтобы вернуть массив данных сохраненных преобразований из Файл JSON)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine.SceneManagement;
public static class TransformSaver
{
[System.Serializable]
public class Transform
{
public string sceneName;
public string name;
public UnityEngine.Transform parent;
public Vector3 pos;
public Quaternion rot;
public Vector3 scale;
}
//Save Transform
public static void SaveTransform(UnityEngine.Transform[] tranformToSave)
{
Transform[] trnfrm = new Transform[tranformToSave.Length];
for (int i = 0; i < trnfrm.Length; i++)
{
trnfrm[i] = new Transform();
trnfrm[i].sceneName = tranformToSave[i].gameObject.scene.name;
trnfrm[i].name = tranformToSave[i].name;
trnfrm[i].parent = tranformToSave[i].parent;
trnfrm[i].pos = tranformToSave[i].localPosition;
trnfrm[i].rot = tranformToSave[i].localRotation;
trnfrm[i].scale = tranformToSave[i].localScale;
}
string jsonTransform = JsonHelper.ToJson(trnfrm, true);
//PlayerPrefs.SetString("transform", jsonTransform);
File.WriteAllText(@"d:\json\json.txt", jsonTransform);
}
public static Transform[] LoadTransforms()
{
string jsonTransform = File.ReadAllText(@"d:\json\json.txt");
if (jsonTransform == null)
{
return null;
}
Transform[] savedTransforms = JsonHelper.FromJson<Transform>(jsonTransform);
return savedTransforms;
}
}