using MalbersAnimations.Scriptables; using UnityEngine; namespace MalbersAnimations.Controller.AI { [CreateAssetMenu(menuName = "Malbers Animations/Pluggable AI/Decision/Check Scriptable Variable", order = 6)] public class CheckScriptableVar : MAIDecision { public override string DisplayName => "Variables/Check Scriptable Variable"; [Tooltip("Check on the Target or Self if it has a Listener Variable Component and compares it with the local variable)")] public VarType varType = VarType.Bool; [CreateScriptableAsset] public BoolVar Bool; [CreateScriptableAsset] public IntVar Int; [CreateScriptableAsset] public FloatVar Float; public ComparerInt compare; public bool boolValue = true; public int intValue = 0; public float floatValue = 0f; public override bool Decide(MAnimalBrain brain, int Index) { switch (varType) { case VarType.Bool: return Bool != null && Bool.Value == boolValue; case VarType.Int: return Int != null && CompareInteger(Int.Value); case VarType.Float: return Float != null && CompareFloat(Float.Value); default: return false; } } public enum VarType { Bool, Int, Float } public enum BoolType { True, False } public bool CompareInteger(int IntValue) { switch (compare) { case ComparerInt.Equal: return (IntValue == intValue); case ComparerInt.Greater: return (IntValue > intValue); case ComparerInt.Less: return (IntValue < intValue); case ComparerInt.NotEqual: return (IntValue != intValue); default: return false; } } public bool CompareFloat(float IntValue) { switch (compare) { case ComparerInt.Equal: return (IntValue == floatValue); case ComparerInt.Greater: return (IntValue > floatValue); case ComparerInt.Less: return (IntValue < floatValue); case ComparerInt.NotEqual: return (IntValue != floatValue); default: return false; } } #if UNITY_EDITOR [UnityEditor.CustomEditor(typeof(CheckScriptableVar)), UnityEditor.CanEditMultipleObjects] public class CheckScriptableVarEditor : MAIDecisionEditor { protected UnityEditor.SerializedProperty varType, Bool, Float, Int, boolValue, intValue, floatValue, compare; protected override void OnEnable() { base.OnEnable(); varType = serializedObject.FindProperty("varType"); Bool = serializedObject.FindProperty("Bool"); Float = serializedObject.FindProperty("Float"); Int = serializedObject.FindProperty("Int"); intValue = serializedObject.FindProperty("intValue"); floatValue = serializedObject.FindProperty("floatValue"); boolValue = serializedObject.FindProperty("boolValue"); compare = serializedObject.FindProperty("compare"); } public override void DecisionParameters() { //UnityEditor.EditorGUILayout.LabelField("Check Variable", UnityEditor.EditorStyles.boldLabel); UnityEditor.EditorGUILayout.PropertyField(varType, new GUIContent("Check Variable")); UnityEditor.EditorGUILayout.BeginHorizontal(); var LBW = UnityEditor.EditorGUIUtility.labelWidth; switch ((VarType)varType.intValue) { case VarType.Bool: UnityEditor.EditorGUILayout.PropertyField(Bool, GUIContent.none, GUILayout.Width(LBW)); var Ct = new GUIContent(boolValue.boolValue ? "Is True" : "Is False"); // UnityEditor.EditorGUILayout.LabelField(Ct, UnityEditor.EditorStyles.miniButton, GUILayout.MinWidth(50)); boolValue.boolValue = GUILayout.Toggle(boolValue.boolValue, Ct, UnityEditor.EditorStyles.miniButton); break; case VarType.Int: UnityEditor.EditorGUILayout.PropertyField(Int, GUIContent.none, GUILayout.Width(LBW)); UnityEditor.EditorGUILayout.PropertyField(compare, GUIContent.none, GUILayout.MinWidth(70)); UnityEditor.EditorGUILayout.PropertyField(intValue, GUIContent.none, GUILayout.MinWidth(20)); break; case VarType.Float: UnityEditor.EditorGUILayout.PropertyField(Float, GUIContent.none, GUILayout.Width(LBW)); UnityEditor.EditorGUILayout.PropertyField(compare, GUIContent.none, GUILayout.MinWidth(70)); UnityEditor.EditorGUILayout.PropertyField(floatValue, GUIContent.none, GUILayout.MinWidth(20)); break; default: break; } UnityEditor.EditorGUILayout.EndHorizontal(); } } #endif } }