命名MonoBehaviour类GameManager时的特殊图标

Unity中的GameManager这个名称有什么特别的东西让设计师采取不同的行动吗? 我有一个名为GameManager的类,它是从ScriptableObject派生出来的,设计器对该类做了一些不同的事情,而不是我的其他ScriptableObject派生类。

我可以通过将名称从GameManagerManager来validation此行为,并且Unity编辑器的行为方式不同。

我对GameManager定义如下:

 [CreateAssetMenu(menuName = "Managers/GameManager")] public class GameManager : ScriptableObject { // ... } 

以下是我的C#类命名为GameManager时Project视图的样子。 注意Game Manager旁边的不同图标。

在此处输入图像描述

如果我删除该资产,将基础C#类名称更改为Manager ,然后再次创建资产,图标是正常图标,而不是齿轮。

在此处输入图像描述

另一个问题是,如果我有一个包含具有GameManager类型属性的MonoBehaviour的游戏对象,当我点击下一个小圆圈图标时,Unity将不会显示现有的GameManager资产到检查员的现场。 Unity允许我将GameManager资源从Project视图拖到字段中,但Unity不会让我通过单击字段来选择引用。 如下面的屏幕截图所示,Unity不会给我选择我的GameManager资产的选项,即使它在项目视图中可用。

在此处输入图像描述

在此处输入图像描述

但是,如果我将基础C#类的名称从GameManagerManager ,Unity编辑器可以正常工作,如下所示。

在此处输入图像描述

GameManager的C#类名称是否有GameManager ,或者这种行为可能是由于其他原因造成的?

Unity中有特殊的脚本名称。 当您使用其中任何一个时,特殊图标将应用于该脚本。 GameManager是一个特殊的脚本名称。 Search也是Unity中的另一个特殊脚本名称。 不幸的是,它们没有列在Unity网站的某个地方,但你绝对知道何时使用其中一个特殊的脚本名称。

如果您仍希望使用这些特殊名称来命名脚本,并且还想删除特殊图标或行为,请在命名空间中使用特殊名称将该脚本括起来。

 namespace Ben { public class Search : MonoBehaviour { } } 

Search脚本的特殊图标现在应该消失了。 这也适用于GameManager脚本。

编辑

由于人们想要了解更多,基本上,Unity有这些包含其图标的重要文件:

  • unity default resources
  • unity editor resources
  • unity_builtin_extra

\Editor\Data\Resources目录中。 如果将这些文件复制到\Assets\Resources目录并将其中三个的文件扩展名更改为.asset ,则可以在展开这些文件时查看这些文件中的资源和图标。

找到特殊图标的秘诀在于任何具有以" Icon"结尾的命名的" Icon"都可能是特殊图标。 例如, GameManager有一个名为GameManager Icon 。 命名您的脚本GameManager将使其使用GameManager Icon 。 对于所有图标而言,这并非完全正确,但大部分都是如此。 很少有人不这样做。

我制作了一个脚本来自动执行编辑器中的上述指令。 它适用于Unity 2017但在Unity 2018似乎存在问题,我没有时间来解决它。 它在执行时显示Unity 2018中的许多错误,但之后仍然可以正常工作。

 using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEditor; using System.IO; /* Detects possible special script names By Programmer https://stackoverflow.com/users/3785314/programmer */ public class SpecialIconLister : MonoBehaviour { [MenuItem("Programmer/Show Special Icons")] static void MainProc() { if (EditorUtility.DisplayDialog("Log and copy special Icon names?", "Are you sure you want to log and copy spacial icons to the clipboard?", "Yes", "Cancel")) { if (IsPlayingInEditor()) return; //"unity default resources" contains models, materials an shaders //"unity editor resources" contains most icons lile GameManager Search and so on //"unity_builtin_extra" contains UI images and Shaders //Files to copy to the Resources folder in the project string file1 = UnityEditorResourcesFilePath("unity default resources"); string file2 = UnityEditorResourcesFilePath("unity editor resources"); string file3 = UnityEditorResourcesFilePath("unity_builtin_extra"); string dest1 = UnityProjectResourcesPath("unity default resources.asset"); string dest2 = UnityProjectResourcesPath("unity editor resources.asset"); string dest3 = UnityProjectResourcesPath("unity_builtin_extra.asset"); //Create the Resources folder in the Project folder if it doesn't exist VerifyResourcesFolder(dest1); VerifyResourcesFolder(dest2); VerifyResourcesFolder(dest3); //Copy each file to the resouces folder if (!File.Exists(dest1)) FileUtil.CopyFileOrDirectoryFollowSymlinks(file1, dest1); if (!File.Exists(dest2)) FileUtil.CopyFileOrDirectoryFollowSymlinks(file2, dest2); if (!File.Exists(dest3)) FileUtil.CopyFileOrDirectoryFollowSymlinks(file3, dest3); Debug.unityLogger.logEnabled = false; //Refresh Editor AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); //Load every object in that folder Resources.LoadAll(""); //List the special icons GetSpecialIcons(); CleanUp(dest1); CleanUp(dest2); CleanUp(dest3); //Refresh Editor AssetDatabase.Refresh(); Resources.UnloadUnusedAssets(); AssetDatabase.Refresh(); Debug.unityLogger.logEnabled = false; } } static void SelectAsset(string resourcesFilePath) { UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(resourcesFilePath, typeof(UnityEngine.Object)); Selection.activeObject = obj; } static string AsoluteToRelative(string absolutePath) { string relativePath = null; if (absolutePath.StartsWith(Application.dataPath)) { relativePath = "Assets" + absolutePath.Substring(Application.dataPath.Length); } return relativePath; } static void GetSpecialIcons() { //Get All Editor icons List allIcons; allIcons = new List(Resources.FindObjectsOfTypeAll(typeof(Texture))); allIcons = allIcons.OrderBy(a => a.name, StringComparer.OrdinalIgnoreCase).ToList(); //Get special icons from the icons List specialIconsList = new List(); string suffix = " Icon"; foreach (UnityEngine.Object icList in allIcons) { if (!IsEditorBuiltinIcon(icList)) continue; //Check if icon name ends with the special suffix if (icList.name.EndsWith(suffix)) { //Remove suffix from the icon name then add it to the special icons List if it doesn't exist yet string sIcon = icList.name.Substring(0, icList.name.LastIndexOf(suffix)); if (!specialIconsList.Contains(sIcon)) specialIconsList.Add(sIcon); } } //Sort special icons from the icons specialIconsList = specialIconsList.OrderBy(a => a, StringComparer.OrdinalIgnoreCase).ToList(); Debug.unityLogger.logEnabled = true; Debug.Log("Total # Icons found: " + allIcons.Count); Debug.Log("Special # Icons found: " + specialIconsList.Count); //Add new line after each icon for easy display or copying string specialIcon = string.Join(Environment.NewLine, specialIconsList.ToArray()); Debug.Log(specialIcon); //Copy the special icon names to the clipboard GUIUtility.systemCopyBuffer = specialIcon; Debug.LogWarning("Special Icon names copied to cilpboard"); Debug.LogWarning("Hold Ctrl+V to paste on any Editor"); } static string UnityEditorResourcesFilePath(string fileName = null) { //C:/Program Files/Unity/Editor/Unity.exe string tempPath = EditorApplication.applicationPath; //C:/Program Files/Unity/Editor tempPath = Path.GetDirectoryName(tempPath); tempPath = Path.Combine(tempPath, "Data"); tempPath = Path.Combine(tempPath, "Resources"); //C:\Program Files\Unity\Editor\Data\Resources if (fileName != null) tempPath = Path.Combine(tempPath, fileName); return tempPath; } static string UnityProjectResourcesPath(string fileName = null) { string tempPath = Application.dataPath; tempPath = Path.Combine(tempPath, "Resources"); if (fileName != null) tempPath = Path.Combine(tempPath, fileName); return tempPath; } static bool IsEditorBuiltinIcon(UnityEngine.Object icon) { if (!EditorUtility.IsPersistent(icon)) return false; return true; } static void VerifyResourcesFolder(string resourcesPath) { //Create Directory if it does not exist if (!Directory.Exists(Path.GetDirectoryName(resourcesPath))) { Directory.CreateDirectory(Path.GetDirectoryName(resourcesPath)); } } static bool IsPlayingInEditor() { return (Application.isPlaying && Application.isEditor); } static void CleanUp(string resourcesFilePath) { FileAttributes attr = File.GetAttributes(resourcesFilePath); if (!((attr & FileAttributes.Directory) == FileAttributes.Directory) && File.Exists(resourcesFilePath)) { FileUtil.DeleteFileOrDirectory(resourcesFilePath); } System.GC.Collect(); } } 

下面是当您转到Programmer —> Show Special Icons菜单时,将示例转储复制到我的剪贴板。 它将显示所有可能的特殊字符。 其中一些不是,但大多数是:

在此处输入图像描述

 AimConstraint AnalyticsTracker AnchorBehaviour AnchorInputListenerBehaviour Animation AnimationClip AnimationWindowEvent Animator AnimatorController AnimatorOverrideController AnimatorState AnimatorStateMachine AnimatorStateTransition AnyStateNode AreaEffector2D AreaLight AspectRatioFitter Assembly AssemblyDefinitionAsset AssetStore AudioChorusFilter AudioClip AudioDistortionFilter AudioEchoFilter AudioHighPassFilter AudioListener AudioLowPassFilter AudioMixerController AudioMixerGroup AudioMixerSnapshot AudioMixerView AudioReverbFilter AudioReverbZone AudioSource AudioSpatializerMicrosoft Avatar AvatarMask BillboardAsset BillboardRenderer BlendTree boo Script BoxCollider BoxCollider2D BuoyancyEffector2D Button Camera Canvas CanvasGroup CanvasRenderer CanvasScaler CapsuleCollider CapsuleCollider2D CGProgram CharacterController CharacterJoint ChorusFilter CircleCollider2D Cloth CloudRecoBehaviour CollabChanges CollabChangesConflict CollabChangesDeleted CollabConflict CollabCreate CollabDeleted CollabEdit CollabExclude CollabMoved CompositeCollider2D ComputeShader ConfigurableJoint ConstantForce ConstantForce2D ContentPositioningBehaviour ContentSizeFitter cs Script Cubemap CylinderTargetBehaviour DefaultAsset DefaultSlate DirectionalLight DistanceJoint2D dll Script Dropdown d_AimConstraint d_AnchorBehaviour d_AnchorInputListenerBehaviour d_AspectRatioFitter d_AudioMixerView d_Canvas d_CanvasGroup d_CanvasRenderer d_CanvasScaler d_CloudRecoBehaviour d_CollabChanges d_CollabChangesConflict d_CollabChangesDeleted d_CollabConflict d_CollabCreate d_CollabDeleted d_CollabEdit d_CollabExclude d_CollabMoved d_ContentPositioningBehaviour d_ContentSizeFitter d_CylinderTargetBehaviour d_EventSystem d_EventTrigger d_FreeformLayoutGroup d_GraphicRaycaster d_GridLayoutGroup d_HorizontalLayoutGroup d_ImageTargetBehaviour d_LayoutElement d_LightProbeProxyVolume d_MidAirPositionerBehaviour d_ModelTargetBehaviour d_MultiTargetBehaviour d_ObjectTargetBehaviour d_ParentConstraint d_ParticleSystem d_PhysicalResolution d_Physics2DRaycaster d_PhysicsRaycaster d_PlaneFinderBehaviour d_PlayableDirector d_PositionConstraint d_RectTransform d_RotationConstraint d_ScaleConstraint d_ScrollViewArea d_SelectionList d_SelectionListItem d_SelectionListTemplate d_SortingGroup d_StandaloneInputModule d_TimelineAsset d_TouchInputModule d_UserDefinedTargetBuildingBehaviour d_VerticalLayoutGroup d_VirtualButtonBehaviour d_VuforiaBehaviour d_VuMarkBehaviour d_WireframeBehaviour EchoFilter EdgeCollider2D EditorSettings EventSystem EventTrigger Favorite FixedJoint FixedJoint2D Flare FlareLayer Folder FolderEmpty FolderFavorite Font FreeformLayoutGroup FrictionJoint2D GameManager GameObject GraphicRaycaster Grid GridBrush GridLayoutGroup GUILayer GUISkin GUIText GUITexture Halo HighPassFilter HingeJoint HingeJoint2D HoloLensInputModule HorizontalLayoutGroup HumanTemplate Image ImageTargetBehaviour InputField Js Script LayoutElement LensFlare Light LightingDataAsset LightingDataAssetParent LightmapParameters LightProbeGroup LightProbeProxyVolume LightProbes LineRenderer LODGroup LowPassFilter Mask Material Mesh MeshCollider MeshFilter MeshParticleEmitter MeshRenderer MetaFile Microphone MidAirPositionerBehaviour ModelTargetBehaviour Motion MovieTexture MultiTargetBehaviour MuscleClip NavMeshAgent NavMeshData NavMeshObstacle NetworkAnimator NetworkDiscovery NetworkIdentity NetworkLobbyManager NetworkLobbyPlayer NetworkManager NetworkManagerHUD NetworkMigrationManager NetworkProximityChecker NetworkStartPosition NetworkTransform NetworkTransformChild NetworkTransformVisualizer NetworkView ObjectTargetBehaviour OcclusionArea OcclusionPortal OffMeshLink Outline ParentConstraint ParticleAnimator ParticleEmitter ParticleRenderer ParticleSystem PhysicMaterial Physics2DRaycaster PhysicsMaterial2D PhysicsRaycaster PlaneFinderBehaviour PlatformEffector2D PlayableDirector PointEffector2D PolygonCollider2D PositionAsUV1 PositionConstraint Prefab PrefabModel PrefabNormal Preset ProceduralMaterial Projector RawImage RaycastCollider RectMask2D RectTransform ReflectionProbe RelativeJoint2D RenderTexture ReverbFilter Rigidbody Rigidbody2D RotationConstraint ScaleConstraint SceneAsset SceneSet ScriptableObject Scrollbar ScrollRect Search Selectable Shader ShaderVariantCollection Shadow SkinnedMeshRenderer Skybox Slider SliderJoint2D SoftlockProjectBrowser SortingGroup SpatialMappingCollider SpatialMappingRenderer SpeedTreeModel SphereCollider Spotlight SpringJoint SpringJoint2D Sprite SpriteAtlas SpriteCollider SpriteMask SpriteRenderer SpriteShapeRenderer StandaloneInputModule StyleSheet SubstanceArchive SurfaceEffector2D TargetJoint2D Terrain TerrainCollider TerrainData Text TextAsset TextMesh Texture Texture2D Tile Tilemap TilemapCollider2D TilemapRenderer TimelineAsset Toggle ToggleGroup TouchInputModule TrackedPoseDriver TrailRenderer Transform UserDefinedTargetBuildingBehaviour UssScript UxmlScript VerticalLayoutGroup VideoClip VideoEffect VideoPlayer VirtualButtonBehaviour VisualTreeAsset VuforiaBehaviour VuMarkBehaviour WheelCollider WheelJoint2D WindZone WireframeBehaviour WorldAnchor WorldParticleCollider