рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рд▓реЙрдЬрд┐рдХ рдПрдбрд┐рдЯрд░ред рднрд╛рдЧ реи

рдкрд░рд┐рдЪрдп


рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рдЖрдЬ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рд▓реЙрдЬрд┐рдХ рдПрдбрд┐рдЯрд░ рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ ред рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣реИред рдЖрдк рдпрд╣рд╛рдБ рдкрд┐рдЫрд▓реЗ рдПрдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ? рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдХреЛрд░ рдХреЛрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд▓реЙрдЬрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ, рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, ScriptableObject , рддрд░реНрдХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВред рдЖрдЗрдП рдЗрди рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд▓реЗрдЦ:

тЖТ рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рд▓реЙрдЬрд┐рдХ рдПрдбрд┐рдЯрд░ред рднрд╛рдЧ 1

ScriptableObject рдХреНрдпреЛрдВ рд╣реИ?


рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрд╕рдкрд╛рд╕ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдкрд╣рд▓реЗ рд░реВрдк рдореЗрдВ - рдпрд╣ рдореЛрдиреЛрд╣реЗрд╡рд┐рдпрд░ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЧреЗрдордСрдмрдЬреЗрдХреНрдЯ рдкрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдЖрдкрдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдЬреЛ рдпреВрдирд┐рдЯреАрдЬрд╛рдЗрди рдХрд╛ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖рдг ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЬрдбрд╝ рдирд╣реАрдВ рд▓реЗрддрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдШрд╕реАрдЯрд╛ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ, рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛, рдЖрджрд┐ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реБрдП, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдерд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдмрд▓ рдСрдмрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬрд┐рд╕рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЛрдиреЛрдмреЗрд╣реЗрд╡рд┐рдпрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдпрджрд┐ рдирд┐рд░реНрдорд╛рдг рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ ScriptableObject.CreateInstance рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ JsonUtility (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдПрдХрддрд╛ рдирд┐рд░реАрдХреНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдиреАрдЪреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрд░реЗрдЦ рд╣реИ рдЬрд┐рд╕рдореЗрдВ uViLEd рдХреЛрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ ред

рдЫрд╡рд┐

рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдирд┐рдпрдВрддреНрд░рдХ


рдирд┐рдпрдВрддреНрд░рдХ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдореБрдЦреНрдп рддрддреНрд╡ рд╣реИ, рдЬреЛ рдПрдХ рдореЛрдиреЛрдмреАрд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ) рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдФрд░ рддрд░реНрдХ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

  1. рд╕реНрдЯреЛрд░реНрд╕ рдпреВрдирд┐рдЯреА рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдВрдХ
  2. рджреГрд╢реНрдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ
  3. рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рддрд░реНрдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ
  4. рдШрдЯрдХреЛрдВ рдореЗрдВ рдореЛрдиреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдЖрдзрд╛рд░ рдХреЛрдб
namespace uViLEd.Core { public partial class LogicController : MonoBehaviour { private static LogicController _instance; public static LogicController Instance { get { _instance = _instance ?? FindObjectOfType<LogicController>(); return _instance; } } [Serializable] public class SceneLogicData { public string Name; public TextAsset BinaryData => _data; public string Id => _id; [SerializeField] private string _id; [SerializeField] private TextAsset _data; public SceneLogicData(string id, string name, TextAsset binaryData) { _id = id; _data = binaryData; Name = name; } } [HideInInspector] public List<SceneLogicData> SceneLogicList = new List<SceneLogicData>(); void Awake() { _instance = this; foreach (var sceneLogic in SceneLogicList) { RunLogicInternal(LogicStorage.Load(sceneLogic.BinaryData)); } } } } 


рдиреЛрдЯ : рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдХрд╛ рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рддрд░реНрдХ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ рд╣реИред
рдиреЛрдЯ : рд▓реЛрдбрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдбреЗрдЯрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

UViLEd рдХрд░реНрдиреЗрд▓ рдХреЗ рдореБрдЦреНрдп рддрддреНрд╡


рдЕрдВрдЧ


рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдХрд┐ рдШрдЯрдХ ScriptableObject рд╣реИ ред рд╕рднреА рдШрдЯрдХ LogicComponent рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╕рд░рд▓ рд╣реИред

 namespace uViLEd.Core { public abstract class LogicComponent : ScriptableObject { protected MonoBehaviour coroutineHost => _logicHost; private MonoBehaviour _logicHost; public virtual void Constructor() { } } } 

