Newer
Older
Dreamsturbia-Project-IADE-Unity3D / Assets / Scripts / AI / FSM / FiniteStateMachine.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. using UnityEngine.Animations;
  6. public class FiniteStateMachine : MonoBehaviour
  7. {
  8. public State initialState;
  9. public State currentState;
  10. public Transform target;
  11. public AnimationController animationController;
  12. private NavMeshAgentController agent;
  13. [HideInInspector]
  14. public Rigidbody rb;
  15. public DictionariesFSM<float> floatDictionary;
  16. public DictionariesFSM<MonoBehaviour> monoDictionary;
  17. public DictionariesFSM<Vector3> positionsDictionary;
  18. public DictionariesFSM<bool> booleanDictionary;
  19. private void Awake()
  20. {
  21. agent = GetComponent<NavMeshAgentController>();
  22. currentState = initialState;
  23. floatDictionary = new DictionariesFSM<float>();
  24. monoDictionary = new DictionariesFSM<MonoBehaviour>();
  25. positionsDictionary = new DictionariesFSM<Vector3>();
  26. booleanDictionary = new DictionariesFSM<bool>();
  27. rb = GetComponent<Rigidbody>();
  28. }
  29. private void Update()
  30. {
  31. if (currentState != null)
  32. {
  33. Transition selectedTransition = null;
  34. foreach (Transition transition in currentState.GetTransitions())
  35. {
  36. if (transition.IsTriggered(this))
  37. {
  38. if (selectedTransition == null)
  39. {
  40. selectedTransition = transition;
  41. }
  42. else
  43. {
  44. if (transition.weight > selectedTransition.weight)
  45. {
  46. selectedTransition = transition;
  47. }
  48. }
  49. }
  50. }
  51. List<Action> actions = new List<Action>();
  52. if (selectedTransition)
  53. {
  54. State targetState = selectedTransition.GetTargetState();
  55. actions.Add(currentState.GetExitAction());
  56. // actions.Add(triggeredTransition.GetAction());
  57. actions.Add(targetState.GetEntryAction());
  58. targetState.entryAction?.Act(this);
  59. currentState = targetState;
  60. }
  61. else
  62. {
  63. foreach (Action action in currentState.GetStateActions())
  64. {
  65. actions.Add(action);
  66. }
  67. }
  68. foreach (Action action in actions)
  69. {
  70. if (action)
  71. {
  72. action.Act(this);
  73. }
  74. }
  75. }
  76. }
  77. public NavMeshAgentController GetAgent()
  78. {
  79. return agent;
  80. }
  81. }