From 448b5092206ccd9db760b00aeb9ab2233270bd6e Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Fri, 15 Dec 2023 17:55:59 +0000
Subject: [PATCH] Added damageable script + death animations

---
 Assets/Scripts/Damageable.cs.meta                       |   11 +
 Assets/Characters/Player/Player.prefab                  |   48 +---
 Assets/Scripts/PlayerController.cs                      |   44 ++--
 Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs.meta |   11 +
 Assets/Scripts/StateMachine/SetBoolBehaviour.cs.meta    |   11 +
 Assets/Scripts/Damageable.cs                            |   76 +++++++
 Assets/Characters/Player/AC_Player.controller           |  149 ++++++++++++++
 Assets/Characters/Player/player_death.anim              |   72 +++++++
 Assets/Scripts/StateMachine/SetBoolBehaviour.cs         |   61 ++++++
 Assets/Scripts/StateMachine.meta                        |    8 
 Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs      |   34 +++
 Assets/Characters/Player/player_death.anim.meta         |    8 
 Assets/Scripts/AnimationStrings.cs                      |   12 
 Assets/Scripts/TouchingDirections.cs                    |   12 
 14 files changed, 492 insertions(+), 65 deletions(-)

diff --git a/Assets/Characters/Player/AC_Player.controller b/Assets/Characters/Player/AC_Player.controller
index 964eb59..08682b6 100644
--- a/Assets/Characters/Player/AC_Player.controller
+++ b/Assets/Characters/Player/AC_Player.controller
@@ -25,6 +25,59 @@
   m_InterruptionSource: 1
   m_OrderedInterruption: 1
   m_CanTransitionToSelf: 1
+--- !u!1102 &-8776216366201631375
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: player_death
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours:
+  - {fileID: -2493127153716391096}
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: cec1a898bd6cf1f4f87968928d9016ea, type: 2}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &-8551537280866366805
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: player_hit
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 0}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
 --- !u!1107 &-8244801798701371434
 AnimatorStateMachine:
   serializedVersion: 6
@@ -43,12 +96,18 @@
   - serializedVersion: 1
     m_State: {fileID: 7984510369417086179}
     m_Position: {x: 620, y: 200, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -8776216366201631375}
+    m_Position: {x: 620, y: 300, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -8551537280866366805}
+    m_Position: {x: 620, y: 390, z: 0}
   m_ChildStateMachines: []
   m_AnyStateTransitions: []
   m_EntryTransitions: []
   m_StateMachineTransitions: {}
   m_StateMachineBehaviours: []
-  m_AnyStatePosition: {x: 50, y: 20, z: 0}
+  m_AnyStatePosition: {x: 400, y: 310, z: 0}
   m_EntryPosition: {x: 50, y: 120, z: 0}
   m_ExitPosition: {x: 880, y: 120, z: 0}
   m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
@@ -78,6 +137,32 @@
   m_InterruptionSource: 1
   m_OrderedInterruption: 1
   m_CanTransitionToSelf: 1
+--- !u!1102 &-7583940583200162132
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: player_death
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: cec1a898bd6cf1f4f87968928d9016ea, type: 2}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
 --- !u!1107 &-3544671305424738950
 AnimatorStateMachine:
   serializedVersion: 6
@@ -86,12 +171,16 @@
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: Base Layer
-  m_ChildStates: []
+  m_ChildStates:
+  - serializedVersion: 1
+    m_State: {fileID: -7583940583200162132}
+    m_Position: {x: 200, y: 0, z: 0}
   m_ChildStateMachines:
   - serializedVersion: 1
     m_StateMachine: {fileID: -8244801798701371434}
     m_Position: {x: 320, y: 110, z: 0}
-  m_AnyStateTransitions: []
+  m_AnyStateTransitions:
+  - {fileID: 7389560801624237999}
   m_EntryTransitions: []
   m_StateMachineTransitions: {}
   m_StateMachineBehaviours: []
@@ -100,6 +189,23 @@
   m_ExitPosition: {x: 800, y: 120, z: 0}
   m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
   m_DefaultState: {fileID: 68305137226140118}
+--- !u!114 &-2493127153716391096
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 40c71d8fcb09c1d4ba6bf7f07a33b574, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  boolName: CanMove
+  updateOnState: 1
+  updateOnStateMachine: 0
+  valueOnEnter: 0
+  valueOnExit: 0
 --- !u!1101 &-1567565794043545918
 AnimatorStateTransition:
   m_ObjectHideFlags: 1
