Как получить путь к текущему каталогу? (ScriptableObject, UnityEditor.AssetDatabase)

Извините за мой английский (Google Translate). Ниже приведен фрагмент кода, который создает ресурс (ScriptableObject) в выбранном каталоге (Assets/Resources/TestObject.asset):

[MenuItem("Assets/Create/Test Object")]
private static void CreateTestObject()
{
    var testObject = ScriptableObject.CreateInstance<TestObject>();
    AssetDatabase.CreateAsset(testObject, "Assets/Resources/TestObject.asset");
    AssetDatabase.SaveAssets();
}

Как я могу получить путь к каталогу, в котором я нахожусь? Чтобы не прописывать путь вручную, а сохранить этот GameObject в той же папке, где я вызываю метод.


Например:

1) Я вызываю метод из Assets/TestFolder/TestFolder2.

2) И в этом же каталоге он создает актив (TestObject). И не создает в активах/ресурсах.

Подводя итог, мне нужно получить путь к каталогу, в котором я вызывал метод через меню (Активы/Создать/Тестовый объект).


Дополнительно: Могу ли я сразу же переименовать GameObject после его создания? Как и в случае с другими объектами (скриптами, папками и т. д.).

Заранее спасибо за ваши ответы!


Пример (скриншот): Как получить путь, выделенный красным. Я вызову метод через меню (Создать/Проверить объект). В выбранном мной каталоге (Assets/TestFolder/TestFolder2). И актив создается там. А не в активах/ресурсах. Мне нужен метод, который вернет мне строку: Assets/TestFolder/TestFolder2.


person marsep    schedule 20.08.2017    source источник


Ответы (2)


Используйте [CreateAssetMenu] для создания ScriptableObject вместо [MenuItem].
Когда вы используете атрибут CreateAssetMenu, он добавляет опцию в Активы -> Создать, которая создает объект в текущей папке.

[CreateAssetMenu(menuName = "MyApp/TestClass")]
public class TestClass: ScriptableObject
{
}
person HedgehogNSK    schedule 20.08.2020

Хотя ответ HedgehogNSK, безусловно, правильный, вы можете оказаться в ситуации, когда захотите создать актив в текущей папке вне контекста меню Create (например, с помощью пользовательского EditorWindow). В этом случае вы можете использовать тот же метод, что и внутри редактора, ProjectWindowUtil.CreateAsset(Object asset, string path). Это одновременно создаст ресурс из предоставленного объекта и даст пользователю возможность переименовать его, как это делают записи по умолчанию в разделе Create. Пример:

private static void CreateTestObject()
{
    var testObject = ScriptableObject.CreateInstance<TestObject>();
    // Do some custom initialization logic for testObject
    ProjectWindowUtil.CreateAsset(testObject, "TestObject.asset");
}

Класс ProjectWindowUtil не задокументирован, но является public, и его можно легко найти в исходном коде Unity здесь. CreateAsset, в частности, существует уже несколько лет, поэтому можно с уверенностью предположить, что он никуда не денется.

person AlphaModder    schedule 15.01.2021