gpt4 book ai didi

c# - 找不到类型或命名空间名称 `UnityEditor'

转载 作者:行者123 更新时间:2023-11-30 14:48:52 26 4
gpt4 key购买 nike

请帮我解决这个问题。

Assets/Menu.cs(97,73):警告 CS0618:UnityEditor.EditorUtility.GetAssetPath(UnityEngine.Object)' 已过时:使用 AssetDatabase.GetAssetPath'

构建播放器时出错,因为脚本有编译器错误

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<string, ObjMaterial> materialList)
{



Mesh m;
Material[] mats;

if(mf is MeshFilter)
{
m = (mf as MeshFilter).mesh;
mats = mf.GetComponent<Renderer>().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",v.x,v.y));
}

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<string, ObjMaterial> PrepareFileWrite()
{
Clear();

return new Dictionary<string, ObjMaterial>();
}

private static void MaterialsToFile(Dictionary<string, ObjMaterial> materialList, string folder, string filename)
{
using (StreamWriter sw = new StreamWriter(folder + "/" + filename + ".mtl"))
{
foreach( KeyValuePair<string, ObjMaterial> 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<string, ObjMaterial> 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<string, ObjMaterial> 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 < meshfilter.Length; m++)
{
exportedObjects++;
mfList.Add(meshfilter[m]);
}
}

if (exportedObjects > 0)
{
Component[] mf = new Component[mfList.Count];

for (int i = 0; i < mfList.Count; i++) {
mf [i] = (Component)mfList [i];
}

string filename = /*EditorApplication.currentScene +*/ "_" + exportedObjects;

int stripIndex = filename.LastIndexOf ('/');//FIXME: Should be Path.PathSeparator

if (stripIndex >= 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 命名空间。

enter image description here

您必须重新设计您的游戏才能在没有 GetAssetPath 函数的情况下运行。你绝对可以制作没有该功能的游戏。我不知道你在做什么,但你应该查看 Resources类(class)。这将帮助您在运行时加载游戏对象。

为了解决您当前的问题,

替换

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 命名空间中的类仅用于编辑器插件。

关于c# - 找不到类型或命名空间名称 `UnityEditor',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com