@@ -166,6 +272,18 @@
     m_DefaultFloat: 0
     m_DefaultInt: 0
     m_DefaultBool: 0
+    m_Controller: {fileID: 0}
+  - m_Name: IsAlive
+    m_Type: 4
+    m_DefaultFloat: 0
+    m_DefaultInt: 0
+    m_DefaultBool: 1
+    m_Controller: {fileID: 0}
+  - m_Name: CanMove
+    m_Type: 4
+    m_DefaultFloat: 0
+    m_DefaultInt: 0
+    m_DefaultBool: 1
     m_Controller: {fileID: 0}
   m_AnimatorLayers:
   - serializedVersion: 5
@@ -317,6 +435,31 @@
   m_MirrorParameter: 
   m_CycleOffsetParameter: 
   m_TimeParameter: 
+--- !u!1101 &7389560801624237999
+AnimatorStateTransition:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: 
+  m_Conditions:
+  - m_ConditionMode: 2
+    m_ConditionEvent: IsAlive
+    m_EventTreshold: 0
+  m_DstStateMachine: {fileID: 0}
+  m_DstState: {fileID: -8776216366201631375}
+  m_Solo: 0
+  m_Mute: 0
+  m_IsExit: 0
+  serializedVersion: 3
+  m_TransitionDuration: 0
+  m_TransitionOffset: 0
+  m_ExitTime: 0.75
+  m_HasExitTime: 0
+  m_HasFixedDuration: 1
+  m_InterruptionSource: 0
+  m_OrderedInterruption: 1
+  m_CanTransitionToSelf: 0
 --- !u!1101 &7462440421188174382
 AnimatorStateTransition:
   m_ObjectHideFlags: 1
diff --git a/Assets/Characters/Player/Player.prefab b/Assets/Characters/Player/Player.prefab
index 6cad5be..67015b8 100644
--- a/Assets/Characters/Player/Player.prefab
+++ b/Assets/Characters/Player/Player.prefab
@@ -122,7 +122,7 @@
   - component: {fileID: 3884295854780712968}
   - component: {fileID: 2451348752795735853}
   - component: {fileID: 5338311196462064651}
-  - component: {fileID: 3829651782493779324}
+  - component: {fileID: 2350719025294399868}
   m_Layer: 0
   m_Name: Player
   m_TagString: Untagged
@@ -429,40 +429,26 @@
     minNormalAngle: 0
     maxNormalAngle: 0
   groundDistance: 0.05
+  wallDistance: 0.2
+  ceilingDistance: 0.05
   rotorGO: {fileID: 1519978218308964847}
   _isGrounded: 1
