Может кто сталкивался, или знает как решить..
Есть кастомный плагин со сценой, префабом на сцене и скриптом на префабе. Иногда при копировании плагина в проект (например, из одной версии Unity в другую) ломается связь со скриптом или даже весь префаб.
Задача в том, чтобы программно открывать сцену, очищать от "старых" и "missing" префабов, пересоздавать префаб (на случай если тот совсем сломан) и вешать на префаб скрипт.
Проблема в том, что из редактора всё работает. А вот если запускать из консоли (как раз и нужно для CI), то либо (если не "применять" изменения ReplacePrefab'ом) префаб на сцене получается каким нужно, но в ассетах в поле скрипта на префабе надпись None (Mono Script), либо (если использовать ReplacePrefab) и в ассетах и на сцене у префаба будет None (Mono Script).
Может дело в том, что исполняемый скрипт лежит в папке Editor, а скрипт, который нужно прикручивать к префабу в своей отдельной папке и при консольном запуске исполняемый просто не дожидается "готовности" этого скрипта?
Хотя GetType скрипт находит:
Синтаксис:
Используется csharp
var scriptType = System.Type.GetType ("Namespace.ClassName, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", false, true);
Тогда есть ли способ как-то всё-таки его "дожидаться"?
Синтаксис:
Используется csharp
public static void RestorePrefab()
{
Scene myScene = EditorSceneManager.OpenScene (scenePath);
var missingGOs = myScene.GetRootGameObjects().ToList().FindAll((go)=>{return go.name == "Missing Prefab";});
var oldGOs = myScene.GetRootGameObjects().ToList().FindAll((go)=>{return go.name == goName;});
if (missingGOs != null)
{
foreach (var item in missingGOs)
{
UnityEngine.Object.DestroyImmediate (item);
}
}
if (oldCrmGOs != null)
{
foreach (var item in oldGOs)
{
UnityEngine.Object.DestroyImmediate (item);
}
}
try
{
var scriptType = System.Type.GetType ("Namespace.ClassName, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", false, true);
}
catch (Exception)
{}
GameObject tempGO = new GameObject (goName);
tempGO.AddComponent (scriptType);
var newPrefab = PrefabUtility.CreatePrefab (prefabPath, tempGO);
UnityEngine.Object.DestroyImmediate (tempGO);
var prefabInstance = PrefabUtility.InstantiatePrefab (newPrefab);
EditorSceneManager.SaveScene (myScene);
}
{
Scene myScene = EditorSceneManager.OpenScene (scenePath);
var missingGOs = myScene.GetRootGameObjects().ToList().FindAll((go)=>{return go.name == "Missing Prefab";});
var oldGOs = myScene.GetRootGameObjects().ToList().FindAll((go)=>{return go.name == goName;});
if (missingGOs != null)
{
foreach (var item in missingGOs)
{
UnityEngine.Object.DestroyImmediate (item);
}
}
if (oldCrmGOs != null)
{
foreach (var item in oldGOs)
{
UnityEngine.Object.DestroyImmediate (item);
}
}
try
{
var scriptType = System.Type.GetType ("Namespace.ClassName, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", false, true);
}
catch (Exception)
{}
GameObject tempGO = new GameObject (goName);
tempGO.AddComponent (scriptType);
var newPrefab = PrefabUtility.CreatePrefab (prefabPath, tempGO);
UnityEngine.Object.DestroyImmediate (tempGO);
var prefabInstance = PrefabUtility.InstantiatePrefab (newPrefab);
EditorSceneManager.SaveScene (myScene);
}