Задержка cmd -ExecuteMethod или установка активной сцены из cmd

#unity3d #unityscript #unity5

#unityscript #unity3d

Вопрос:

У меня есть BaseEmptyScene в Testproject1. В BaseEmptyScene нет никаких игровых объектов. Единственное, что есть в этом проекте и сцене, — это скрипт на c # со статическим методом bang() .

У меня есть второй проект под названием Sphere со сценой под названием «Сфера». В нем есть базовые объекты GameObjects Sphere и Cube, без скрипта. Я пошел «Активы> Экспорт пакета» и экспортировал все в SphereCube.unitypackage

Вот моя командная строка для выполнения метода bang() после импорта SphereCube.unitypackage в Testproject1.

 C:Program FilesUnityEditor>Unity.exe -projectPath SomePathTempProj -importPackage PathSphereCube.unitypackage -executeMethod TestClass.bang 
  

Эта команда открывает unity, импортирует пакет и выполняет метод bang fine. см. Аргумент командной строки unity doc

Моя проблема в том, что я не могу сказать unity выполнить метод ПОСЛЕ завершения импорта пакета. Вот как выглядит bang() — в настоящее время он всегда отображает количество сцен как 1. Это должно быть 2, так как я вижу две сцены в папке Assets после завершения импорта (пустая сцена с 1 сценарием и импортированная сцена SphereCube)

 private static void bang(){
...

        sw.WriteLine("Scene Count = "   SceneManager.sceneCount);
        sw.WriteLine("Active Scene = "   SceneManager.GetActiveScene().name   " "   SceneManager.GetActiveScene().path);

...
}
  

Я даже не могу изменить активную сцену на недавно добавленную сцену, потому что, насколько это касается unity, при выполнении метода существует только 1 сцена.

Есть ли какой-нибудь способ выполнить метод после завершения импорта? Есть ли какое-то событие, которое вызывает …. Что-то проще, чем получение текущего PID Unity и отправка этому процессу сообщения из другого внешнего скрипта…

Ответ №1:

Что вам нужно, так это класс AssetPostprocessor, вместо того, что вы делали до сих пор (примечание: вам не нужна пустая сцена для статического метода где-нибудь в вашем проекте).

Скорее всего, вам нужен метод OnPostprocessModel (вы также можете найти пример кода по этой ссылке).
Что касается вашего метода ‘bang’, вы можете сделать что-то столь же простое, как это:

 using UnityEngine;
public static class YourClass {
     public static void Bang(GameObject myGO) {
          //Do whatever you want with the GO you just imported
     }
}
  

Для этого вам не нужна сцена или что-либо еще, поскольку это статический класс со статическим методом; вы можете вызывать Bang из любого скрипта, который вы хотите (включая вашу реализацию AssetPostprocessor )

Надеюсь, это поможет!

Комментарии:

1. Спасибо, отметьте; OnPostprocessModel кажется тем, что мне нужно. Но он не вызывается. Пустой проект, который у меня был, теперь имеет только метод OnPostprocessModel (go) и делает то, что делает Bang. Через cmd я открываю «пустой» проект и импортирую свой пакет SphereCube. На данный момент я ожидал, что будет вызвана OnPostprocessModel .. но это не так. OnPostprocessModel просто переходит в файл ресурсов скрипта в проекте, верно?

2. Да, но класс должен иметь «AssetPostprocessor» в качестве базового класса (см. Пример кода по ссылке на документы Unity в моем ответе). Если вы сделали это подобным образом, но метод все еще не вызывается, попробуйте открыть Unity и импортировать оттуда. Если все еще не срабатывает, это проблема с вашей стороны, которую вам нужно исправить. Если это работает таким образом, что-то не так с AssetPostprocessor при запуске импорта из cmd