---- !u!70 &3829651782493779324
-CapsuleCollider2D:
+  _isAtWall: 0
+  _isAtCeiling: 0
+--- !u!114 &2350719025294399868
+MonoBehaviour:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3345854317100013954}
-  m_Enabled: 0
-  m_Density: 1
-  m_Material: {fileID: 0}
-  m_IncludeLayers:
-    serializedVersion: 2
-    m_Bits: 0
-  m_ExcludeLayers:
-    serializedVersion: 2
-    m_Bits: 0
-  m_LayerOverridePriority: 0
-  m_ForceSendLayers:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_ForceReceiveLayers:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_ContactCaptureLayers:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_CallbackLayers:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_IsTrigger: 0
-  m_UsedByEffector: 0
-  m_UsedByComposite: 0
-  m_Offset: {x: 0, y: 0}
-  m_Size: {x: 0.829981, y: 0.93356335}
-  m_Direction: 0
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 352737c44bb3905498d44716afca4984, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _maxHealth: 100
+  _health: 100
+  _isAlive: 1
+  isInvincible: 0
+  invincibilityTime: 0.25
diff --git a/Assets/Characters/Player/player_death.anim b/Assets/Characters/Player/player_death.anim
new file mode 100644
index 0000000..a1b4fd8
--- /dev/null
+++ b/Assets/Characters/Player/player_death.anim
@@ -0,0 +1,72 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: player_death
+  serializedVersion: 7
+  m_Legacy: 0
+  m_Compressed: 0
+  m_UseHighQualityCurve: 1
+  m_RotationCurves: []
+  m_CompressedRotationCurves: []
+  m_EulerCurves: []
+  m_PositionCurves: []
+  m_ScaleCurves: []
+  m_FloatCurves: []
+  m_PPtrCurves:
+  - serializedVersion: 2
+    curve:
+    - time: 0
+      value: {fileID: 21300000, guid: 3e7d7385969bceb428fecc1b6408737f, type: 3}
+    attribute: m_Sprite
+    path: 
+    classID: 212
+    script: {fileID: 0}
+    flags: 2
+  m_SampleRate: 1
+  m_WrapMode: 0
+  m_Bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 0, y: 0, z: 0}
+  m_ClipBindingConstant:
+    genericBindings:
+    - serializedVersion: 2
+      path: 0
+      attribute: 0
+      script: {fileID: 0}
+      typeID: 212
+      customType: 23
+      isPPtrCurve: 1
+      isIntCurve: 0
+      isSerializeReferenceCurve: 0
+    pptrCurveMapping:
+    - {fileID: 21300000, guid: 3e7d7385969bceb428fecc1b6408737f, type: 3}
+  m_AnimationClipSettings:
+    serializedVersion: 2
+    m_AdditiveReferencePoseClip: {fileID: 0}
+    m_AdditiveReferencePoseTime: 0
+    m_StartTime: 0
+    m_StopTime: 1
+    m_OrientationOffsetY: 0
+    m_Level: 0
+    m_CycleOffset: 0
+    m_HasAdditiveReferencePose: 0
+    m_LoopTime: 1
+    m_LoopBlend: 0
+    m_LoopBlendOrientation: 0
+    m_LoopBlendPositionY: 0
+    m_LoopBlendPositionXZ: 0
+    m_KeepOriginalOrientation: 0
+    m_KeepOriginalPositionY: 1
+    m_KeepOriginalPositionXZ: 0
+    m_HeightFromFeet: 0
+    m_Mirror: 0
+  m_EditorCurves: []
+  m_EulerEditorCurves: []
+  m_HasGenericRootTransform: 0
+  m_HasMotionFloatCurves: 0
+  m_Events: []
diff --git a/Assets/Characters/Player/player_death.anim.meta b/Assets/Characters/Player/player_death.anim.meta
new file mode 100644
index 0000000..197e845
--- /dev/null
+++ b/Assets/Characters/Player/player_death.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cec1a898bd6cf1f4f87968928d9016ea
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 7400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/AnimationStrings.cs b/Assets/Scripts/AnimationStrings.cs
index ba13bc5..07c2fe6 100644
--- a/Assets/Scripts/AnimationStrings.cs
+++ b/Assets/Scripts/AnimationStrings.cs
@@ -5,12 +5,14 @@
 {
     internal class Player
     {
-        internal static string IsMoving = "IsMoving";
-        internal static string IsFlying = "IsFlying";
+        internal static string isMoving = "IsMoving";
+        internal static string isFlying = "IsFlying";
 
-        internal static string IsGrounded = "IsGrounded";
+        internal static string isGrounded = "IsGrounded";
 
-        public static string IsAtWall = "IsAtWall";
-        public static string IsAtCeiling = "IsAtCeiling";
+        public static string isAtWall = "IsAtWall";
+        public static string isAtCeiling = "IsAtCeiling";
     }
+    public static string isAlive = "IsAlive";
+    public static string canMove = "CanMove";
 }