рдпрд╣рд╛рдБ, coroutineHost рдПрдХ рд▓реЙрдЬрд┐рдХ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд┐рд░реНрдл рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рдПрдХрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореМрдЬреВрдж рдЕрдиреНрдп рдХреЛрдб рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдореВрд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЪрд░


рдЪрд░, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб
 namespace uViLEd.Core { public abstract class Variable : LogicComponent { } public abstract class Variable<T> : Variable { public delegate void Changed(); public delegate void Set(T newValue); public event Changed OnChanged; public event Set OnSet; public T Value { get { return _value; }set { var changed = false; if (_value == null && value != null || (_value != null && !_value.Equals(value))) { changed = true; } _value = value; if (changed) { OnChanged?.Invoke(); } OnSet?.Invoke(_value); } } [SerializeField] private T _value; public virtual void OnDestroy() { if(OnSet != null) { foreach (var eventHandler in OnSet.GetInvocationList()) { OnSet -= (Set)eventHandler; } } if(OnChanged != null) { foreach (var eventHandler in OnChanged.GetInvocationList()) { OnChanged -= (Changed)eventHandler; } } } } } 


рдпрд╣рд╛рдВ рдЪрд░ рд╕рднреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рд╕рд╛рд░ рд╡рд░реНрдЧ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ , рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдЪрд╛рд░


рдХрдиреЗрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИрдВ, рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдЖрднрд╛рд╕реА рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рдЪрд░ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдирд░рдо рд╣реИ рдФрд░ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╕рднреА рд╕рдВрдЪрд╛рд░ рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрдирддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдкрдврд╝реЗрдВ)ред рдЙрди рд╡рд░реНрдЧреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
 namespace uViLEd.Core { public class INPUT_POINT<T> { public Action<T> Handler; } public class INPUT_POINT { public Action Handler; } } 


рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдмрд┐рдВрджреБ
 namespace uViLEd.Core { public class OUTPUT_POINT<T> { private List<Action<T>> _linkedInputPoints = new List<Action<T>>(); public void Execute(T param) { foreach(var handler in _linkedInputPoints) { handler(param); } } } public class OUTPUT_POINT { private List<Action> _linkedInputPoints = new List<Action>(); public void Execute() { foreach (var handler in _linkedInputPoints) { handler(); } } } } 


рдЪрд░ рд╕рдВрджрд░реНрдн
 namespace uViLEd.Core { public class VARIABLE_LINK<T> { public T Value { get => _variable.Value; set => _variable.Value = value; } private Variable<T> _variableProperty { get => _variable; set { _variable = value; VariableWasSet = true; InitializeEventHandlers(); } } public bool VariableWasSet { get; private set; } = false; private Variable<T> _variable; private Variable<T>.Set _automaticSetHandler; private Variable<T>.Changed _automaticChangedHandler; public void AddSetEventHandler(Variable<T>.Set handler) { if (VariableWasSet) { _variable.OnSet += handler; }else { _automaticSetHandler = handler; } } public void RemoveSetEventHandler(Variable<T>.Set handler) { if (VariableWasSet) { _variable.OnSet -= handler; } } public void AddChangedEventHandler(Variable<T>.Changed handler) { if (VariableWasSet) { _variable.OnChanged += handler; }else { _automaticChangedHandler = handler; } } public void RemoveChangedEventHandler(Variable<T>.Changed handler) { if (VariableWasSet) { _variable.OnChanged -= handler; } } private void InitializeEventHandlers() { if (_automaticSetHandler != null) { _variable.OnSet += _automaticSetHandler; } if (_automaticChangedHandler != null) { _variable.OnChanged += _automaticChangedHandler; } } } } 


рдиреЛрдЯ : рдпрд╣рд╛рдВ рдпрд╣ рдПрдХ рдмрд┐рдВрджреБ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдЕрднреА рддрдХ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗред

рддрд░реНрдХ рд╕реЗ рдХрд╛рдо рд▓реЛ


рднрдВрдбрд╛рд░рдг


рджреГрд╢реНрдп рддрд░реНрдХ рд╕рдВрдкрд╛рджрдХ рдкрд░ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рддрд░реНрдХ рдЪрд░, рдШрдЯрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ:

 namespace uViLEd.Core { [Serializable] public partial class LogicStorage { public string Id = string.Empty; public string Name = string.Empty; public string SceneName = string.Empty; public ComponentsStorage Components = new ComponentsStorage(); public LinksStorage Links = new LinksStorage(); } } 

