web-dev-qa-db-ja.com

MonoBehaviourクラスGameManagerに名前を付けるときの特別なアイコン

UnityのGameManagerという名前について、デザイナーの行動を変える特別なものはありますか? GameManagerから派生したScriptableObjectという名前のクラスがあり、デザイナーはそのクラスに対して他のScriptableObject派生クラスとは異なる方法でいくつかのことを行っています。

名前をGameManagerからManagerに変更することでこの動作を確認できますが、Unityエディターの動作は異なります。

GameManagerの私の定義は次のようになります。

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

C#クラスの名前がGameManagerの場合、プロジェクトビューは次のようになります。 Game Managerの横にある別のアイコンに注目してください。

enter image description here

そのアセットを削除し、基になるC#クラス名をManagerに変更してからアセットを再度作成すると、アイコンはギアではなく通常のアイコンになります。

enter image description here

もう一つの問題は、もっと問題ですが、タイプMonoBehaviourのプロパティを持つGameManagerを含むゲームオブジェクトがある場合、次に小さな丸いアイコンをクリックすると、既存のGameManagerアセットがUnityに表示されないことです。インスペクターのフィールドに。 UnitywillプロジェクトビューからGameManagerアセットをフィールドにドラッグできますが、Unityではフィールドをクリックして参照を選択できません。以下のスクリーンショットに示すように、プロジェクトビューで使用できる場合でも、UnityではGameManagerアセットを選択するオプションは提供されません。

enter image description here

enter image description here

ただし、基になるC#クラスの名前をGameManagerからManagerに変更すると、Unityエディターは正しく動作します(以下を参照)。

enter image description here

GameManagerのC#クラス名について何か特別なことはありますか、またはこの動作は他の何かが原因である可能性がありますか?

15
Ben Rubin

Unityには特別なスクリプト名があります。これらのいずれかを使用すると、そのスクリプトに特別なアイコンが適用されます。 GameManagerは特別なスクリプト名の1つです。 SearchもUnityの別の特別なスクリプト名です。残念ながら、それらはUnityのWebサイトのどこにもリストされていませんが、特別なスクリプト名の1つを使用していることは確実にわかります。

これらの特別な名前を使用してスクリプトに名前を付け、特別なアイコンや動作も削除する場合は、名前空間でそのスクリプトを特別な名前で囲みます。

namespace Ben
{
    public class Search : MonoBehaviour
    {

    }
}

Searchスクリプトの特別なアイコンが消えているはずです。これは、GameManagerスクリプトにも適用されます。

[〜#〜] edit [〜#〜]

人々はこれについてもっと知りたいので、基本的に、Unityにはアイコンを含むこれらの重要なファイルがあります:

  • unity default resources
  • unity editor resources
  • unity_builtin_extra

<UnityInstallationDirecory>\Editor\Data\Resourcesディレクトリ内。これらのファイルを<ProjectDirecory>\Assets\Resourcesディレクトリにコピーし、そのうち3つのファイル拡張子を.assetに変更すると、それらを展開すると、それらのファイルにアセットとアイコンが表示されます。

特別なアイコンを見つける秘secretは、名前が" Icon"で終わるアイコンが特別なアイコンである可能性が高いことです。たとえば、GameManagerにはGameManager Iconという名前のアイコンがあります。スクリプトにGameManagerという名前を付けると、GameManager Iconが使用されます。これはすべてのアイコンに完全に当てはまるわけではありませんが、mostのアイコンです。これをしない人はほとんどいません。

上記の指示をエディターで自動化するスクリプトを作成しました。 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<UnityEngine.Object> allIcons;
        allIcons = new List<UnityEngine.Object>(Resources.FindObjectsOfTypeAll(typeof(Texture)));
        allIcons = allIcons.OrderBy(a => a.name, StringComparer.OrdinalIgnoreCase).ToList();


        //Get special icons from the icons
        List<string> specialIconsList = new List<string>();
        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メニューに移動したときにクリップボードにコピーされたダンプ例です。すべての可能な特殊文字が表示されます。それらのいくつかはそうではありませんが、それらのほとんどは次のとおりです。

enter image description here

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
16
Programmer

これはUnityに組み込まれていますが、これは偽の問題です。ユーザー作成コードをグローバル名前空間に配置した場合にのみ発生します。しないでください!

本当の答えは、すべてのユーザー作成のスクリプトコードは独自の名前空間に存在する必要があるということです。それが機能の目的です。 Unityテンプレートがその規則を採用している場合に役立ちます。

0
david.pfx