\ No newline at end of file
diff --git a/Assets/Scripts/Damageable.cs b/Assets/Scripts/Damageable.cs
new file mode 100644
index 0000000..7901a04
--- /dev/null
+++ b/Assets/Scripts/Damageable.cs
@@ -0,0 +1,76 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Damageable : MonoBehaviour
+{
+    Animator animator;
+
+    [SerializeField]
+    private int _maxHealth = 100;
+    [SerializeField]
+    private int _health;
+    [SerializeField]
+    private bool _isAlive = true;
+    [SerializeField]
+    private bool isInvincible = false;
+    private float timeSinceHit = 0f;
+    public float invincibilityTime = 0.25f;
+
+    public int MaxHealth
+    {
+        get { return _maxHealth; }
+        set { _maxHealth = value; }
+    }
+    public int Health
+    {
+        get { return _health; }
+        set
+        {
+            _health = value;
+            if (value <= 0)
+            {
+                IsAlive = false;
+            }
+        }
+    }
+    public bool IsAlive
+    {
+        get { return _isAlive; }
+        private set
+        {
+            _isAlive = value;
+            animator.SetBool(AnimationStrings.isAlive, value);
+        }
+    }
+
+    private void Awake()
+    {
+        Health = MaxHealth;
+        animator = GetComponent<Animator>();
+    }
+    private void Update()
+    {
+        if (isInvincible)
+        {
+            if (timeSinceHit > invincibilityTime)
+            {
+                isInvincible = false;
+                timeSinceHit = 0;
+            }
+            else
+            {
+                timeSinceHit += Time.deltaTime;
+            }
+        }
+    }
+
+    public void Hit(int damage)
+    {
+        if (IsAlive && !isInvincible)
+        {
+            Health -= damage;
+            isInvincible = true;
+        }
+    }
+}
diff --git a/Assets/Scripts/Damageable.cs.meta b/Assets/Scripts/Damageable.cs.meta
new file mode 100644
index 0000000..9dcab35
--- /dev/null
+++ b/Assets/Scripts/Damageable.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 352737c44bb3905498d44716afca4984
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs
index b2d1868..4bf68d8 100644
--- a/Assets/Scripts/PlayerController.cs
+++ b/Assets/Scripts/PlayerController.cs
@@ -24,7 +24,7 @@
         private set
         {
             _isMoving = value;
-            animator.SetBool(AnimationStrings.Player.IsMoving, value);
+            animator.SetBool(AnimationStrings.Player.isMoving, value);
         }
     }
 
@@ -36,8 +36,8 @@
         private set
         {
             _isFlying = value;
-            animator.SetBool(AnimationStrings.Player.IsFlying, value);
-            animator_rotor.SetBool(AnimationStrings.Player.IsFlying, value);
+            animator.SetBool(AnimationStrings.Player.isFlying, value);
+            animator_rotor.SetBool(AnimationStrings.Player.isFlying, value);
         }
     }
 
@@ -56,24 +56,20 @@
         }
     }
 
+    public bool CanMove { get
+        {
+            return animator.GetBool(AnimationStrings.canMove);
+        }
+    }
+
+
+
     private void Awake()
     {
         rb = GetComponent<Rigidbody2D>();
         animator = GetComponent<Animator>();
         animator_rotor = rotorGO.GetComponent<Animator>();
         touchingDirections = GetComponent<TouchingDirections>();
-    }
-
-    // Start is called before the first frame update
-    void Start()
-    {
-
-    }
-
-    // Update is called once per frame
-    void Update()
-    {
-
     }
 
     private void FixedUpdate()
@@ -108,14 +104,22 @@
 
     public void OnMove(InputAction.CallbackContext context)
     {
-        moveInput = context.ReadValue<Vector2>();
+        if (CanMove)
+        {
+            moveInput = context.ReadValue<Vector2>();
 
-        IsMoving = moveInput.x != 0;
+            IsMoving = moveInput.x != 0;
 
-        IsFlying = (moveInput.y != 0);
+            IsFlying = (moveInput.y != 0);
 
-        SetFacingDirection(moveInput);
-
+            SetFacingDirection(moveInput);
+        }
+        else
+        {
+            IsMoving = false;
+            IsFlying = false;
+            moveInput = Vector2.zero;
+        }
     }
 
     private void SetFacingDirection(Vector2 moveInput)
