Hi
I’ve stored the “MemberInfo” reflected value of a variable, and every time I try to set an object value to that variable, it just goes away, AND ONLY FOR THAT ONE SPECIFIC MOMENT. I have a Debug.Log that runs frequently to print out if the property “memberInfo” is null and NEVER does it say that memberInfo is null. Even after the SetValue method has been called, it’s still not null. I have absolutely no idea what is going on and it is driving me up the wall! NOWHERE does it say to set “memberInfo” to null.
Here’s some of my code:
The actual SetValue method.
public void SetValue(T value)
{
FieldInfo field = (FieldInfo)memberInfo;
field.SetValue(target, value);
m_currentValue = value;
}
The event that happens whenever I want to set the value.
void OnSetValue(UnityObject o)
{
SetValue(o);
}
Also, note that this is at runtime.
As I said, 0 clues what’s happening, and it’s driving me to the brink of insanity! ![]()
EDIT: Here’s a big wall of code with what I believe is important for this problem. It’s not 100% everything, but the other parts shouldn’t matter.
Code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
using UnityObject = UnityEngine.Object;
public class PropertyEditor : MonoBehaviour
{
[SerializeField]
protected Text m_label;
private bool m_lockValue;
protected bool lockValue { get { return m_lockValue; } }
protected object target { get; private set; }
private MemberInfo mi;
public MemberInfo memberInfo { get { return mi; } set { if (value == null) Debug.LogError("IT'S NULL!"); mi = value; } }
protected Type memberInfoType { get; set; }
private ALE_UI m_ui;
protected ALE_UI UI { get { if (m_ui == null) m_ui = FindObjectOfType<ALE_UI>();return m_ui; } }
private void Awake()
{
AwakeOverride();
}
private void Start()
{
StartOverride();
}
private void OnDestroy()
{
OnDestroyOverride();
}
protected virtual void AwakeOverride() { }
protected virtual void StartOverride() { }
protected virtual void OnDestroyOverride() { }
public void Init(object target, MemberInfo memberInfo, Type memberType, string label = null)
{
if(m_label) m_label.text = label;
InitOverride(target, memberInfo, memberType, label);
}
protected virtual void InitOverride(object target, MemberInfo memberInfo, Type memberType, string label = null)
{
if (target == null)
throw new ArgumentNullException("target");
this.target = target;
this.memberInfo = memberInfo;
memberInfoType = memberType;
}
}
public abstract class PropertyEditor<T> : PropertyEditor
{
protected T m_currentValue;
public void SetValue(T value)
{
if(memberInfo is PropertyInfo)
{
PropertyInfo prop = (PropertyInfo)memberInfo;
prop.SetValue(target, value, null);
}
else
{
FieldInfo field = (FieldInfo)memberInfo;
field.SetValue(target, value);
}
m_currentValue = value;
}
}
public class ObjectEditor : PropertyEditor<UnityObject>
{
[SerializeField]
private Button m_button;
[SerializeField]
private Text m_text;
protected override void AwakeOverride()
{
base.AwakeOverride();
m_button.onClick.AddListener(OnButtonClick);
UI.selectObjectWindow.onSelectItem.AddListener(OnSetValue);
}
void OnSetValue(UnityObject o)
{
SetValue(o);
}
protected override void OnDestroyOverride()
{
base.OnDestroyOverride();
UI.selectObjectWindow.onSelectItem.RemoveListener(SetValue);
}
private void OnButtonClick()
{
UI.selectObjectWindow.Show(memberInfoType, true, new Color(0, 0, 0, 0.5f));
}
}
public class ALE_SelectObjectWindow : ALE_Window<ALE_SelectObjectWindow>
{
[SerializeField]
private int m_limitBeforeSlowdown = 15;
[SerializeField]
private Button m_objectButton;
[SerializeField]
private Text m_header;
[SerializeField]
private InputField m_searchField;
[SerializeField]
private Button m_selectButton;
[SerializeField]
private Button m_cancelButton;
private int m_selectedItem;
private List<Button> m_buttons = new List<Button>();
private Type m_currentType;
private List<ALE_Object> m_objects = new List<ALE_Object>();
private List<UnityObject> m_unityObjects = new List<UnityObject>();
public class OnSelectItem : UnityEvent<UnityObject> { }
private OnSelectItem m_onSelectItem = new OnSelectItem();
public OnSelectItem onSelectItem { get { return m_onSelectItem; } set { m_onSelectItem = value; } }
private void Start()
{
m_searchField.onValueChanged.AddListener(OnSearch);
m_cancelButton.onClick.AddListener(Dismiss);
m_selectButton.onClick.AddListener(OnSelect);
}
private void OnSearch(string value)
{
if (!string.IsNullOrEmpty(value))
{
for (int i = 0; i < m_objects.Count; i++)
{
if (!m_objects[i].name.ToLower().Contains(value.ToLower()))
{
m_buttons[i].gameObject.SetActive(false);
}
else
{
m_buttons[i].gameObject.SetActive(true);
}
}
}
else
{
m_buttons.ForEach(b => b.gameObject.SetActive(true));
}
}
private void OnSelect()
{
Dismiss();
onSelectItem.Invoke(m_selectedItem == -1 ? null : m_unityObjects[m_selectedItem]);
}
public void Show(Type type)
{
Show();
Setup(type);
}
public void Show(Type type, bool dismissOnBackgroundClick)
{
Show(dismissOnBackgroundClick);
Setup(type);
}
public void Show(Type type, bool dismissOnBackgroundClick, Color backgroundColor)
{
Show(dismissOnBackgroundClick, backgroundColor);
Setup(type);
}
void Setup(Type type)
{
m_selectedItem = -1;
m_unityObjects.Clear();
m_searchField.text = "";
m_currentType = type;
m_header.text = "Select " + type.Name;
m_objectButton.gameObject.SetActive(false);
for (int i = 0; i < m_buttons.Count; i++)
{
Destroy(m_buttons[i].gameObject);
}
m_buttons.Clear();
Component[] rawObjects = FindObjectsOfType(m_currentType) as Component[];
m_objects = new List<ALE_Object>();
//m_unityObjects.ForEach(o => Debug.Log(o.name));
for (int i = 0; i < rawObjects.Length; i++)
{
GameObject go = rawObjects[i].gameObject;
ALE_Object aleObj = go.GetComponent<ALE_Object>();
if (aleObj != null)
{
m_objects.Add(aleObj);
m_unityObjects.Add(go);
}
}
if (m_objects.Count > m_limitBeforeSlowdown)
{
StartCoroutine(SlowButtonCreation(m_objects.ToArray()));
}
else
{
for (int i = 0; i < m_objects.Count; i++)
{
int index = i;
CreateButton(index, m_objects[i].name);
}
}
}
IEnumerator SlowButtonCreation(ALE_Object[] objects)
{
for (int i = 0; i < objects.Length; i++)
{
int index = i;
CreateButton(index, objects[i].name);
yield return new WaitForEndOfFrame();
}
}
void OnClick(int index)
{
if (m_selectedItem != -1 && m_buttons[m_selectedItem])
m_buttons[m_selectedItem].interactable = true;
m_selectedItem = index;
m_buttons[m_selectedItem].interactable = false;
}
void CreateButton(int index, string name)
{
Button newButton = Instantiate(m_objectButton, m_objectButton.transform.parent);
newButton.GetComponentInChildren<Text>().text = name;
newButton.onClick.AddListener(delegate { OnClick(index); });
newButton.gameObject.SetActive(true);
m_buttons.Add(newButton);
}
}