using UnityEngine; /// . /// (disabled) Inspector'. public abstract class Transition : MonoBehaviour { /// ( ). /// Inspector'. [SerializeField] State targetState; /// . /// State . public State TargetState { get { return targetState; } } /// , /// true. /// State. public bool NeedTransit { get; protected set; } }
using UnityEngine; using System.Collections.Generic; /// . /// (disabled) Inspector'. public abstract class State : MonoBehaviour { /// . /// Inspector'. [SerializeField, Tooltip("List of transitions from this state.")] List<Transition> transitions = new List<Transition> (); /// , /// , null. /// StateMachine. public virtual State GetNext() { foreach (var transition in transitions) { if (transition.NeedTransit ) return transition.TargetState; } return null; } /// . /// OnDisable, . public virtual void Exit() { if(enabled) { foreach(var transition in transitions) { transition.enabled = false; } enabled = false; } } /// . /// OnEnable, . public virtual void Enter() { if(!enabled) { enabled = true; foreach(var transition in transitions) { transition.enabled = true; } } } /// , Inspector' /// enabled/disabled . /// . protected virtual void FixedUpdate() { } }
using UnityEngine; /// . public class StateMachine : MonoBehaviour { /// . /// Inspector'. [SerializeField] State startingState; /// . State current; /// . public State Current { get { return current; } } /// ( ). void Start() { Reset(); } /// . public void Reset() { Transit(startingState); } /// , /// . - . void Update () { if(current == null) return; var next = current.GetNext(); if(next != null) Transit(next); } /// , . /// , /// /// . void Transit(State next) { if(current != null) current.Exit(); current = next; if(current != null) current.Enter(); } }
using UnityEngine; using System.Collections; /// . public class TimerTransition : Transition { /// . Inspector'. [SerializeField, Tooltip("Time in seconds.")] float time; /// "". /// NeedTransit. void OnEnable() { NeedTransit = false; StartCoroutine("Timer"); } /// , . /// NeedTransit true. IEnumerator Timer() { yield return new WaitForSeconds(time); NeedTransit = true; } /// "". /// . void OnDisable() { StopCoroutine("Timer"); } }
using UnityEngine; /// Transform Translate. public class TranslateState : State { /// Transform, Inspector'. [SerializeField] Transform transformToMove; /// . Inspector'. [SerializeField, Tooltip("Speed in units per second.")] Vector3 speed; /// Transform. void Update () { var step = speed * Time.deltaTime; transformToMove.Translate(step.x, step.y, step.z); } }
/// . /// , /// "". public class MoveRight : TranslateState { }
/// . /// , /// "". public class MoveLeft : TranslateState { }
Source: https://habr.com/ru/post/242977/
All Articles