{"id":297521,"date":"2020-01-22T21:00:09","date_gmt":"2020-01-22T21:00:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=297521"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=297521","title":{"rendered":"\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f Unity3d. \u0427\u0430\u0441\u0442\u044c 2"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/466187\/\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0432 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0441\u0432\u044f\u0442\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u044f\u0434\u0440\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f <b>Unity3d<\/b>. \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/448190\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0418\u0442\u0430\u043a, \u043e \u0447\u0435\u043c \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c? \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043b\u0435\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u043a\u0438. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u044f\u0434\u0440\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043e \u0447\u0435\u043c \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, <b>ScriptableObject<\/b>, \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u043b\u043e\u0433\u0438\u043a\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0430\u0441\u043f\u0435\u043a\u0442\u044b.<\/p>\n<p>  \u0421\u0442\u0430\u0442\u044c\u0438 \u0432 \u0441\u0435\u0440\u0438\u0438:<br \/>  <a href=\"https:\/\/habr.com\/ru\/post\/448190\/\">\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f Unity3d. \u0427\u0430\u0441\u0442\u044c 1<\/a><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 ScriptableObject?<\/h2>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u044f \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b \u043e \u0442\u043e\u043c, \u0432\u043e\u043a\u0440\u0443\u0433 \u0447\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412 \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0438\u0434\u0435 \u2014 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 <b>MonoBehaviour<\/b>, \u043d\u043e \u043e\u0442 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0430 <b>GameObject<\/b>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0441\u0442\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c <b>UnityEngine.Object<\/b>. \u041d\u043e \u0438 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u043f\u0440\u0438\u0436\u0438\u043b\u0441\u044f, \u0445\u043e\u0442\u044f \u043e\u043d \u0438 \u0431\u044b\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0442\u044f\u043d\u0443\u043b \u0437\u0430 \u0441\u043e\u0431\u043e\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0430, \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0442. \u043f. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <b>ScriptableObject<\/b>, \u0446\u0438\u043a\u043b \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0445\u043e\u0436 \u0441 <b>MonoBehaviour<\/b>, \u0435\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 <b>ScriptableObject.CreateInstance<\/b>. \u041f\u043e\u043c\u0438\u043c\u043e, \u044d\u0442\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0440\u0435\u0448\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438e\u043c <b>JsonUtility <\/b>(\u043f\u0440\u0430\u0432\u0434\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0436\u0435 \u0438 \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439) \u0438 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0430 <b>Unity<\/b>.<\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u043e\u0433\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u044f\u0434\u0440\u043e <b>uViLEd<\/b>.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xd\/o-\/kp\/xdo-kp-skmrrvbfw0jy33l3r02o.png\" alt=\"image\"><br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<h3>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/h3>\n<p>  \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044f\u0434\u0440\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u0437 \u0441\u0435\u0431\u044f <b>MonoBehavior <\/b>\u0441\u043a\u0440\u0438\u043f\u0442 (\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435). \u041a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0435\u0442\u043e\u043d\u043e\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u0441\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u043b\u043e\u0433\u0438\u043a\u0438. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:  <\/p>\n<ol>\n<li>\u0425\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <b>Unity<\/b> <\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0446\u0435\u043d\u044b <\/li>\n<li>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 <\/li>\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 <\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">namespace uViLEd.Core {     public partial class LogicController : MonoBehaviour     {            private static LogicController _instance;         public static LogicController Instance         {             get             {                 _instance = _instance ?? FindObjectOfType&lt;LogicController&gt;();                                  return _instance;             }         }          [Serializable]         public class SceneLogicData         {             public string Name;             public TextAsset BinaryData =&gt; _data;                             public string Id =&gt; _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&lt;SceneLogicData&gt; SceneLogicList = new List&lt;SceneLogicData&gt;();                      \t         void Awake()         {             _instance = this;              foreach (var sceneLogic in SceneLogicList)             {                 RunLogicInternal(LogicStorage.Load(sceneLogic.BinaryData));                                 }                         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043b\u043e\u0433\u0438\u043a.<br \/>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u044f\u0434\u0440\u0430 uViLEd<\/h3>\n<p>  <\/p>\n<h4>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/h4>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u044d\u0442\u043e <b>ScriptableObject<\/b>. \u0412\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <b>LogicComponent<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442.  <\/p>\n<pre><code class=\"cs\">namespace uViLEd.Core {     public abstract class LogicComponent : ScriptableObject     {         protected MonoBehaviour coroutineHost =&gt; _logicHost;                                  private MonoBehaviour _logicHost;                                  public virtual void Constructor() { }                         } } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c <b>coroutineHost <\/b>\u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0440\u043e\u0443\u0442\u0438\u043d\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <b>Unity<\/b>.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h4>\n<p>  \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434 \u0434\u043b\u044f \u043d\u0438\u0445.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">namespace uViLEd.Core {     public abstract class Variable : LogicComponent { }             public abstract class Variable&lt;T&gt; : 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 &amp;&amp; value != null || (_value != null &amp;&amp; !_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;                 }             }         }             } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c <b>Variable <\/b> \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u043d \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0445 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u2014 \u044d\u0442\u043e <b>generic<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u0421\u0432\u044f\u0437\u0438<\/h4>\n<p>  \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u0432\u044f\u0437\u0438, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u043a\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u044d\u0442\u0430 \u0441\u0432\u044f\u0437\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u044f\u0433\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430 \u0432 \u043a\u043e\u0434\u0435. \u0412\u0441\u0435 \u0441\u0432\u044f\u0437\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0439 \u043d\u0438\u0436\u0435). \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0438.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">namespace uViLEd.Core {         public class INPUT_POINT&lt;T&gt;         {             public Action&lt;T&gt; Handler;                               }                  public class INPUT_POINT         {             public Action Handler;                                                 } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> namespace uViLEd.Core {          public class OUTPUT_POINT&lt;T&gt;     {                   private List&lt;Action&lt;T&gt;&gt; _linkedInputPoints = new List&lt;Action&lt;T&gt;&gt;();           public void Execute(T param)         { \t    foreach(var handler in _linkedInputPoints)             {                 handler(param);             }         }     }      public class OUTPUT_POINT     {         private List&lt;Action&gt; _linkedInputPoints = new List&lt;Action&gt;();          public void Execute()         {             foreach (var handler in _linkedInputPoints)             {                 handler();             }         }     }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> namespace uViLEd.Core {     public class VARIABLE_LINK&lt;T&gt;     {                   public T Value         {             get =&gt; _variable.Value;             set =&gt; _variable.Value = value;                         }                      private Variable&lt;T&gt; _variableProperty         {             get =&gt; _variable;             set             {                 _variable = value;                  VariableWasSet = true;                  InitializeEventHandlers();                                 }         }          public bool VariableWasSet { get; private set; } = false;          private Variable&lt;T&gt; _variable;         private Variable&lt;T&gt;.Set _automaticSetHandler;         private Variable&lt;T&gt;.Changed _automaticChangedHandler;          public void AddSetEventHandler(Variable&lt;T&gt;.Set handler)         {             if (VariableWasSet)             {                 _variable.OnSet += handler;             }else             {                 _automaticSetHandler = handler;             }         }          public void RemoveSetEventHandler(Variable&lt;T&gt;.Set handler)         {             if (VariableWasSet)             {                 _variable.OnSet -= handler;             }         }          public void AddChangedEventHandler(Variable&lt;T&gt;.Changed handler)         {             if (VariableWasSet)             {                 _variable.OnChanged += handler;             }else             {                 _automaticChangedHandler = handler;             }         }          public void RemoveChangedEventHandler(Variable&lt;T&gt;.Changed handler)         {             if (VariableWasSet)             {                 _variable.OnChanged -= handler;             }         }                     private void InitializeEventHandlers()         {             if (_automaticSetHandler != null)             {                 _variable.OnSet += _automaticSetHandler;             }              if (_automaticChangedHandler != null)             {                 _variable.OnChanged += _automaticChangedHandler;             }         }                 }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <b>Constructor<\/b>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439<\/h3>\n<p>  <\/p>\n<h4>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043b\u043e\u0433\u0438\u043a\u0438, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438:  <\/p>\n<pre><code class=\"cs\"> 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();     }     } <\/code><\/pre>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <b>JsonUtility <\/b> \u043e\u0442 <b>Unity <\/b>. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <b>bytes<\/b>. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e? \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u2013 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0442. \u0435. \u0434\u043b\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u0430 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 <b>json<\/b>.<br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043a\u043b\u0430\u0441\u0441 <b>ComponentsStrorage <\/b>\u0438 <b>LinksStorage<\/b>. \u0414\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <b>GUID<\/b>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.  <\/p>\n<pre><code class=\"cs\">namespace uViLEd.Core {     [Serializable]     public abstract class Identifier     {         public string Id { get; }          public Identifier()         {             if (!string.IsNullOrEmpty(Id)) return;                          Id = System.Guid.NewGuid().ToString();                     }     } } <\/code><\/pre>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <b>ComponentsStorage<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 \u043b\u043e\u0433\u0438\u043a\u0438:  <\/p>\n<pre><code class=\"cs\">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&lt;ComponentData&gt; Items = new List&lt;ComponentData&gt;();      }    } <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:  <\/p>\n<ol>\n<li>\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (\u0441\u0442\u0440\u043e\u043a\u0430 <b>GUID<\/b>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <b>Identifier <\/b><\/li>\n<li>\u0418\u043c\u044f \u0442\u0438\u043f\u0430 <\/li>\n<li>\u0418\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0438\u043f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <\/li>\n<li>Json-\u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b <b>JsonUtility.ToJson<\/b>) <\/li>\n<li>\u0424\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f) \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 <b>LinksStorage<\/b>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0432\u044f\u0437\u044f\u0445 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0441\u0441\u044b\u043b\u043a\u0430\u0445 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.  <\/p>\n<pre><code class=\"cs\">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&lt;LinkData&gt; Items = new List&lt;LinkData&gt;();       }     } <\/code><\/pre>\n<p>  \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:  <\/p>\n<ol>\n<li>\u0424\u043b\u0430\u0433 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <\/li>\n<li>\u0424\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u0438 <\/li>\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (\u0441\u0442\u0440\u043e\u043a\u0430 <b>GUID<\/b>) \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 <\/li>\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (\u0441\u0442\u0440\u043e\u043a\u0430 <b>GUID<\/b>) \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 <\/li>\n<li>\u0418\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u044f\u0437\u0438 <\/li>\n<li>\u0418\u043c\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u0432\u044f\u0437\u0438 <\/li>\n<li>\u0418\u043c\u044f \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <\/li>\n<li>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0432\u044f\u0437\u0438 <\/li>\n<\/ol>\n<p>  <\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/h4>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u043e\u0447\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443:  <\/p>\n<ol>\n<li>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 Awake \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <\/li>\n<li>\u041f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u043e\u0433\u0438\u043a \u0441\u0446\u0435\u043d\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (<b>TextAsset<\/b>) <\/li>\n<li>\u041f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<br \/> \n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <\/li>\n<li>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u043f\u043e <b>CallOrder <\/b><\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <\/li>\n<li>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e <b>ExecuteOrder <\/b><\/li>\n<\/ul>\n<p>   <\/li>\n<\/ol>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 \u044d\u0442\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">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);             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0430\u0441\u0441\u0435\u0442\u0430 (\u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">namespace uViLEd.Core {     public partial class LogicStorage     {         public static LogicStorage Load(TextAsset textAsset) =&gt; Serialization.Deserialize(textAsset) as LogicStorage;         } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private void RunLogicInternal(LogicStorage logicStorage) {     var instances = new Dictionary&lt;string, LogicComponent&gt;();      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);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> private void CreateComponent(LogicStorage.ComponentsStorage.ComponentData componentData,                              IDictionary&lt;string, LogicComponent&gt; instances,                              IList&lt;IDisposable&gt; disposableInstance,                              IDictionary&lt;string, List&lt;MonoMethodData&gt;&gt; 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); } private void SearchMonoBehaviourMethod(LogicComponent component, IDictionary&lt;string, List&lt;MonoMethodData&gt;&gt; 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 &gt; 0) ? ((ExecuteOrderAttribute)priorityAttributes[0]).Order : int.MaxValue;              monoBehaviourMethods[method.Name].Add(new MonoMethodData(method, component, priority, monoMethods[method.Name]));                                 }     } } <\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <\/li>\n<li>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u0431\u043e\u0440\u043a\u0438 <\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u043e \u0442\u0438\u043f\u0443<\/li>\n<li>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437 <b>json <\/b><\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0432 <b>\u0441oroutineHost<\/b> <\/li>\n<li>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <b>Constructor <\/b><\/li>\n<li>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <\/li>\n<li>\u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDisposable, \u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 <\/li>\n<li>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0438\u0441\u043a <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 <\/li>\n<\/ol>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0435\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private void CreateLink(LogicStorage.LinksStorage.LinkData linkData, Dictionary&lt;string, LogicComponent&gt; 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) &amp;&amp; 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;         }     } }<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0438, \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043e \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u0442\u0430\u043f:  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u0438 <\/li>\n<li>\u0412\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u0449\u0443\u0442\u0441\u044f, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0432\u044f\u0437\u0438 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0446\u0435\u043b\u044c <\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u0441\u0432\u044f\u0437\u0438: <br \/> \n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u0441\u0432\u044f\u0437\u0438 \u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <\/li>\n<li>\u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u044c \u043e\u0431\u044b\u0447\u043d\u0430\u044f, \u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a <\/li>\n<\/ul>\n<p>   <\/li>\n<li>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <b>IInputPointParse <\/b>\u0438 <b>IOutputPointParse<\/b>. <\/li>\n<li>\u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u043f\u043e\u043b\u044f <b>LinkedInputPoints <\/b>\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0446\u0435\u043b\u0438. <\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u0438\u043d\u0443\u044f <b>MethodInfo.Invoke<\/b> \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0437\u043e\u0432\n<pre><code class=\"cs\">Action&lt;T&gt;<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <\/p>\n<pre><code class=\"cs\">OUTPUT_POINT&lt;T&gt;<\/code><\/pre>\n<p> \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0414\u043b\u044f \u043d\u0435 <b>generic<\/b> \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0442\u0430\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.   <\/p>\n<pre><code class=\"cs\">private Action&lt;T&gt; ParsingActionEmpty(Action action) {     Action&lt;T&gt; parsedAction = (value) =&gt; action();      return parsedAction; }  private Action&lt;T&gt; ParsingActionObject(Action&lt;object&gt; action) {     Action&lt;T&gt; parsedAction = (value) =&gt; action(value);      return parsedAction; }   }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c.  <\/li>\n<li>\u0427\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0432 \u043f\u043e\u043b\u0435 <b>LinkedInputPoints <\/b>(\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <b>Action <\/b>\u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/li>\n<\/ol>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Mono-\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private void SearchMonoBehaviourMethod(LogicComponent component, IDictionary&lt;string, List&lt;MonoMethodData&gt;&gt; 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 &gt; 0) ? ((ExecuteOrderAttribute)priorityAttributes[0]).Order : int.MaxValue;              monoBehaviourMethods[method.Name].Add(new MonoMethodData(method, component, priority, _monoMethods[method.Name]));         }     } }<\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <b>Action<\/b>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c <b>MethodInfo.Invoke<\/b>.  <\/p>\n<pre><code class=\"cs\">private class MonoMethodData {     public int Order { get; private set; }      private Action _monoMethodWrapper;     private Action&lt;bool&gt; _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&lt;bool&gt;)Delegate.CreateDelegate(typeof(Action&lt;bool&gt;), target, method.Name);         }          Order = order;     }      public void Call() =&gt;_monoMethodWrapper();     public void Call(bool param) =&gt;  _monoMethodParamWrapper(param); }<\/code><\/pre>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <b>Call <\/b>\u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <b>bool <\/b>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0438\u043f\u0430 <b>ApplicationPause <\/b>\u0438 \u0442.\u043f.  <\/div>\n<\/div>\n<h4>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438<\/h4>\n<p>  \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438, \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0446\u0435\u043d\u0435 \u0438 \u043d\u0430 \u043d\u0435\u0435 \u043d\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u0431\u0430\u043d\u0434\u043b\u0430, \u043b\u0438\u0431\u043e \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0412 \u0446\u0435\u043b\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0438\u0437\u0432\u043d\u0435 \u043c\u0430\u043b\u043e \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0446\u0435\u043d\u044b, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e (\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e) \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void RunLogicExternal(LogicStorage logicStorage) {     var instances = new Dictionary&lt;string, LogicComponent&gt;();     var runMonoMethods = new Dictionary&lt;string, List&lt;MonoMethodData&gt;&gt;();      foreach (var monoMethodName in _monoMethods.Keys)     {         runMonoMethods.Add(monoMethodName, new List&lt;MonoMethodData&gt;());     }      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);     } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 <b>Mono<\/b>-\u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <b>Start <\/b>\u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438 \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430<\/h4>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0446\u0435\u043d\u044b.<br \/>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0432\u0441\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442.\u043f \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0447\u0438\u0441\u0442\u0438\u0432 \u043f\u0430\u043c\u044f\u0442\u044c. <br \/>  \u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043b\u043e\u0433\u0438\u043a\u0438  <\/p>\n<pre><code class=\"cs\">private class InstanceLogicData {     public readonly IList&lt;LogicComponent&gt; ComponentInstances = new List&lt;LogicComponent&gt;();     public readonly IDictionary&lt;string, List&lt;MonoMethodData&gt;&gt; MonoBehaviourMethods = new Dictionary&lt;string, List&lt;MonoMethodData&gt;&gt;();     public readonly IList&lt;IDisposable&gt; DisposableInstances = new List&lt;IDisposable&gt;();     }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435.<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public string RunLogicInstance(LogicStorage logicStorage, object data) {     var id = Guid.NewGuid().ToString();     var logicInstanceData = new InstanceLogicData();     var instances = new Dictionary&lt;string, LogicComponent&gt;();      _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; }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0418\u0437 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u0430, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043d\u0435\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043b\u043e\u0433\u0438\u043a\u0438.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">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); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0446\u0435\u043d\u044b \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438<\/h4>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <b>ScriptableObject <\/b>\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0441\u0446\u0435\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 <b>ScriptableObject.CreateInstance<\/b>, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 <b>MonoBehaviour<\/b>, \u0442. \u0435. \u043f\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d <b>OnDestroy <\/b>\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c <b>IDisposable<\/b>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0436\u0443 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <b>OnDisable<\/b>:  <\/p>\n<pre><code class=\"cs\">void OnDisable() {     foreach (var disposable in _disposableInstances)     {         disposable.Dispose();     }      _disposableInstances.Clear();     _monoBehaviourMethods.Clear();      foreach (var logicInstance in _logicInstances.Values)     {         foreach (var disposable in _disposableInstances)         {             disposable.Dispose();         }          logicInstance.DisposableInstances.Clear();         logicInstance.ComponentInstances.Clear();         logicInstance.MonoBehaviourMethods.Clear();     }      _logicInstances.Clear();      _instance = null; }<\/code><\/pre>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0446\u0435\u043d\u044b, \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0438 \u0432 \u043d\u0438\u0445.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 Unity<\/h3>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435, \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0446\u0435\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0446\u0435\u043d\u044b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0446\u0435\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0439. \u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0441\u0446\u0435\u043d\u0443. \u0421 \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <b>Unity<\/b>, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043f\u0440\u0435\u0444\u0430\u0431\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0441\u0441\u0435\u0442\u044b.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[Serializable] private class ObjectLinkData {     public string Id =&gt; _id;     public UnityEngine.Object Obj =&gt; _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&lt;ObjectLinkData&gt; _objectLinks = new List&lt;ObjectLinkData&gt;();  public UnityEngine.Object GetObject(string id) {     var linkData = _objectLinks.Find(link =&gt;     {         return string.Compare(link.Id, id, StringComparison.Ordinal) == 0;     });      return linkData?.Obj; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c:  <\/p>\n<ol>\n<li><b>Id<\/b> \u2013 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u0441\u0441\u0435\u0442\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0446\u0435\u043d\u044b<\/li>\n<li><b>Obj<\/b> \u2013 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0430\u0441\u0441\u0435\u0442 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0446\u0435\u043d\u044b <\/li>\n<\/ol>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043f\u043e \u043a\u043e\u0434\u0443, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0432\u0435\u0440\u0445\u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Unity<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> [Serializable] public class VLObject {     public string Id =&gt; _id;     public UnityEngine.Object Obj     {         get         {             if (_obj == null &amp;&amp; !_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&lt;T&gt;() where T : UnityEngine.Object     {         return Obj as T;     } } <\/code><\/pre>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>: \u0444\u043b\u0430\u0433 <b>_objNotFound <\/b>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043d\u0435\u043c \u043d\u0435\u0442.  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u044f \u0434\u0443\u043c\u0430\u044e, \u0441\u0442\u043e\u0438\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0432\u044b\u0448\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432 \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0442.\u0435. \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <b>Unity<\/b>. \u042f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b <b>Update <\/b>\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e <b>MonoBehaviour <\/b>\u0438 \u0447\u0435\u0440\u0435\u0437 <b>uViLEd<\/b> \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0432\u0441\u0435 \u0446\u0438\u0444\u0440\u044b \u043f\u0430\u0440\u0438\u0442\u0435\u0442\u043d\u044b \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e 1000 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0437\u0430 \u043a\u0430\u0434\u0440. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0446\u0435\u043d\u044b, \u043d\u043e \u0438 \u0442\u0443\u0442 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0446\u0438\u0444\u0440 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0445\u043e\u0442\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438 (\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b <b>Android <\/b>\u0438 <b>iOS<\/b>) \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f. \u0412 \u043b\u043e\u0433\u0438\u043a\u0435 \u043d\u0430 70 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 150 \u0441\u0432\u044f\u0437\u0435\u0439 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435) \u0446\u0438\u0444\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:  <\/p>\n<ol>\n<li><b>Android <\/b>(\u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 MediaTek 8-\u044f\u0434\u0435\u0440\u043d\u044b\u0439)<br \/>   \u2014 \u041d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 ~750\u043c\u0441<br \/>   \u2014 \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0446\u0435\u043d\u044b \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 ~250\u043c\u0441   <\/li>\n<li><b>iOS <\/b>(iPhone 5s)<br \/>   \u2014 \u041d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 ~100\u043c\u0441<br \/>   \u2014 \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0446\u0435\u043d\u044b \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 ~50\u043c\u0441   <\/li>\n<\/ol>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b <b>uViLEd <\/b>\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430 \u0438 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u043e\u043f\u043e\u0441\u0440\u0435\u0434\u043e\u0432\u0430\u043d\u043e \u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e, \u0445\u043e\u0442\u044f \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u0430\u0436\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0441\u0430\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440. \u0418 \u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  PS: \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u044f\u043d\u0443\u043b\u043e\u0441\u044c, \u043e \u0447\u0435\u043c \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0447\u0430\u0441\u0442\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Unity 3d, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0435 (\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c) \u043f\u043e\u0442\u0440\u044f\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u043b\u0430\u043d\u044b.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/post\/448190\/\">\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f Unity3d. \u0427\u0430\u0441\u0442\u044c 1<\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/466187\/\"> https:\/\/habr.com\/ru\/post\/466187\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/466187\/\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0432 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0441\u0432\u044f\u0442\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u044f\u0434\u0440\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f <b>Unity3d<\/b>. \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/448190\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0418\u0442\u0430\u043a, \u043e \u0447\u0435\u043c \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c? \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043b\u0435\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u043a\u0438. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u044f\u0434\u0440\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043e \u0447\u0435\u043c \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, <b>ScriptableObject<\/b>, \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u043b\u043e\u0433\u0438\u043a\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0430\u0441\u043f\u0435\u043a\u0442\u044b.<\/p>\n<p>  \u0421\u0442\u0430\u0442\u044c\u0438 \u0432 \u0441\u0435\u0440\u0438\u0438:<br \/>  <a href=\"https:\/\/habr.com\/ru\/post\/448190\/\">\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f Unity3d. \u0427\u0430\u0441\u0442\u044c 1<\/a>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-297521","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297521"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297521\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}