{"id":338051,"date":"2022-09-07T09:01:08","date_gmt":"2022-09-07T09:01:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=338051"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=338051","title":{"rendered":"<span>\u0421\u0435\u043a\u0440\u0435\u0442\u0438\u043a\u0438 Unity3d. \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u0444\u043b\u0430\u0433 STARTER_ASSETS_PACKAGES_CHECKED \u0432 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u0430\u0441\u0441\u0435\u0442\u0430\u0445<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/272\/b72\/b88\/272b72b88c3e32c6c01ef8f11c3f1aae.jpg\" width=\"1000\" height=\"563\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/272\/b72\/b88\/272b72b88c3e32c6c01ef8f11c3f1aae.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0444\u043b\u0430\u0433?<\/h2>\n<p>\u041a\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b \u043e\u0444\u0438\u0446\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u0441\u0435\u0442\u044b \u043e\u0442 Unity<strong> &#171;Starter Assets &#8212; Third Person Character Controller<\/strong>&#187; \u0438\u043b\u0438 <strong>&#171;Starter Assets &#8212; First Person Character Controller&#187; <\/strong>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043b \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u0442\u0430 (Project settings -> Player -> Other settings -> Script Compilation) \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <code>STARTER_ASSETS_PACKAGES_CHECKED<\/code>, \u043d\u043e \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f \u0438\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0441\u0441\u0435\u0442 <strong>&#171;Starter Assets &#8212; First Person Character Controller&#187;. <\/strong>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 &#171;ThirdPersonController&#187; \u0438 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c:<\/p>\n<pre><code>... namespace StarterAssets {     [RequireComponent(typeof(CharacterController))] #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED     [RequireComponent(typeof(PlayerInput))] #endif     public class ThirdPersonController : MonoBehaviour     { ...<\/code><\/pre>\n<pre><code>... #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED         private PlayerInput _playerInput; #endif ...<\/code><\/pre>\n<pre><code>... #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED             _playerInput = GetComponent&lt;PlayerInput>(); #else ...<\/code><\/pre>\n<p>\u041f\u043e \u0432\u0441\u044e\u0434\u0443 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>ENABLE_INPUT_SYSTEM<\/code>, \u0445\u043c&#8230; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0444\u043b\u0430\u0433 <code>ENABLE_INPUT_SYSTEM <\/code>\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0432\u043e\u0434\u0430, \u043d\u043e \u0432\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u043b\u0430\u0433 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0437\u0434\u0435\u0441\u044c \u0438 \u043a\u0442\u043e \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430? \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041d\u0430\u0448\u0435\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0444\u043b\u0430\u0433 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 &#171;StarterAssetsDeployMenu.cs&#187;, \u043d\u043e \u0443\u0436\u0435 \u0442\u0443\u0442 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d:<\/p>\n<pre><code>... #if STARTER_ASSETS_PACKAGES_CHECKED         private static void CheckCameras(Transform targetParent, string prefabFolder)         {             CheckMainCamera(prefabFolder);              GameObject vcam = GameObject.Find(CinemachineVirtualCameraName);  ...<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u0438\u043d\u0435\u043c\u0430\u0448\u0438\u043d\u043e\u0439. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 &#171;com.unity.inputsystem&#187; \u0438 &#171;com.unity.cinemachine&#187;. \u0421 \u044d\u0442\u0438\u043c \u0432\u0440\u043e\u0434\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u0432\u0441\u0435\u0442\u0430\u043a\u0438 \u043a\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430?<\/p>\n<h2>\u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0430\u0441\u0441\u0435\u0442\u0430, \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>Assets\\StarterAssets\\Editor\\PackageChecker\\StarterAssetsPackageChecker.dll<\/code> \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0435 \u043e\u0442\u0440\u0435\u0444\u043b\u0435\u043a\u0442\u0438\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\/\/ Decompiled with JetBrains decompiler \/\/ Type: StarterAssetsPackageChecker.PackageChecker \/\/ Assembly: StarterAssetsPackageChecker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null \/\/ MVID: 2A478D25-B4D8-4B2D-BB34-CB7D710194F5 \/\/ Assembly location: D:\\YandexDisk\\Development\\Games\\secrets-from-unity\\Assets\\StarterAssets\\Editor\\PackageChecker\\StarterAssetsPackageChecker.dll  using System; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; using UnityEngine;  namespace StarterAssetsPackageChecker {   public static class PackageChecker   {     private static ListRequest _clientList;     private static SearchRequest _compatibleList;     private static List&lt;PackageChecker.PackageEntry> _packagesToAdd;     private static AddRequest[] _addRequests;     private static bool[] _installRequired;     private static PackageChecker.Settings _settings;      [InitializeOnLoadMethod]     private static void CheckPackage()     {       PackageChecker._settings = new PackageChecker.Settings();       string[] files = Directory.GetFiles(Application.dataPath, \"PackageCheckerSettings.json\", SearchOption.AllDirectories);       if (files.Length != 0)         JsonUtility.FromJsonOverwrite(File.ReadAllText(files[0]), (object) PackageChecker._settings);       if (PackageChecker.CheckScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine))         return;       PackageChecker._packagesToAdd = new List&lt;PackageChecker.PackageEntry>();       PackageChecker._clientList = (ListRequest) null;       PackageChecker._compatibleList = (SearchRequest) null;       PackageChecker._packagesToAdd = new List&lt;PackageChecker.PackageEntry>();       foreach (string str in PackageChecker._settings.PackagesToAdd)       {         char[] chArray = new char[1]{ '@' };         string[] strArray = str.Split(chArray);         PackageChecker.PackageEntry packageEntry = new PackageChecker.PackageEntry()         {           Name = strArray[0],           Version = strArray.Length > 1 ? strArray[1] : (string) null         };         PackageChecker._packagesToAdd.Add(packageEntry);       }       PackageChecker.SetScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine);       PackageChecker._compatibleList = Client.SearchAll();       while (!PackageChecker._compatibleList.IsCompleted)       {         if ((PackageChecker._compatibleList.Status == StatusCode.Failure || PackageChecker._compatibleList.Error != null) &amp;&amp; PackageChecker._compatibleList.Error != null)         {           Debug.LogError((object) PackageChecker._compatibleList.Error.message);           break;         }       }       PackageChecker._clientList = Client.List();       while (!PackageChecker._clientList.IsCompleted)       {         if ((PackageChecker._clientList.Status == StatusCode.Failure || PackageChecker._clientList.Error != null) &amp;&amp; PackageChecker._clientList.Error != null)         {           Debug.LogError((object) PackageChecker._clientList.Error.message);           break;         }       }       PackageChecker._addRequests = new AddRequest[PackageChecker._packagesToAdd.Count];       PackageChecker._installRequired = new bool[PackageChecker._packagesToAdd.Count];       for (int index = 0; index &lt; PackageChecker._installRequired.Length; ++index)         PackageChecker._installRequired[index] = false;       List&lt;UnityEditor.PackageManager.PackageInfo> packageInfoList1 = new List&lt;UnityEditor.PackageManager.PackageInfo>();       List&lt;UnityEditor.PackageManager.PackageInfo> packageInfoList2 = new List&lt;UnityEditor.PackageManager.PackageInfo>();       foreach (UnityEditor.PackageManager.PackageInfo packageInfo in PackageChecker._compatibleList.Result)         packageInfoList1.Add(packageInfo);       foreach (UnityEditor.PackageManager.PackageInfo packageInfo in (IEnumerable&lt;UnityEditor.PackageManager.PackageInfo>) PackageChecker._clientList.Result)         packageInfoList2.Add(packageInfo);       for (int index = 0; index &lt; PackageChecker._packagesToAdd.Count; ++index)       {         if (PackageChecker._packagesToAdd[index].Version == null)         {           foreach (UnityEditor.PackageManager.PackageInfo packageInfo in packageInfoList1)           {             if (PackageChecker._packagesToAdd[index].Name == packageInfo.name &amp;&amp; packageInfo.versions.verified != string.Empty)             {               PackageChecker._packagesToAdd[index].Version = packageInfo.versions.verified;               PackageChecker._installRequired[index] = true;             }           }         }         foreach (UnityEditor.PackageManager.PackageInfo packageInfo in packageInfoList2)         {           if (PackageChecker._packagesToAdd[index].Name == packageInfo.name)           {             switch (PackageChecker.CompareVersion(PackageChecker._packagesToAdd[index].Version, packageInfo.version))             {               case -1:                 PackageChecker._installRequired[index] = (EditorUtility.DisplayDialog(\"Confirm Package Downgrade\", \"The version of \\\"\" + PackageChecker._packagesToAdd[index].Name + \"\\\" in this project is \" + packageInfo.version + \". The latest verified version is \" + PackageChecker._packagesToAdd[index].Version + \". \" + packageInfo.version + \" is unverified. Would you like to downgrade it to the latest verified version? (Recommended)\", \"Yes\", \"No\") ? 1 : 0) != 0;                 Debug.Log((object) (\"&lt;b>Package version ahead&lt;\/b>: \" + packageInfo.packageId + \" is newer than latest verified version \" + packageInfo.versions.verified + \", skipped install\"));                 continue;               case 0:                 PackageChecker._installRequired[index] = false;                 Debug.Log((object) (\"&lt;b>Package version match&lt;\/b>: \" + packageInfo.packageId + \" matches latest verified version \" + packageInfo.versions.verified + \". Skipped install\"));                 continue;               case 1:                 PackageChecker._installRequired[index] = (EditorUtility.DisplayDialog(\"Confirm Package Upgrade\", \"The version of \\\"\" + PackageChecker._packagesToAdd[index].Name + \"\\\" in this project is \" + packageInfo.version + \". The latest verified version is \" + PackageChecker._packagesToAdd[index].Version + \". Would you like to upgrade it to the latest version? (Recommended)\", \"Yes\", \"No\") ? 1 : 0) != 0;                 Debug.Log((object) (\"&lt;b>Package version behind&lt;\/b>: \" + packageInfo.packageId + \" is behind latest verified version \" + packageInfo.versions.verified + \". prompting user install\"));                 continue;               default:                 continue;             }           }         }       }       for (int index = 0; index &lt; PackageChecker._packagesToAdd.Count; ++index)       {         if (PackageChecker._installRequired[index])           PackageChecker._addRequests[index] = PackageChecker.InstallSelectedPackage(PackageChecker._packagesToAdd[index].Name, PackageChecker._packagesToAdd[index].Version);       }       PackageChecker.ReimportPackagesByKeyword();     }      private static AddRequest InstallSelectedPackage(       string packageName,       string packageVersion)     {       if (packageVersion != null)       {         packageName = packageName + \"@\" + packageVersion;         Debug.Log((object) (\"&lt;b>Adding package&lt;\/b>: \" + packageName));       }       AddRequest addRequest = Client.Add(packageName);       while (!addRequest.IsCompleted)       {         if ((addRequest.Status == StatusCode.Failure || addRequest.Error != null) &amp;&amp; addRequest.Error != null)         {           Debug.LogError((object) addRequest.Error.message);           return (AddRequest) null;         }       }       return addRequest;     }      private static void ReimportPackagesByKeyword()     {       AssetDatabase.Refresh();       AssetDatabase.ImportAsset(PackageChecker._settings.EditorFolderRoot, ImportAssetOptions.ImportRecursive);     }      public static int CompareVersion(string latestVerifiedVersion, string projectVersion)     {       string[] strArray1 = latestVerifiedVersion.Split('.');       string[] strArray2 = projectVersion.Split('.');       int index1 = 0;       for (int index2 = 0; index1 &lt; strArray1.Length || index2 &lt; strArray2.Length; ++index2)       {         int num1 = 0;         int num2 = 0;         if (index1 &lt; strArray1.Length)           num1 = Convert.ToInt32(strArray1[index1]);         if (index2 &lt; strArray2.Length)           num2 = Convert.ToInt32(strArray2[index2]);         if (num1 > num2)           return 1;         if (num1 &lt; num2)           return -1;         ++index1;       }       return 0;     }      private static bool CheckScriptingDefine(string scriptingDefine) => PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Contains(scriptingDefine);      private static void SetScriptingDefine(string scriptingDefine)     {       BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup;       string defineSymbolsForGroup = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);       if (defineSymbolsForGroup.Contains(scriptingDefine))         return;       string defines = defineSymbolsForGroup + \";\" + scriptingDefine;       PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines);     }      public static void RemovePackageCheckerScriptingDefine()     {       BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup;       string defineSymbolsForGroup = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);       if (!defineSymbolsForGroup.Contains(PackageChecker._settings.PackageCheckerScriptingDefine))         return;       string defines = defineSymbolsForGroup.Replace(PackageChecker._settings.PackageCheckerScriptingDefine, \"\");       PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines);     }      private class PackageEntry     {       public string Name;       public string Version;     }      [Serializable]     private class Settings     {       public string EditorFolderRoot = \"Assets\/StarterAssets\/\";       public string[] PackagesToAdd = new string[2]       {         \"com.unity.cinemachine\",         \"com.unity.inputsystem\"       };        public string PackageCheckerScriptingDefine => \"STARTER_ASSETS_PACKAGES_CHECKED\";     }   } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0447\u0442\u043e \u043c\u044b \u0442\u0443\u0442 \u0432\u0438\u0434\u0438\u043c? \u041d\u0430\u0448 \u0444\u043b\u0430\u0436\u043e\u0447\u0435\u043a <code>STARTER_ASSETS_PACKAGES_CHECKED<\/code>)<\/p>\n<pre><code> [Serializable]     private class Settings     {       public string EditorFolderRoot = \"Assets\/StarterAssets\/\";       public string[] PackagesToAdd = new string[2]       {         \"com.unity.cinemachine\",         \"com.unity.inputsystem\"       };        public string PackageCheckerScriptingDefine => \"STARTER_ASSETS_PACKAGES_CHECKED\";     }<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0438\u0441\u0442\u0438\u043d\u0435. <\/p>\n<h2>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u0442\u0440\u043e\u0445\u0430 StarterAssetsPackageChecker.dll<\/h2>\n<p>\u0418\u0437\u0443\u0447\u0438\u0432 \u043a\u043e\u0434 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u044f \u043f\u0440\u0438\u0448\u043e\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443 \u0447\u0442\u043e \u044d\u0442\u043e &#8212; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0430\u043b\u044f\u0442\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Unity. \u041e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043f\u0440\u0438 &#171;\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438&#187; \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u043e \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442<code>[InitializeOnLoadMethod]<\/code>\u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\u0434\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c &#171;PackageCheckerSettings.json&#187;, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043c\u0430\u043f\u044f\u0442\u0441\u044f \u043d\u0430 <code>PackageChecker._settings<\/code>.<\/p>\n<pre><code>...  [InitializeOnLoadMethod]     private static void CheckPackage()     {       PackageChecker._settings = new PackageChecker.Settings();       string[] files = Directory.GetFiles(Application.dataPath, \"PackageCheckerSettings.json\", SearchOption.AllDirectories);       if (files.Length != 0)         JsonUtility.FromJsonOverwrite(File.ReadAllText(files[0]), (object) PackageChecker._settings); ...<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 &#171;PackageCheckerSettings.json&#187;, \u0438 \u0442\u0443\u0442 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043e\u043f\u044f\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u0430\u043a\u0435\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e &#171;EditorFolderRoot&#187;:<\/p>\n<pre><code>{     \"EditorFolderRoot\": \"Assets\/StarterAssets\/\",     \"PackagesToAdd\": [         \"com.unity.cinemachine\",         \"com.unity.inputsystem\"     ] }<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448\u0443 dll. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u043a\u043e\u0434\u0443 \u0438\u0434\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>private static AddRequest InstallSelectedPackage<\/code>. \u0418 \u0442\u0443\u0442 \u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0443 \u0437\u0430\u0432\u0435\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 <code>STARTER_ASSETS_PACKAGES_CHECKED<\/code> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>PackageChecker.SetScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine); ...  private static void SetScriptingDefine(string scriptingDefine)     {       BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup;       string defineSymbolsForGroup = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);       if (defineSymbolsForGroup.Contains(scriptingDefine))         return;       string defines = defineSymbolsForGroup + \";\" + scriptingDefine;       PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines);     }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b\u043e \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u0440\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 CheckPackage() \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c. \u0412\u0430\u0443\u043b\u044f!!!<\/p>\n<pre><code> if (PackageChecker.CheckScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine))         return;<\/code><\/pre>\n<p>\u0410 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 <code>\"EditorFolderRoot\": \"Assets\/StarterAssets\/\"<\/code> \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430? \u0410 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0430\u0441\u0441\u0435\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0438\u043c\u043f\u043e\u0440\u0442 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/p>\n<pre><code>  private static void ReimportPackagesByKeyword()     {       AssetDatabase.Refresh();       AssetDatabase.ImportAsset(PackageChecker._settings.EditorFolderRoot, ImportAssetOptions.ImportRecursive);     }<\/code><\/pre>\n<h2>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435?<\/h2>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>StarterAssetsPackageChecker.dll<\/code> \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>PackageCheckerSettings.json<\/code> \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Unity. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u043a \u0441\u0435\u0431\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 Editor \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044f \u0443\u043b\u0443\u0447\u0448\u0438\u043b \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <code>StarterAssetsPackageChecker.dll <\/code>\u0442\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u044b \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>public string PackageCheckerScriptingDefine => \"STARTER_ASSETS_PACKAGES_CHECKED\"<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u0444\u043b\u0430\u0433\u0430 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0430\u0441\u0441\u0435\u0442\u0430\u0445. \u0415\u0449\u0435 \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u0430\u043c <code>PackageCheckerSettings.json<\/code> \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u043e\u043f\u0430\u0432\u0448\u0435\u043c\u0443\u0441\u044f \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>\u041c\u043e\u0433\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0447\u0442\u043e \u0443 \u043a\u0430\u043c\u0430\u043d\u0434\u044b Unity \u044d\u0442\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 &#171;\u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0430&#187; \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0439. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0436\u0435\u043b\u0430\u0435\u043c Unity \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c scope \u0432 \u0444\u0430\u0439\u043b\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0430.<\/p>\n<hr\/>\n<blockquote>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u043c\u043e\u0438\u043c \u0441\u043e\u0446 \u0441\u0435\u0442\u044f\u043c:<\/p>\n<p>YouTube:\u00a0<a href=\"https:\/\/www.youtube.com\/channel\/UC8Pm1hZfQMKE8nfSdYqKugg\" rel=\"noopener noreferrer nofollow\">https:\/\/www.youtube.com\/channel\/UC8Pm1hZfQMKE8nfSdYqKugg<\/a><\/p>\n<p>VK:\u00a0<a href=\"https:\/\/vk.com\/stupenkovanton\" rel=\"noopener noreferrer nofollow\">https:\/\/vk.com\/stupenkovanton<\/a><\/p>\n<p>GitHub:\u00a0<a href=\"https:\/\/github.com\/stupenkov\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/stupenkov<\/a><\/p>\n<p>Linkedin:\u00a0<a href=\"https:\/\/www.linkedin.com\/in\/stupenkov\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.linkedin.com\/in\/stupenkov\/<\/a><\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/686526\/\"> https:\/\/habr.com\/ru\/post\/686526\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0444\u043b\u0430\u0433?<\/h2>\n<p>\u041a\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b \u043e\u0444\u0438\u0446\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u0441\u0435\u0442\u044b \u043e\u0442 Unity<strong> &#171;Starter Assets &#8212; Third Person Character Controller<\/strong>&#187; \u0438\u043b\u0438 <strong>&#171;Starter Assets &#8212; First Person Character Controller&#187; <\/strong>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043b \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u0442\u0430 (Project settings -> Player -> Other settings -> Script Compilation) \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <code>STARTER_ASSETS_PACKAGES_CHECKED<\/code>, \u043d\u043e \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f \u0438\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0441\u0441\u0435\u0442 <strong>&#171;Starter Assets &#8212; First Person Character Controller&#187;. <\/strong>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 &#171;ThirdPersonController&#187; \u0438 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c:<\/p>\n<pre><code>... namespace StarterAssets {     [RequireComponent(typeof(CharacterController))] #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED     [RequireComponent(typeof(PlayerInput))] #endif     public class ThirdPersonController : MonoBehaviour     { ...<\/code><\/pre>\n<pre><code>... #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED         private PlayerInput _playerInput; #endif ...<\/code><\/pre>\n<pre><code>... #if ENABLE_INPUT_SYSTEM &amp;&amp; STARTER_ASSETS_PACKAGES_CHECKED             _playerInput = GetComponent&lt;PlayerInput>(); #else ...<\/code><\/pre>\n<p>\u041f\u043e \u0432\u0441\u044e\u0434\u0443 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>ENABLE_INPUT_SYSTEM<\/code>, \u0445\u043c&#8230; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0444\u043b\u0430\u0433 <code>ENABLE_INPUT_SYSTEM <\/code>\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0432\u043e\u0434\u0430, \u043d\u043e \u0432\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u043b\u0430\u0433 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0437\u0434\u0435\u0441\u044c \u0438 \u043a\u0442\u043e \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430? \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041d\u0430\u0448\u0435\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0444\u043b\u0430\u0433 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 &#171;StarterAssetsDeployMenu.cs&#187;, \u043d\u043e \u0443\u0436\u0435 \u0442\u0443\u0442 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d:<\/p>\n<pre><code>... #if STARTER_ASSETS_PACKAGES_CHECKED         private static void CheckCameras(Transform targetParent, string prefabFolder)         {             CheckMainCamera(prefabFolder);              GameObject vcam = GameObject.Find(CinemachineVirtualCameraName);  ...<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u0438\u043d\u0435\u043c\u0430\u0448\u0438\u043d\u043e\u0439. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 &#171;com.unity.inputsystem&#187; \u0438 &#171;com.unity.cinemachine&#187;. \u0421 \u044d\u0442\u0438\u043c \u0432\u0440\u043e\u0434\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u0432\u0441\u0435\u0442\u0430\u043a\u0438 \u043a\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430?<\/p>\n<h2>\u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0430\u0441\u0441\u0435\u0442\u0430, \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>Assets\\StarterAssets\\Editor\\PackageChecker\\StarterAssetsPackageChecker.dll<\/code> \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0435 \u043e\u0442\u0440\u0435\u0444\u043b\u0435\u043a\u0442\u0438\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\/\/ Decompiled with JetBrains decompiler \/\/ Type: StarterAssetsPackageChecker.PackageChecker \/\/ Assembly: StarterAssetsPackageChecker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null \/\/ MVID: 2A478D25-B4D8-4B2D-BB34-CB7D710194F5 \/\/ Assembly location: D:\\YandexDisk\\Development\\Games\\secrets-from-unity\\Assets\\StarterAssets\\Editor\\PackageChecker\\StarterAssetsPackageChecker.dll  using System; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; using UnityEngine;  namespace StarterAssetsPackageChecker {   public static class PackageChecker   {     private static ListRequest _clientList;     private static SearchRequest _compatibleList;     private static List&lt;PackageChecker.PackageEntry> _packagesToAdd;     private static AddRequest[] _addRequests;     private static bool[] _installRequired;     private static PackageChecker.Settings _settings;      [InitializeOnLoadMethod]     private static void CheckPackage()     {       PackageChecker._settings = new PackageChecker.Settings();       string[] files = Directory.GetFiles(Application.dataPath, \"PackageCheckerSettings.json\", SearchOption.AllDirectories);       if (files.Length != 0)         JsonUtility.FromJsonOverwrite(File.ReadAllText(files[0]), (object) PackageChecker._settings);       if (PackageChecker.CheckScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine))         return;       PackageChecker._packagesToAdd = new List&lt;PackageChecker.PackageEntry>();       PackageChecker._clientList = (ListRequest) null;       PackageChecker._compatibleList = (SearchRequest) null;       PackageChecker._packagesToAdd = new List&lt;PackageChecker.PackageEntry>();       foreach (string str in PackageChecker._settings.PackagesToAdd)       {         char[] chArray = new char[1]{ '@' };         string[] strArray = str.Split(chArray);         PackageChecker.PackageEntry packageEntry = new PackageChecker.PackageEntry()         {           Name = strArray[0],           Version = strArray.Length > 1 ? strArray[1] : (string) null         };         PackageChecker._packagesToAdd.Add(packageEntry);       }       PackageChecker.SetScriptingDefine(PackageChecker._settings.PackageCheckerScriptingDefine);       PackageChecker._compatibleList = Client.SearchAll();       while (!PackageChecker._compatibleList.IsCompleted)       {         if ((PackageChecker._compatibleList.Status == StatusCode.Failure || PackageChecker._compatibleList.Error != null) &amp;&amp; PackageChecker._compatibleList.Error != null)         {           Debug.LogError((object) PackageChecker._compatibleList.Error.message);           break;         }       }       PackageChecker._clientList = Client.List();       while (!PackageChecker._clientList.IsCompleted)       {         if ((PackageChecker._clientList.Status == StatusCode.Failure || PackageChecker._clientList.Error != null) &amp;&amp; PackageChecker._clientList.Error != null)         {           Debug.LogError((object) PackageChecker._clientList.Error.message);           break;         }       }       PackageChecker._addRequests = new AddRequest[PackageChecker._packagesToAdd.Count];       PackageChecker._installRequired = new bool[PackageChecker._packagesToAdd.Count];       for (int index = 0; index &lt; PackageChecker._installRequired.Length; ++index)         PackageChecker._installRequired[index] = false;       List&lt;UnityEditor.PackageManager.PackageInfo> packageInfoList1 = new List&lt;UnityEditor.PackageManager.PackageInfo>();       List&lt;UnityEditor.PackageManager.PackageInfo> packageInfoList2 = new List&lt;UnityEditor.PackageManager.PackageInfo>();       foreach (UnityEditor.PackageManager.PackageInfo packageInfo in PackageChecker._compatibleList.Result)         packageInfoList1.Add(packageInfo);       foreach (UnityEditor.PackageManager.PackageInfo packageInfo in (IEnumerable&lt;UnityEditor.PackageManager.PackageInfo>) PackageChecker._clientList.Result)         packageInfoList2.Add(packageInfo);       for (int index = 0; index &lt; PackageChecker._packagesToAdd.Count; ++index)       {         if (PackageChecker._packagesToAdd[index].Version == null)         {           foreach (UnityEditor.PackageManager.PackageInfo packageInfo in packageInfoList1)           {             if (PackageChecker._packagesToAdd[index].Name == packageInfo.name &amp;&amp; packageInfo.versions.verified != string.Empty)             {               PackageChecker._packagesToAdd[index].Version = packageInfo.versions.verified;               PackageChecker._installRequired[index] = true;             }           }         }         foreach (UnityEditor.PackageManager.PackageInfo packageInfo in packageInfoList2)         {           if (PackageChecker._packagesToAdd[index].Name == packageInfo.name)           {             switch (PackageChecker.CompareVersion(PackageChecker._packagesToAdd[index].Version, packageInfo.version))             {               case -1:                 PackageChecker._installRequired[index] = (EditorUtility.DisplayDialog(\"Confirm Package Downgrade\", \"The version of \\\"\" + PackageChecker._packagesToAdd[index].Name + \"\\\" in this project is \" + packageInfo.version + \". The latest verified version is \" + PackageChecker._packagesToAdd[index].Version + \". \" + packageInfo.version + \" is unverified. Would you like to downgrade it to the latest verified version? (Recommended)\", \"Yes\", \"No\") ? 1 : 0) != 0;                 Debug.Log((object) (\"&lt;b>Package version ahead&lt;\/b>: \" + packageInfo.packageId + \" is newer than latest verified version \" + packageInfo.versions.verified + \", skipped install\"));                 continue;               case 0:                 PackageChecker._installRequired[index] = false;                 Debug.Log((object) (\"&lt;b>Package version match&lt;\/b>: \" + packageInfo.packageId + \" matches latest verified version \" + packageInfo.versions.verified + \". Skipped install\"));                 continue;               case 1:                 PackageChecker._installRequired[index] = (EditorUtility.DisplayDialog(\"Confirm Package Upgrade\", \"The version of \\\"\" + PackageChecker._packagesToAdd[index].Name + \"\\\" in this project is \" + packageInfo.version + \". The latest verified version is \" + PackageChecker._packagesToAdd[index].Version + \". Would you like to upgrade it to the latest version? (Recommended)\", \"Yes\", \"No\") ? 1 : 0) != 0;                 Debug.Log((object) (\"&lt;b>Package version behind&lt;\/b>: \" + packageInfo.packageId + \" is behind latest verified version \" + packageInfo.versions.verified + \". prompting user install\"));                 continue;               default:                 continue;             }           }         }       }       for (int index = 0; index &lt; PackageChecker._packagesToAdd.Count; ++index)       {         if (PackageChecker._installRequired[index])           PackageChecker._addRequests[index] = PackageChecker.InstallSelectedPackage(PackageChecker._packagesToAdd[index].Name, PackageChecker._packagesToAdd[index].Version);       }       PackageChecker.ReimportPackagesByKeyword();     }      private static AddRequest InstallSelectedPackage(       string packageName,       string packageVersion)     {       if (packageVersion != null)       {         packageName = packageName + \"@\" + packageVersion;         Debug.Log((object) (\"&lt;b>Adding package&lt;\/b>: \" + packageName));       }       AddRequest addRequest = Client.Add(packageName);       while (!addRequest.IsCompleted)       {         if ((addRequest.Status == StatusCode.Failure || addRequest.Error != null) &amp;&amp; addRequest.Error != null)         {           Debug.LogError((object) addRequest.Error.message);           return (AddRequest) null;         }       }       return addRequest;     }      private static void ReimportPackagesByKeyword()     {       AssetDatabase.Refresh();       <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-338051","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338051","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=338051"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338051\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=338051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=338051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=338051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}