找不到类型或命名空间名称“UnityEditor”

请帮我纠正这个问题。

Assets / Menu.cs(97,73):警告CS0618: UnityEditor.EditorUtility.GetAssetPath(UnityEngine.Object)' is obsolete:使用AssetDatabase.GetAssetPath’

构建Player时出错,因为脚本存在编译错误

Assets / Menu.cs(2,7):错误CS0246:找不到类型或命名空间名称“UnityEditor”。 您是否缺少using指令或程序集引用?

 using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System; using System.Linq; struct ObjMaterial { public string name; public string textureName; } public class Menu : MonoBehaviour { public int window; void Start () { window = 1; } private static int vertexOffset = 0; private static int normalOffset = 0; private static int uvOffset = 0; //User should probably be able to change this. It is currently left as an excercise for //the reader. private static string targetFolder = "ExportedObj"; private static string MeshToString(Component mf, Dictionary materialList) { Mesh m; Material[] mats; if(mf is MeshFilter) { m = (mf as MeshFilter).mesh; mats = mf.GetComponent().sharedMaterials; } else if(mf is SkinnedMeshRenderer) { m = (mf as SkinnedMeshRenderer).sharedMesh; mats = (mf as SkinnedMeshRenderer).sharedMaterials; } else { return ""; } StringBuilder sb = new StringBuilder(); sb.Append("g ").Append(mf.name).Append("\n"); foreach(Vector3 lv in m.vertices) { Vector3 wv = mf.transform.TransformPoint(lv); //This is sort of ugly - inverting x-component since we're in //a different coordinate system than "everyone" is "used to". sb.Append(string.Format("v {0} {1} {2}\n",-wv.x,wv.y,wv.z)); } sb.Append("\n"); foreach(Vector3 lv in m.normals) { Vector3 wv = mf.transform.TransformDirection(lv); sb.Append(string.Format("vn {0} {1} {2}\n",-wv.x,wv.y,wv.z)); } sb.Append("\n"); foreach(Vector3 v in m.uv) { sb.Append(string.Format("vt {0} {1}\n",vx,vy)); } for (int material=0; material < m.subMeshCount; material ++) { sb.Append("\n"); sb.Append("usemtl ").Append(mats[material].name).Append("\n"); sb.Append("usemap ").Append(mats[material].name).Append("\n"); //See if this material is already in the materiallist. try { ObjMaterial objMaterial = new ObjMaterial(); objMaterial.name = mats[material].name; objMaterial.textureName = EditorUtility.GetAssetPath(mats[material].mainTexture); //else //objMaterial.textureName = null; materialList.Add(objMaterial.name, objMaterial); } catch (ArgumentException) { //Already in the dictionary } int[] triangles = m.GetTriangles(material); for (int i=0;i<triangles.Length;i+=3) { //Because we inverted the x-component, we also needed to alter the triangle winding. sb.Append(string.Format("f {1}/{1}/{1} {0}/{0}/{0} {2}/{2}/{2}\n", triangles[i]+1 + vertexOffset, triangles[i+1]+1 + normalOffset, triangles[i+2]+1 + uvOffset)); } } vertexOffset += m.vertices.Length; normalOffset += m.normals.Length; uvOffset += m.uv.Length; return sb.ToString(); } private static void Clear() { vertexOffset = 0; normalOffset = 0; uvOffset = 0; } private static Dictionary PrepareFileWrite() { Clear(); return new Dictionary(); } private static void MaterialsToFile(Dictionary materialList, string folder, string filename) { using (StreamWriter sw = new StreamWriter(folder + "/" + filename + ".mtl")) { foreach( KeyValuePair kvp in materialList ) { sw.Write("\n"); sw.Write("newmtl {0}\n", kvp.Key); sw.Write("Ka 0.6 0.6 0.6\n"); sw.Write("Kd 0.6 0.6 0.6\n"); sw.Write("Ks 0.9 0.9 0.9\n"); sw.Write("d 1.0\n"); sw.Write("Ns 0.0\n"); sw.Write("illum 2\n"); if (kvp.Value.textureName != null) { string destinationFile = kvp.Value.textureName; int stripIndex = destinationFile.LastIndexOf('/');//FIXME: Should be Path.PathSeparator; if (stripIndex >= 0) destinationFile = destinationFile.Substring(stripIndex + 1).Trim(); string relativeFile = destinationFile; destinationFile = folder + "/" + destinationFile; Debug.Log("Copying texture from " + kvp.Value.textureName + " to " + destinationFile); try { //Copy the source file File.Copy(kvp.Value.textureName, destinationFile); } catch { } sw.Write("map_Kd {0}", relativeFile); } sw.Write("\n\n\n"); } } } private static void MeshToFile(Component mf, string folder, string filename) { Dictionary materialList = PrepareFileWrite(); using (StreamWriter sw = new StreamWriter(folder +"/" + filename + ".obj")) { sw.Write("mtllib ./" + filename + ".mtl\n"); sw.Write(MeshToString(mf, materialList)); } MaterialsToFile(materialList, folder, filename); } private static void MeshesToFile(Component[] mf, string folder, string filename) { Dictionary materialList = PrepareFileWrite(); using (StreamWriter sw = new StreamWriter(folder +"/" + filename + ".obj")) { sw.Write("mtllib ./" + filename + ".mtl\n"); for (int i = 0; i < mf.Length; i++) { sw.Write(MeshToString(mf[i], materialList)); } } MaterialsToFile(materialList, folder, filename); } private static bool CreateTargetFolder() { try { System.IO.Directory.CreateDirectory(targetFolder); } catch { //EditorUtility.DisplayDialog("Error!", "Failed to create target folder!", ""); return false; } return true; } void OnGUI () { GUI.BeginGroup (new Rect (Screen.width / 2 - 100, Screen.height / 2 - 100, 200, 200)); if(window == 1) { if(GUI.Button (new Rect (10,30,180,30), "Экспортировать")) { if (!CreateTargetFolder()) return; //GameObject[] gos = GameObject.FindGameObjectsWithTag("Boat"); //Selection.objects = gos; GameObject[] selection = GameObject.FindGameObjectsWithTag("Boat"); //Transform[] selection = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab); if (selection.Length == 0) { //EditorUtility.DisplayDialog("No source object selected!", "Please select one or more target objects", ""); return; } int exportedObjects = 0; ArrayList mfList = new ArrayList(); for (int i = 0; i < selection.Length; i++) { Component[] meshfilter = selection[i].GetComponentsInChildren(typeof(MeshFilter)).Concat(selection[i].GetComponentsInChildren(typeof(SkinnedMeshRenderer))).ToArray(); for (int m = 0; m  0) { Component[] mf = new Component[mfList.Count]; for (int i = 0; i = 0) filename = filename.Substring (stripIndex + 1).Trim (); MeshesToFile (mf, targetFolder, filename); } } if(GUI.Button (new Rect (10,150,180,30), "Выход")) { window = 5; } } if(window == 5) { GUI.Label(new Rect(50, 10, 180, 30), "Вы уже выходите?"); if(GUI.Button (new Rect (10,40,180,30), "Да")) { Application.Quit(); } if(GUI.Button (new Rect (10,80,180,30), "Нет")) { window = 1; } } GUI.EndGroup (); } } 

在使用任何Unity API之前,检查API命名空间非常重要。 如果命名空间来自UnityEditor那么它仅适用于编辑器。 这用于制作编辑器插件。 您不能在构建中使用它,并且在为任何平台构建时会抛出错误。

根据文档, AssetDatabaseEditorUtility类来自UnityEditor命名空间。

在此处输入图像描述

您必须重新设计游戏才能在没有GetAssetPathfunction的情况下工作。 你绝对可以制作没有这个function的游戏。 我不知道你在做什么,但你应该查看Resources类。 这将帮助您在运行时加载GameObjects。

要解决您当前的问题,

更换

 using UnityEditor; 

 #if UNITY_EDITOR using UnityEditor; #endif 

然后更换

 objMaterial.textureName = EditorUtility.GetAssetPath(mats[material].mainTexture); 

  objMaterial.textureName = ""; #if UNITY_EDITOR objMaterial.textureName = EditorUtility.GetAssetPath(mats[material].mainTexture); #endif 

您还可以将您的Menu脚本放在Assets / Editor目录中的文件夹中,但请理解这并不能解决您的代码在构建中不起作用的问题。 它只允许您的项目在您的问题中没有这些错误的情况下构建。 UnityEditor命名空间中的类仅用于Editor插件。