рдпрд╣ рд╡рд░реНрдЧ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдХреНрд░рдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХрддрд╛ рдХреЗ JsonUtility рдХреЛ рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╛рдЗрдЯреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЦреНрдп рдХрд╛рд░рдг рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рддрд░реНрдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ рдбрд┐рд╕реЗрдиреНрдЯрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдУрдкрди рдЬреЛрдВрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

рдЪрд▓реЛ ComponentsStrorage рдФрд░ LinksStorage рд╡рд░реНрдЧреЛрдВ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ред рд╕рд┐рд╕реНрдЯрдо рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ GUID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред

 namespace uViLEd.Core { [Serializable] public abstract class Identifier { public string Id { get; } public Identifier() { if (!string.IsNullOrEmpty(Id)) return; Id = System.Guid.NewGuid().ToString(); } } } 

рдЕрдм ComponentsStorage рд╡рд░реНрдЧ рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рддрд░реНрдХ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:

 namespace uViLEd.Core { public partial class LogicStorage { [Serializable] public class ComponentsStorage { [Serializable] public class ComponentData : Identifier { public string Type = string.Empty; public string Assembly = string.Empty; public string JsonData = string.Empty; public bool IsActive = true; } public List<ComponentData> Items = new List<ComponentData>(); } } 

рдХрдХреНрд╖рд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:

  1. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ( GUID рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛
  2. рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ
  3. рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рдд рд╣реИ
  4. рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЬрд╕рди рд╕реНрдЯреНрд░рд┐рдВрдЧ ( JsonUtility.ToJson рдХрд╛ рдкрд░рд┐рдгрд╛рдо)
  5. рдШрдЯрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ (рд░рд╛рдЬреНрдп) рдзреНрд╡рдЬ

рдЕрдм рд╣рдо LinksStorage рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

 namespace uViLEd.Core { public partial class LogicStorage { [Serializable] public class LinksStorage { [Serializable] public class LinkData : Identifier { public bool IsVariable; public bool IsActive = true; public string SourceComponent = string.Empty; public string TargetComponent = string.Empty; public string OutputPoint = string.Empty; public string InputPoint = string.Empty; public string VariableName = string.Empty; public int CallOrder = -1; } public List<LinkData> Items = new List<LinkData>(); } } 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:

  1. рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдВрдХ рдПрдХ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ
  2. рд▓рд┐рдВрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдзреНрд╡рдЬ
  3. рдЖрдЙрдЯрдкреБрдЯ рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдШрдЯрдХ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ( GUID рд╕реНрдЯреНрд░рд┐рдВрдЧ)
  4. рдкреНрд░рд╡реЗрд╢-рдмрд┐рдВрджреБ рдШрдЯрдХ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ( GUID рд╕реНрдЯреНрд░рд┐рдВрдЧ)
  5. рд╕рдВрдЪрд╛рд░ рд╕реНрд░реЛрдд рдШрдЯрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдмрд┐рдВрджреБ рдХрд╛ рдирд╛рдо
  6. рд▓рдХреНрд╖реНрдп рд╕рдВрдЪрд╛рд░ рдШрдЯрдХ рдХреЗ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХрд╛ рдирд╛рдо
  7. рдЪрд░ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдб рдирд╛рдо
  8. рд╕рдВрдЪрд╛рд░ рдХреЙрд▓ рдЖрджреЗрд╢

рднрдВрдбрд╛рд░ рд╕реЗ рднрд╛рдЧреЛ


рдХреЛрдб рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рддрд░реНрдХ рдХреЛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  1. рдХрдВрдЯреНрд░реЛрд▓рд░ рдЕрд╡реЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИ
  2. рджреГрд╢реНрдп рд▓реЙрдЬрд┐рдХреНрд╕ рдХреА рд╕реВрдЪреА рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рддрд░реНрдХ рдбреЗрдЯрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИ ( рдЯреЗрдХреНрд╕реНрдЯрдПрд╕реЗрдЯ )
  3. рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ:
    • рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг
    • CallOrder рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХреНрд░рдорд┐рдд рдХрд░рдирд╛
    • рд▓рд┐рдВрдХ рдФрд░ рдЪрд░ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рдирд╛
    • ExecuteOrder рджреНрд╡рд╛рд░рд╛ рдореЛрдиреЛ рдШрдЯрдХ рдШрдЯрдХ рдХреЛ рдЫрд╛рдБрдЯрдирд╛


рдЖрдЗрдП рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рд▓реВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХреНрд░рдорд╛рдВрдХрди рдФрд░ deserialization
 namespace uViLEd { public class Serialization { public static void Serialize(object data, string path, string fileName) { var binaryFormatter = new BinaryFormatter(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (var fs = new FileStream(Path.Combine(path, fileName), FileMode.OpenOrCreate)) { binaryFormatter.Serialize(fs, data); } } public static object Deserialize(TextAsset textAsset) { var binaryFormatter = new BinaryFormatter(); using (var memoryStream = new MemoryStream(textAsset.bytes)) { return binaryFormatter.Deserialize(memoryStream); } } } } 


рдЯреЗрдХреНрд╕реНрдЯ рдПрд╕реЗрдЯ (рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓) рд╕реЗ рд▓реЙрдЬрд┐рдХ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛
 namespace uViLEd.Core { public partial class LogicStorage { public static LogicStorage Load(TextAsset textAsset) => Serialization.Deserialize(textAsset) as LogicStorage; } } 


рд▓реЙрдЬрд┐рдХ рд▓реЙрдиреНрдЪ
 private void RunLogicInternal(LogicStorage logicStorage) { var instances = new Dictionary<string, LogicComponent>(); foreach (var componentData in logicStorage.Components.Items) { CreateComponent(componentData, instances); } logicStorage.Links.Items.Sort(SortingLinks); foreach (var linkData in logicStorage.Links.Items) { CreateLink(linkData, instances); } foreach (var monoMethods in _monoBehaviourMethods.Values) { monoMethods.Sort(SortingMonoMethods); } } 


рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг
 private void CreateComponent(LogicStorage.ComponentsStorage.ComponentData componentData, IDictionary<string, LogicComponent> instances, IList<IDisposable> disposableInstance, IDictionary<string, List<MonoMethodData>> monoMethods) { if (!componentData.IsActive) return; var componentType = AssemblyHelper.GetAssemblyType(componentData.Assembly, componentData.Type); var componentInstance = ScriptableObject.CreateInstance(componentType) as LogicComponent; JsonUtility.FromJsonOverwrite(componentData.JsonData, componentInstance); componentInstance.name = componentData.InstanceName; componentType.GetFieldRecursive(_LOGIC_HOST_STR).SetValue(componentInstance, this as MonoBehaviour); componentInstance.Constructor(); instances.Add(componentData.Id, componentInstance); if(componentInstance is IDisposable) { disposableInstance.Add((IDisposable)componentInstance); } SearchMonoBehaviourMethod(componentInstance, monoMethods); } 

рддреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

  1. рдШрдЯрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ
  2. рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдШрдЯрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
  3. рдПрдХ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
  4. JSON рд╕реЗ рдШрдЯрдХ рдкреИрд░рд╛рдореАрдЯрд░ deserialization
  5. рд▓рд┐рдВрдХ coroutineHost рдореЗрдВ рд╕реЗрдЯ рд╣реИ
  6. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
  7. рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИ
  8. рдпрджрд┐ рдШрдЯрдХ рдЖрдИрдбреАрд╕реЙрдлрд╝реЗрд░рд┐рдпрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  9. рдШрдЯрдХ рдореЗрдВ рдореЛрдиреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛


рд▓рд┐рдВрдХ рдмрдирд╛рдирд╛
 private void CreateLink(LogicStorage.LinksStorage.LinkData linkData, Dictionary<string, LogicComponent> instances) { if (!linkData.IsActive) return; var sourceComponent = instances.ContainsKey(linkData.SourceComponent) ? instances[linkData.SourceComponent] : null; if (sourceComponent == null) return; var targetComponent = instances.ContainsKey(linkData.TargetComponent) ? instances[linkData.TargetComponent] : null; if (targetComponent == null) return; if (linkData.IsVariable) { var variableLinkFieldInfo = sourceComponent.GetType().GetField(linkData.variableName); if (variableLinkFieldInfo != null) { var variableLinkFieldValue = variableLinkFieldInfo.GetValue(sourceComponent); var variableLinkVariablePropertyInfo = variableLinkFieldInfo.FieldType.GetProperty(_VARIABLE_PROPERTY_STR, BindingFlags.NonPublic | BindingFlags.Instance); variableLinkVariablePropertyInfo.SetValue(variableLinkFieldValue, targetComponent, null); } } else { object handlerValue; MethodInfo methodListAdd; object linkedInputPointsFieldValue; Type outputPointType; object outputPoint; var outputPointParse = sourceComponent as IOutputPointParse; var inputPointParse = targetComponent as IInputPointParse; if (outputPointParse != null) { var outputPoints = outputPointParse.GetOutputPoints(); if (outputPoints.ContainsKey(linkData.OutputPoint)) { outputPoint = outputPoints[linkData.OutputPoint]; if (outputPoint is FieldInfo) { outputPoint = sourceComponent.GetType().GetField(linkData.OutputPoint).GetValue(sourceComponent); } outputPointType = outputPoint.GetType(); var linkedInputPointsFieldInfo = outputPointType.GetField(_LINKED_INPUT_POINTS_STR, BindingFlags.NonPublic | BindingFlags.Instance); linkedInputPointsFieldValue = linkedInputPointsFieldInfo.GetValue(outputPoint); methodListAdd = linkedInputPointsFieldInfo.FieldType.GetMethod(_ADD_STR); } } else { var outputPointFieldInfo = sourceComponent.GetType().GetField(linkData.OutputPoint); outputPoint = outputPointFieldInfo.GetValue(sourceComponent); if (outputPoint != null) { outputPointType = outputPoint.GetType(); var linkedInputPointsFieldInfo = outputPointFieldInfo.FieldType.GetField(_LINKED_INPUT_POINTS_STR, BindingFlags.NonPublic | BindingFlags.Instance); linkedInputPointsFieldValue = linkedInputPointsFieldInfo.GetValue(outputPoint); methodListAdd = linkedInputPointsFieldInfo.FieldType.GetMethod(_ADD_STR); } } if (inputPointParse != null) { var inputPoints = inputPointParse.GetInputPoints(); if (inputPoints.ContainsKey(linkData.InputPoint)) { var inputPoint = inputPoints[linkData.InputPoint]; if (inputPoint is FieldInfo) { inputPoint = targetComponent.GetType().GetField(linkData.InputPoint).GetValue(targetComponent); } var inputPointType = inputPoint.GetType(); var inputPointHandlerFieldInfo = inputPointType.GetField(_HANDLER_STR); handlerValue = inputPointHandlerFieldInfo.GetValue(inputPoint); } } else { var inputPointFieldInfo = targetComponent.GetType().GetField(linkData.InputPoint); var inputPointFieldValue = inputPointFieldInfo.GetValue(targetComponent); if (inputPointFieldValue != null) { var inputPointHandlerFieldInfo = inputPointFieldInfo.FieldType.GetField(_HANDLER_STR); handlerValue = inputPointHandlerFieldInfo.GetValue(inputPointFieldValue); } } var handlerParsedAction = GetParsedHandler(handlerValue, outputPoint); methodListAdd.Invoke(linkedInputPointsFieldValue, new object[] { handlerParsedAction }); } } private object GetParsedHandler(object handlerValue, object outputPoint) { var inputPointType = handlerValue.GetType(); var outputPointType = outputPoint.GetType(); if (inputPointType.IsGenericType) { var paramType = inputPointType.GetGenericArguments()[0]; if (paramType == typeof(object) && outputPointType.IsGenericType) { var parsingActionMethod = outputPointType.GetMethod(_PARSING_ACTION_OBJECT_STR, BindingFlags.NonPublic | BindingFlags.Instance); return parsingActionMethod.Invoke(outputPoint, new object[] { handlerValue }); } else { return handlerValue; } } else { if (outputPointType.IsGenericType) { var parsingActionMethod = outputPointType.GetMethod(_PARSING_ACTION_EMPTY_STR, BindingFlags.NonPublic | BindingFlags.Instance); return parsingActionMethod.Invoke(outputPoint, new object[] { handlerValue }); } else { return handlerValue; } } } 

рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  1. рд╕рдВрдЪрд╛рд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ
  2. рдирд┐рд░реНрдорд┐рдд рдШрдЯрдХреЛрдВ рдХреА рдЕрд╕реНрдерд╛рдпреА рд╕реВрдЪреА рдореЗрдВ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдШрдЯрдХ рдФрд░ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ
  3. рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:
    • рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
    • рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

  4. рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рд▓реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдШрдЯрдХ IInputPointParse рдФрд░ IOutputPointParse рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ ред
  5. рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕реНрд░реЛрдд рдШрдЯрдХ рдореЗрдВ рд▓рд┐рдВрдХреНрдбрдЗрдирдкреБрдЯ рдкреЙрдЗрдВрдЯ рдкреЙрдЗрдВрдЯ рдФрд░ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред
  6. рдореЗрдердб рд╣реИрдВрдбрд▓рд░реНрд╕ рдореЗрдердбрдЗрдиреНрдлреЛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдореЗрдердб рдХреЙрд▓ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрдирд╡реЛрдХ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг Action<T> рдХреЙрд▓ рдореЗрдВ рдмрджрд▓реЗрдВ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП, OUTPUT_POINT<T> рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ OUTPUT_POINT<T> рдЧрдП рд╣реИрдВ рдЬреЛ OUTPUT_POINT<T> рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЧреИрд░- рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

     private Action<T> ParsingActionEmpty(Action action) { Action<T> parsedAction = (value) => action(); return parsedAction; } private Action<T> ParsingActionObject(Action<object> action) { Action<T> parsedAction = (value) => action(value); return parsedAction; } } 

    рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ред

  7. рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд▓рд┐рдВрдХ рд▓рд┐рдВрдХреНрдбрдЗрдирдкреБрдЯ рдкреЙрдЗрдВрдЯреНрд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╕реВрдЪреА рд╣реИ)


рдореЛрдиреЛ рдореЗрдердбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
 private void SearchMonoBehaviourMethod(LogicComponent component, IDictionary<string, List<MonoMethodData>> monoBehaviourMethods) { var type = component.GetType(); var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance); foreach (var method in methods) { if (_monoMethods.Keys.Contains(method.Name)) { var priorityAttributes = method.GetCustomAttributes(typeof(ExecuteOrderAttribute), true); var priority = (priorityAttributes.Length > 0) ? ((ExecuteOrderAttribute)priorityAttributes[0]).Order : int.MaxValue; monoBehaviourMethods[method.Name].Add(new MonoMethodData(method, component, priority, _monoMethods[method.Name])); } } } 

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╛рдорд╛рдиреНрдп MethodInfo.Invoke рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореЛрдиреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЙрд▓ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд╡рд░рдг рд╣реИред

 private class MonoMethodData { public int Order { get; private set; } private Action _monoMethodWrapper; private Action<bool> _monoMethodParamWrapper; public MonoMethodData(MethodInfo method, object target, int order, bool withParam) { if (!withParam) { _monoMethodWrapper = (Action)Delegate.CreateDelegate(typeof(Action), target, method.Name); } else { _monoMethodParamWrapper = (Action<bool>)Delegate.CreateDelegate(typeof(Action<bool>), target, method.Name); } Order = order; } public void Call() =>_monoMethodWrapper(); public void Call(bool param) => _monoMethodParamWrapper(param); } 

рдиреЛрдЯ : рдмреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдиреЛрдкреНрд▓реЗ рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рдирдкреЙрдЬрд╝ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдмрд╛рд╣рд░реА рдЯреНрд░рд┐рдЧрд░ рддрд░реНрдХ


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд▓реЙрдЬрд┐рдХ рдХрд╛ рдмрд╛рд╣рд░реА рд▓реЙрдиреНрдЪ рдПрдХ рд▓реЙрдиреНрдЪ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЙрдЬрд┐рдХ рд╕реАрди рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдмрдВрдбрд▓ рд╕реЗ, рдпрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореЛрдиреЛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд╛рд╣рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рджреГрд╢реНрдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдмрд╛рд╣рд░реА (рдЖрд╕реНрдердЧрд┐рдд) рддрд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛрдб
 public void RunLogicExternal(LogicStorage logicStorage) { var instances = new Dictionary<string, LogicComponent>(); var runMonoMethods = new Dictionary<string, List<MonoMethodData>>(); foreach (var monoMethodName in _monoMethods.Keys) { runMonoMethods.Add(monoMethodName, new List<MonoMethodData>()); } foreach (var componentData in logicStorage.Components.Items) { CreateComponent(componentData, instances, _disposableInstances, runMonoMethods); } logicStorage.Links.Items.Sort(SortingLinks); foreach (var linkData in logicStorage.Links.Items) { CreateLink(linkData, instances); } foreach (var monoMethods in runMonoMethods.Values) { monoMethods.Sort(SortingMonoMethods); } if (runMonoMethods.ContainsKey(_START_STR)) { CallMonoBehaviourMethod(_START_STR, runMonoMethods, true); } foreach (var monoMethodName in runMonoMethods.Keys) { _monoBehaviourMethods[monoMethodName].AddRange(runMonoMethods[monoMethodName]); } foreach (var monoMethods in _monoBehaviourMethods.Values) { monoMethods.Sort(SortingMonoMethods); } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЛрдиреЛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реНрдЯрд╛рд░реНрдЯ рддрд░реАрдХреЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ


рдЖрд╡реЗрджрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реНрдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рддрдХ рдпрд╣ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд▓реЙрдЬрд┐рдХ рдЯреНрд░рд┐рдЧрд░рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреГрд╢реНрдп рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рддрд░реНрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдЯрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдореЗрдореЛрд░реА рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рд▓реЙрдЬрд┐рдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреНрд▓рд╛рд╕ рдХреЛрдб:

 private class InstanceLogicData { public readonly IList<LogicComponent> ComponentInstances = new List<LogicComponent>(); public readonly IDictionary<string, List<MonoMethodData>> MonoBehaviourMethods = new Dictionary<string, List<MonoMethodData>>(); public readonly IList<IDisposable> DisposableInstances = new List<IDisposable>(); } 

рд▓реЙрдЬрд┐рдХ рд▓реЙрдиреНрдЪ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдмрд╛рд╣рд░реА рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдорд╛рди рд╣реИред
 public string RunLogicInstance(LogicStorage logicStorage, object data) { var id = Guid.NewGuid().ToString(); var logicInstanceData = new InstanceLogicData(); var instances = new Dictionary<string, LogicComponent>(); _logicInstances.Add(id, logicInstanceData); foreach (var componentData in logicStorage.Components.Items) { CreateComponent(componentData, instances, logicInstanceData.DisposableInstances, logicInstanceData.MonoBehaviourMethods); } logicStorage.Links.Items.Sort(SortingLinks); foreach (var linkData in logicStorage.Links.Items) { CreateLink(linkData, instances); } foreach (var monoMethods in logicInstanceData.MonoBehaviourMethods.Values) { monoMethods.Sort(SortingMonoMethods); } return id; } 


рдпрд╣ рдХреЛрдб рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддрд░реНрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреЙрдк рдФрд░ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
 public void StopLogicInstance(string instanceId) { if (!_logicInstances.ContainsKey(instanceId)) return; var logicInstance = _logicInstances[instanceId]; foreach (var disposableInstance in logicInstance.DisposableInstances) { disposableInstance.Dispose(); } foreach (var componentInstance in logicInstance.ComponentInstances) { Destroy(componentInstance); } logicInstance.ComponentInstances.Clear(); logicInstance.DisposableInstances.Clear(); logicInstance.MonoBehaviourMethods.Clear(); _logicInstances.Remove(instanceId); } 


рджреГрд╢реНрдп рдХреЛ рд╢рд╛рдВрдд рдХрд░рдирд╛ рдФрд░ рд╕реНрдореГрддрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛


ScriptableObject.CreateInstance рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд░рдирд┐рдВрдЧ рд╕реАрди рдореЗрдВ ScriptableObject рдмрдирд╛рддреЗ рд╕рдордп , рдЙрджрд╛рд╣рд░рдг MonoBeviourour рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ , рдЕрд░реНрдерд╛рдд, рдЬрдм рджреГрд╢реНрдп рд╕реЗ рдЙрддрд╛рд░рдирд╛ рд╣реЛ, рддреЛ OnDadroy рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рдШрдЯрдХ рдЖрдИрдбреАрд╕рд┐рд╕реЛрдкреНрд▓реЙрд░реА рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдСрди-рдбрд┐рд╕реЗрдмрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реВрдВ:

 void OnDisable() { foreach (var disposable in _disposableInstances) { disposable.Dispose(); } _disposableInstances.Clear(); _monoBehaviourMethods.Clear(); foreach (var logicInstance in _logicInstances.Values) { foreach (var disposableInstance in logicInstance.DisposableInstances) { disposableInstance.Dispose(); } logicInstance.DisposableInstances.Clear(); logicInstance.ComponentInstances.Clear(); logicInstance.MonoBehaviourMethods.Clear(); } _logicInstances.Clear(); _instance = null; } 

рдиреЛрдЯ : рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рджреГрд╢реНрдп рдЙрддрд╛рд░рдиреЗ рдХреЗ рд╕рдордп рддрд░реНрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕рдлрд╛рдИ рд╣реЛрддреА рд╣реИред

рдПрдХрддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди


рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛, рдЬреЛ рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рджреГрд╢реНрдп рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдпрд╣ рджреГрд╢реНрдп рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рд▓реЙрдЬрд┐рдХ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЬрд┐рдХ рдШрдЯрдХ рдпреВрдирд┐рдЯреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╕рд╛рдзрди, рдкреНрд░реАрдлрд╝реИрдм рдФрд░ рдЕрдиреНрдп рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб
 [Serializable] private class ObjectLinkData { public string Id => _id; public UnityEngine.Object Obj => _obj; [SerializeField] private string _id = string.Empty; [SerializeField] private UnityEngine.Object _obj; public ObjectLinkData(string id, UnityEngine.Object obj) { _id = id; _obj = obj; } } [SerializeField] [HideInInspector] private List<ObjectLinkData> _objectLinks = new List<ObjectLinkData>(); public UnityEngine.Object GetObject(string id) { var linkData = _objectLinks.Find(link => { return string.Compare(link.Id, id, StringComparison.Ordinal) == 0; }); return linkData?.Obj; } 

рдпрд╣рд╛рдВ:

  1. рдЖрдИрдбреА - рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рджреГрд╢реНрдп рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
  2. рдУрдмреНрдЬ - рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ


, .

- Unity
 [Serializable] public class VLObject { public string Id => _id; public UnityEngine.Object Obj { get { if (_obj == null && !_objNotFound) { _obj = Core.LogicController.Instance.GetObject(Id); if (_obj == null) { _objNotFound = true; } } return _obj; } } private UnityEngine.Object _obj; [SerializeField] private string _id; private bool _objNotFound; public VLObject() { } public VLObject(UnityEngine.Object obj) { _obj = obj; } public T Get<T>() where T : UnityEngine.Object { return Obj as T; } } 

: _objNotFound , , .


, , . , , , .. Unity . Update MonoBehaviour uViLEd - , , 1000 . тАФ , , ( Android iOS) рдЕрдВрддрд░ рдмрдбрд╝рд╛ рд╣реИред 70 рдШрдЯрдХреЛрдВ рдФрд░ рд▓рдЧрднрдЧ 150 рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рддрд░реНрдХ рдореЗрдВ (рдЪрд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рд╕рд╣рд┐рдд), рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:

  1. рдПрдВрдбреНрд░реЙрдЗрдб (рдмрд╣реБрдд рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рдореАрдбрд┐рдпрд╛рдЯреЗрдХ 8-рдХреЛрд░)
    - рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ - ~ тАЛтАЛ750ms
    - рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рджреГрд╢реНрдп рдЪрд▓ рд░рд╣рд╛ рд╣реИ ~ 250ms
  2. iOS (iPhone 5s)
    - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ - ~ тАЛтАЛ100ms
    - рд░рдирд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рджреГрд╢реНрдп рдЪрд▓ рд░рд╣рд╛ рд╣реИ ~ 50ms

рдирд┐рд╖реНрдХрд░реНрд╖


UViLEd рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдХрд░реНрдиреЗрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рд╕реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рдХрд┐ рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрдВрдЧреЗред рдлрд┐рд░ рднреА, рдпрд╣ рд▓реЗрдЦ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрд╡рдпрдВ рд╕рдВрдкрд╛рджрдХ рд╣реИред рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдВрддрд┐рдо рдЕрдВрддрд┐рдо рднрд╛рдЧ, рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдШрдЯрдирд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред

рдкреБрдирд╢реНрдЪ: рд▓реЗрдЦ рдХрд╛ рд▓реЗрдЦрди рдмрд╣реБрдд рд▓рдВрдмрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╢реЗрд╖ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ, рд▓реЗрдХрд┐рди рдПрдХрддрд╛ 3 рдбреА рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг (рд╕реБрдЦрдж рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ) рдЭрдЯрдХреЗ, рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред

тЖТ рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рд▓реЙрдЬрд┐рдХ рдПрдбрд┐рдЯрд░ред рднрд╛рдЧ 1

Source: https://habr.com/ru/post/hi466187/


All Articles