So i understand your not suppose to modify values directly, but in this case i need to. im using a bitfield for memory efficient bool storage, and i need to edit every value individually without doing bitmath for 2^32
I just assume im using the wrong method, but i dont know what im suppose to call.
using System;
using System.Collections;
using Unity.Collections;
using UnityEngine;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
[CustomEditor(typeof(GroundTile))]
public class GroundTileEditor : Editor
{
SerializedProperty sprite;
public void OnEnable()
{
sprite = serializedObject.FindProperty("sprite");
Debug.Log(((GroundTile)target).data.Value);
}
public override void OnInspectorGUI()
{
serializedObject.Update();
BitField32 bits = ((GroundTile)target).data;
EditorGUI.BeginChangeCheck();
var nwMoveX = bits.IsSet(0);
var nwMoveY = bits.IsSet(1);
var nwMoveZ = bits.IsSet(2);
var nwUp = bits.IsSet(3);
var neMoveX = bits.IsSet(4);
var neMoveY = bits.IsSet(5);
var neMoveZ = bits.IsSet(6);
var neUp = bits.IsSet(7);
var swMoveX = bits.IsSet(8);
var swMoveY = bits.IsSet(9);
var swMoveZ = bits.IsSet(10);
var swUp = bits.IsSet(11);
var seMoveX = bits.IsSet(12);
var seMoveY = bits.IsSet(13);
var seMoveZ = bits.IsSet(14);
var seUp = bits.IsSet(15);
var isNWValid = bits.IsSet(16);
var isNEValid = bits.IsSet(17);
var isSWValid = bits.IsSet(18);
var isSEValid = bits.IsSet(19);
var unmountedMovementCost = bits.GetBits(20, 3);
var mountedMovementCost = bits.GetBits(23, 3);
if (isNWValid = EditorGUILayout.Foldout(isNWValid,"NorthWest Valid?"))
{
EditorGUI.indentLevel++;
nwMoveX = EditorGUILayout.Toggle("Move Along X?",nwMoveX);
nwMoveY= EditorGUILayout.Toggle("Move Along Y?",nwMoveY);
nwMoveZ = EditorGUILayout.Toggle("Move Along Z?", nwMoveZ);
nwUp = EditorGUILayout.Toggle("True for Up", nwUp);
EditorGUI.indentLevel--;
}
if (isNEValid = EditorGUILayout.Foldout(isNEValid, "NorthEast Valid?"))
{
EditorGUI.indentLevel++;
neMoveX = EditorGUILayout.Toggle("Move Along X?", neMoveX);
neMoveY = EditorGUILayout.Toggle("Move Along Y?", neMoveY);
neMoveZ = EditorGUILayout.Toggle("Move Along Z?", neMoveZ);
neUp = EditorGUILayout.Toggle("True for Up", neUp);
EditorGUI.indentLevel--;
}
if (isSWValid = EditorGUILayout.Foldout(isSWValid, "SouthEast Valid?"))
{
EditorGUI.indentLevel++;
seMoveX = EditorGUILayout.Toggle("Move Along X?", seMoveX);
seMoveY = EditorGUILayout.Toggle("Move Along Y?", seMoveY);
seMoveZ = EditorGUILayout.Toggle("Move Along Z?", seMoveZ);
seUp = EditorGUILayout.Toggle("True for Up", seUp);
EditorGUI.indentLevel--;
}
if (isSEValid = EditorGUILayout.Foldout(isSEValid, "SouthWest Valid?"))
{
EditorGUI.indentLevel++;
swMoveX = EditorGUILayout.Toggle("Move Along X?", swMoveX);
swMoveY = EditorGUILayout.Toggle("Move Along Y?", swMoveY);
swMoveZ = EditorGUILayout.Toggle("Move Along Z?", swMoveZ);
swUp = EditorGUILayout.Toggle("True for Up", swUp);
EditorGUI.indentLevel--;
}
EditorGUILayout.LabelField("Movement Costs");
EditorGUI.indentLevel++;
unmountedMovementCost = (uint)EditorGUILayout.IntSlider("On Foot",(int)unmountedMovementCost, 0, 7);
mountedMovementCost = (uint)EditorGUILayout.IntSlider("Mounted",(int)mountedMovementCost, 0, 7);
EditorGUI.indentLevel--;
EditorGUILayout.PropertyField(sprite);
bits.SetBits(0,nwMoveX);
bits.SetBits(1, nwMoveY);
bits.SetBits(2, nwMoveZ);
bits.SetBits(3, nwUp);
bits.SetBits(4, neMoveX);
bits.SetBits(5, neMoveY);
bits.SetBits(6, neMoveZ);
bits.SetBits(7, neUp);
bits.SetBits(8, swMoveX);
bits.SetBits(9, swMoveY);
bits.SetBits(10, swMoveZ);
bits.SetBits(11, swUp);
bits.SetBits(12, seMoveX);
bits.SetBits(13, seMoveY);
bits.SetBits(14, seMoveZ);
bits.SetBits(15, seUp);
bits.SetBits(16, isNWValid);
bits.SetBits(17, isNEValid);
bits.SetBits(18, isSWValid);
bits.SetBits(19, isSEValid);
//Black Magic
var bit1 = (unmountedMovementCost & (1 << 1 - 1)) != 0;
var bit2 = (unmountedMovementCost & (1 << 2 - 1)) != 0;
var bit3 = (unmountedMovementCost & (1 << 3 - 1)) != 0;
bits.SetBits(20, bit1);
bits.SetBits(21, bit2);
bits.SetBits(22, bit3);
bit1 = (mountedMovementCost & (1 << 1 - 1)) != 0;
bit2 = (mountedMovementCost & (1 << 2 - 1)) != 0;
bit3 = (mountedMovementCost & (1 << 3 - 1)) != 0;
bits.SetBits(23, bit1);
bits.SetBits(24, bit2);
bits.SetBits(25, bit3);
if (((GroundTile)target).data.Value != bits.Value)
{
((GroundTile)target).data = bits;
Undo.RecordObject(target,"Changed Tile Properties");
}
EditorUtility.SetDirty(target);
EditorGUI.EndChangeCheck();
serializedObject.ApplyModifiedProperties();
}
}