#c# #unity3d
#c# #unity3d
Вопрос:
Пожалуйста, помогите мне исправить эту проблему.
Активы/Menu.cs(97,73): предупреждение CS0618: UnityEditor.EditorUtility.GetAssetPath(UnityEngine.Object)' is obsolete:
используйте AssetDatabase.GetAssetPath’
Ошибка при создании проигрывателя, поскольку в скриптах были ошибки компилятора
Активы /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.6n");
sw.Write("Kd 0.6 0.6 0.6n");
sw.Write("Ks 0.9 0.9 0.9n");
sw.Write("d 1.0n");
sw.Write("Ns 0.0n");
sw.Write("illum 2n");
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("nnn");
}
}
}
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 ".mtln");
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 ".mtln");
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 ();
}
}
Комментарии:
1. Кажется очень странным, что вы получаете предупреждение, относящееся к классу в пространстве имен, и сообщение об ошибке, что он не может найти пространство имен. Но, учитывая предупреждение, есть ли какая-либо причина, по которой вы не просто используете
AssetDatabase
вместо этого?2. answers.unity3d.com/questions/576746/…
3. Но какую функцию я могу использовать вместо EditorUtility. GetAssetPath?
4. @RayRove AssetDatabase. Может быть, GetAssetPath?
Ответ №1:
Перед использованием любого Unity API очень важно проверить пространство имен API. Если пространство имен from UnityEditor
, то оно предназначено только для работы только в редакторе. Это используется для создания плагина редактора. Вы не можете использовать его в сборке, и он выдаст ошибку при сборке для любой платформы.
Согласно документам, AssetDatabase
и EditorUtility
класс из UnityEditor
пространства имен.
Вам нужно перепроектировать свою игру, чтобы она работала без этой GetAssetPath
функции. Вы определенно можете создать игру и без этой функции. Я не могу сказать, что вы делаете, но вы должны заглянуть в Resources
класс. Это поможет вам загружать ваши игровые объекты во время выполнения.
Чтобы решить вашу текущую проблему,
Заменить
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
пространства имен используются только для плагина редактора.
Комментарии:
1. Я использую Ресурсы, но это не
Ответ №2:
Это происходит потому, что классы, использующие UnityEditor, необходимо поместить в папку с именем Editor: Assets / Editor Если вы это сделаете, проблема исчезнет
Комментарии:
1. Это исправило мою проблему, когда я пытался написать класс, который реализовал
UnityEditor.Build.IPostprocessBuildWithReport
(который предназначен исключительно для выполнения настроек после компиляции приложения Unity и не включается в саму сборку вывода).