“统一”中的GameManager
这个名字有什么特别之处吗?它会导致设计师采取不同的行动吗?我有一个名为GameManager
的类,它是从ScriptableObject
派生的,而设计人员对该类所做的事情与我的其他ScriptableObject
派生类不同。
我可以通过将名称从GameManager
更改为Manager
来验证这种行为,而且Unity的操作也不同。
我对GameManager
的定义如下:
[CreateAssetMenu(menuName = "Managers/GameManager")]
public class GameManager : ScriptableObject
{
// ...
}
下面是当我的C#类命名为GameManager
时项目视图的样子。注意Game Manager
旁边的不同图标。
如果我删除该资产,将基础C#类名更改为Manager
,然后再次创建该资产,则该图标是普通图标,而不是设备。
另一个更大的问题是,如果我有一个游戏对象,其中包含一个具有GameManager
类型属性的GameManager
属性的游戏对象,那么当我单击检查器中字段旁边的小圆圈图标时,统一将不会向我展示现有的GameManager
资产。统一将允许我将GameManager
资产从Project拖到字段中,但是Unity不允许我通过单击字段来选择引用。如下面的屏幕截图所示,联合没有给我选择我的GameManager
资产的选项,尽管它在Project中是可用的。
但是,如果我将底层C#类的名称从GameManager
更改为Manager
,那么统一编辑器将正常工作,如下所示。
C#类名GameManager
是否有什么特殊之处,或者这种行为可能是由于其他原因造成的?
发布于 2018-02-25 01:50:07
在统一中有特殊的脚本名称。当您使用其中任何一个,特殊的图标将应用到该脚本。GameManager
是一种特殊的脚本名称。Search
也是统一中的另一个特殊脚本名。不幸的是,它们并没有被列在联合的网站上,但是当你使用一个特殊的脚本名称时,你就绝对知道了。
如果您仍然希望使用这些特殊名称来命名您的脚本,并且还希望删除特殊的图标或行为,请将该脚本与特殊名称放在命名空间中。
namespace Ben
{
public class Search : MonoBehaviour
{
}
}
Search
脚本的特殊图标现在应该消失了。这也适用于GameManager
脚本。
编辑
由于人们希望更多地了解这一点,基本上,Unity有以下包含其图标的重要文件:
unity default resources
unity editor resources
unity_builtin_extra
在<UnityInstallationDirecory>\Editor\Data\Resources
目录中。如果将这些文件复制到您的<ProjectDirecory>\Assets\Resources
目录中,并将其中三个文件的扩展名更改为.asset
,则在展开这些文件时,您将能够看到这些文件中的资产和图标。
找到特殊图标的秘诀是,那些以" 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<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();
}
}
下面是复制到我的剪贴板的示例转储,当你转到程序员时->显示特殊图标菜单。它将显示所有可能的特殊字符。其中一些不是,但大多数是:
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
发布于 2019-03-01 04:35:45
这是统一号,但这是个假问题。只有当您将用户编写的代码放入全局命名空间时才会出现这种情况。别这么做!
真正的答案是,所有用户编写的脚本代码都应该在它自己的名称空间中--这就是这个特性所要做的。如果统一模板通过这一公约,将会有所帮助。
https://stackoverflow.com/questions/48965981
复制相似问题