这是第一个 Unity 开放项目的repo,是 Unity 和社区合作创建的一个小型开源游戏演示,第一款游戏是一款名为 Chop Chop 的动作冒险游戏。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

80 行
1.9 KiB

using System;
using System.Collections.Generic;
using UnityEngine;
namespace UOP1.StateMachine
{
public class StateMachine : MonoBehaviour
{
#if UNITY_EDITOR
public string CurrentState;
public bool debug;
#endif
[Tooltip("Set the initial state of this StateMachine")]
[SerializeField] private ScriptableObjects.StateSO _initialStateSO = null;
private readonly Dictionary<Type, Component> _cachedComponents = new Dictionary<Type, Component>();
private State _currentState;
private void Awake()
{
_currentState = _initialStateSO.GetState(this);
_currentState.OnStateEnter();
#if UNITY_EDITOR
CurrentState = _currentState.Name;
#endif
}
public new bool TryGetComponent<T>(out T component) where T : Component
{
var type = typeof(T);
if (!_cachedComponents.TryGetValue(type, out var value))
{
if (base.TryGetComponent<T>(out component))
_cachedComponents.Add(type, component);
return component != null;
}
component = (T)value;
return true;
}
public T GetOrAddComponent<T>() where T : Component
{
if (!TryGetComponent<T>(out var component))
{
component = gameObject.AddComponent<T>();
_cachedComponents.Add(typeof(T), component);
}
return component;
}
public new T GetComponent<T>() where T : Component
{
return TryGetComponent(out T component)
? component : throw new InvalidOperationException($"{typeof(T).Name} not found in {name}.");
}
private void Update()
{
if (_currentState.TryGetTransition(out var transitionState))
Transition(transitionState);
_currentState.OnUpdate();
}
private void Transition(State transitionState)
{
_currentState.OnStateExit();
_currentState = transitionState;
_currentState.OnStateEnter();
#if UNITY_EDITOR
if (debug)
Debug.Log($"{name} entering state {_currentState.Name}");
CurrentState = _currentState.Name;
#endif
}
}
}