diff --git a/Assets/Scripts/StateMachine.meta b/Assets/Scripts/StateMachine.meta
new file mode 100644
index 0000000..100497b
--- /dev/null
+++ b/Assets/Scripts/StateMachine.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6e937e1d23a0607419018e509e82c4bf
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs b/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs
new file mode 100644
index 0000000..ad873db
--- /dev/null
+++ b/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs
@@ -0,0 +1,34 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class FadeRemoveBehaviour : StateMachineBehaviour
+{
+    public float fadeTime = 0.5f;
+    private float timeElapsed = 0;
+    SpriteRenderer spriteRenderer;
+    GameObject objToRemove;
+    Color startColor;
+    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
+    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    {
+        timeElapsed = 0f;
+        spriteRenderer = animator.GetComponent<SpriteRenderer>();
+        objToRemove = animator.gameObject;
+        startColor = spriteRenderer.color;
+
+    }
+
+    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
+    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    {
+        timeElapsed += Time.deltaTime;
+        float newAlpha = startColor.a * (1 - (timeElapsed / fadeTime));
+        spriteRenderer.color = new Color(startColor.r, startColor.g, startColor.b, newAlpha);
+
+        if (timeElapsed > fadeTime)
+        {
+            Destroy(objToRemove);
+        }
+    }
+}
diff --git a/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs.meta b/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs.meta
new file mode 100644
index 0000000..65be77b
--- /dev/null
+++ b/Assets/Scripts/StateMachine/FadeRemoveBehaviour.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 26345c45e327dbe46b644204cb0f8e5b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/StateMachine/SetBoolBehaviour.cs b/Assets/Scripts/StateMachine/SetBoolBehaviour.cs
new file mode 100644
index 0000000..979cc44
--- /dev/null
+++ b/Assets/Scripts/StateMachine/SetBoolBehaviour.cs
@@ -0,0 +1,61 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class SetBoolBehaviour : StateMachineBehaviour
+{
+    public string boolName;
+    public bool updateOnState;
+    public bool updateOnStateMachine;
+    public bool valueOnEnter, valueOnExit;
+
+    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
+    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    {
+        if(updateOnState)
+        {
+            animator.SetBool(boolName, valueOnEnter);
+        }
+    }
+
+    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
+    //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    //{
+    //    
+    //}
+
+    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
+    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    {
+        if (updateOnState)
+        {
+            animator.SetBool(boolName, valueOnExit);
+        }
+    }
+
+    // OnStateMove is called right after Animator.OnAnimatorMove()
+    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    //{
+    //    // Implement code that processes and affects root motion
+    //}
+
+    // OnStateIK is called right after Animator.OnAnimatorIK()
+    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
+    //{
+    //    // Implement code that sets up animation IK (inverse kinematics)
+    //}
+    public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
+    {
+        if (updateOnStateMachine)
+        {
+            animator.SetBool(boolName, valueOnEnter);
+        }
+    }
+    public override void OnStateMachineExit(Animator animator, int stateMachinePathHash)
+    {
+        if (updateOnStateMachine)
+        {
+            animator.SetBool(boolName, valueOnExit);
+        }
+    }
+}
diff --git a/Assets/Scripts/StateMachine/SetBoolBehaviour.cs.meta b/Assets/Scripts/StateMachine/SetBoolBehaviour.cs.meta
new file mode 100644
index 0000000..01f657a
--- /dev/null
+++ b/Assets/Scripts/StateMachine/SetBoolBehaviour.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 40c71d8fcb09c1d4ba6bf7f07a33b574
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/TouchingDirections.cs b/Assets/Scripts/TouchingDirections.cs
index 01e3ab7..4a26280 100644
--- a/Assets/Scripts/TouchingDirections.cs
+++ b/Assets/Scripts/TouchingDirections.cs
@@ -31,8 +31,8 @@
         set
         {
             _isGrounded = value;
-            animator.SetBool(AnimationStrings.Player.IsGrounded, value);
-            animator_rotor.SetBool(AnimationStrings.Player.IsGrounded, value);
+            animator.SetBool(AnimationStrings.Player.isGrounded, value);
+            animator_rotor.SetBool(AnimationStrings.Player.isGrounded, value);
         }
     }
 
@@ -45,8 +45,8 @@
         set
         {
             _isAtWall = value;
-            animator.SetBool(AnimationStrings.Player.IsAtWall, value);
-            animator_rotor.SetBool(AnimationStrings.Player.IsAtWall, value);
+            animator.SetBool(AnimationStrings.Player.isAtWall, value);
+            animator_rotor.SetBool(AnimationStrings.Player.isAtWall, value);
         }
     }
 
@@ -59,8 +59,8 @@
         set
         {
             _isAtCeiling = value;
-            animator.SetBool(AnimationStrings.Player.IsAtCeiling, value);
-            animator_rotor.SetBool(AnimationStrings.Player.IsAtCeiling, value);
+            animator.SetBool(AnimationStrings.Player.isAtCeiling, value);
+            animator_rotor.SetBool(AnimationStrings.Player.isAtCeiling, value);
         }
     }
 

--
Gitblit v1.9.3