【问题标题】:Unity build error: The type or namespace name 'Editor' could not be foundUnity 构建错误:找不到类型或命名空间名称 \'Editor\'
【发布时间】:2022-09-27 18:41:38
【问题描述】:

我有一个脚本物品.cs负责设置玩家物品栏中物品的参数。在其中,我连接 Unity Editor 库并创建一个继承自 Editor 类的类。直到最近我还在使用 Unity 版本2020.3.0f1一切都很好,但现在我安装了2021.3.9f1我开始遇到问题。

构建项目时,出现以下错误:

Assets\\Inventory\\Items.cs(31,31): error CS0246: The type or namespace name \'Editor\' could not be found(您是否缺少 using 指令或程序集引用?)

Assets\\Inventory\\Items.cs(30,5):错误 CS0246:找不到类型或命名空间名称 \'CustomEditorAttribute\'(您是否缺少 using 指令或程序集引用?)

Assets\\Inventory\\Items.cs(30,5):错误 CS0246:找不到类型或命名空间名称 \'CustomEditor\'(是否缺少 using 指令或程序集引用?)

Assets\\Inventory\\Items.cs(32,28):错误 CS0115:\'Items.ItemsEditor.OnInspectorGUI()\':找不到合适的方法来覆盖

代码:

using UnityEngine;
using UnityEditor;

public class Items : MonoBehaviour {
   public enum itemTypes { Weapon, Potion, Amulet }
   public enum potionType { Health, Poison, Strong, Beer }
   public enum amuletType { Health, Defense, Speed }

   [Header(\"Main Settings\")]
   public itemTypes ItemTypes;
   [HideInInspector] public GameObject Model;
   [HideInInspector] public Texture2D Icon;
   [HideInInspector] public string itemName;
   [HideInInspector] public int itemNum;

   // Weapon
   [HideInInspector] public float damage;
   [HideInInspector] public float atackSpeed;
   [HideInInspector] public int broken;

   // Potion
   [HideInInspector] public potionType Potion = potionType.Health;
   [HideInInspector] public float healthOfset;
   [HideInInspector] public bool processingEffect;

   // Amulet
   [HideInInspector] public amuletType Amulet = amuletType.Health; 
   [HideInInspector] public float amuletValue;
    
   [CustomEditor(typeof(Items))]
   public class ItemsEditor : Editor {
      public override void OnInspectorGUI() {
         base.OnInspectorGUI();
         Items items = (Items) target;
         DrawMain(items);
         EditorGUILayout.Space();
      
         switch (items.ItemTypes) {
            case itemTypes.Weapon:
               WeaponSettings();
               break;
            case itemTypes.Potion:
               PotionSettings();
               break;
            case itemTypes.Amulet:
               AmuletSettings();
               break;
         }
         serializedObject.ApplyModifiedProperties();
      }

      void DrawMain(Items items) {
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"Icon\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"Model\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"itemNum\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"itemName\"));
         EditorGUILayout.Space();
      }

      void WeaponSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"damage\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"atackSpeed\"));
      }

      void PotionSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"Potion\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"healthOfset\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"processingEffect\"));
      }

      void AmuletSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"Amulet\"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty(\"amuletValue\"));
      }
   }
}
  • 我认为您需要将脚本放在一个名为 Editor 的文件夹中,这样就像插件一样,它知道如何处理它,因为编辑器在构建中不可用。

标签: c# unity3d


【解决方案1】:

顾名思义,UnityEditor 命名空间仅在 Unity 编辑器中可用!

在您的情况下,您将使用预处理器并执行

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class Items : MonoBehaviour {
   public enum itemTypes { Weapon, Potion, Amulet }
   public enum potionType { Health, Poison, Strong, Beer }
   public enum amuletType { Health, Defense, Speed }

   [Header("Main Settings")]
   public itemTypes ItemTypes;
   [HideInInspector] public GameObject Model;
   [HideInInspector] public Texture2D Icon;
   [HideInInspector] public string itemName;
   [HideInInspector] public int itemNum;

   // Weapon
   [HideInInspector] public float damage;
   [HideInInspector] public float atackSpeed;
   [HideInInspector] public int broken;

   // Potion
   [HideInInspector] public potionType Potion = potionType.Health;
   [HideInInspector] public float healthOfset;
   [HideInInspector] public bool processingEffect;

   // Amulet
   [HideInInspector] public amuletType Amulet = amuletType.Health; 
   [HideInInspector] public float amuletValue;
    
#if UNITY_EDITOR
   [CustomEditor(typeof(Items))]
   public class ItemsEditor : Editor {
      public override void OnInspectorGUI() {
         base.OnInspectorGUI();
         Items items = (Items) target;
         DrawMain(items);
         EditorGUILayout.Space();
      
         switch (items.ItemTypes) {
            case itemTypes.Weapon:
               WeaponSettings();
               break;
            case itemTypes.Potion:
               PotionSettings();
               break;
            case itemTypes.Amulet:
               AmuletSettings();
               break;
         }
         serializedObject.ApplyModifiedProperties();
      }

      void DrawMain(Items items) {
         EditorGUILayout.PropertyField(serializedObject.FindProperty("Icon"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("Model"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("itemNum"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("itemName"));
         EditorGUILayout.Space();
      }

      void WeaponSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty("damage"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("atackSpeed"));
      }

      void PotionSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty("Potion"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("healthOfset"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("processingEffect"));
      }

      void AmuletSettings() {
         EditorGUILayout.PropertyField(serializedObject.FindProperty("Amulet"));
         EditorGUILayout.PropertyField(serializedObject.FindProperty("amuletValue"));
      }
   }
#endif
}

【讨论】:

    【解决方案2】:

    你需要继承Editor

    在类行中,您应该将其替换为MonoBehaviour

    public class Items : Editor {
    

    请注意,现在这个脚本不是MonoBehaviour,所以它不会让你做某些事情。例如,可能不会调用 Update 和 Start。

    (在您的情况下,您可能不需要这个)如果您当前的类需要是 MonoBehaviour,我会推荐一个继承编辑器的新类并保持该类相同。您可以在新课程中完成所有 gui。


    TL;DR 继承 Editor

    public class Items : Editor {
    

    【讨论】:

    • 当我将 MonoBehaviour 更改为 Editor 时,我遇到了很多错误。同样,有必要创建一个单独的类。但是,我真的不明白该怎么做。你能指导我吗?
    • 只需用我在代码中所说的替换第一行。你能说你得到了什么错误吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2019-07-14
    相关资源
    最近更新 更多