Unity 6.3
0 онлайн 67 гостей 3 в системе
Вход

ScriptedImporter.OnImportAsset

Declaration

public void OnImportAsset(AssetImporters.AssetImportContext ctx);

Параметры

Параметр Описание
КТХ Этот аргумент содержит всю контекстную информацию, необходимую для обработки события импорта, и также используется пользовательским импортером для хранения полученного ассета Unity.

Описание

Этот метод должен быть переопределён в производном классе; конвейер ассетов вызывает его для импорта файлов.

using UnityEngine;
using UnityEditor.AssetImporters;
using System.IO;

[ScriptedImporter(1, "cube")] public class CubeImporter : ScriptedImporter { public float m_Scale = 1;

public override void OnImportAsset(AssetImportContext ctx) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); var position = JsonUtility.FromJson<Vector3>(File.ReadAllText(ctx.assetPath));

cube.transform.position = position; cube.transform.localScale = new Vector3(m_Scale, m_Scale, m_Scale);

// 'cube' is a a GameObject and will be automatically converted into a Prefab // (Only the 'Main Asset' is elligible to become a Prefab.) ctx.AddObjectToAsset("main obj", cube); ctx.SetMainObject(cube);

var material = new Material(Shader.Find("Standard")); ctx.DependsOnCustomDependency("StandardShaderDependencyHash");

material.color = Color.red;

// Assets must be assigned a unique identifier string consistent across imports ctx.AddObjectToAsset("my Material", material);

// Assets that are not passed into the context as import outputs must be destroyed var tempMesh = new Mesh(); DestroyImmediate(tempMesh); } }

Чтобы использовать функцию Shader.Find() в вышеприведённом примере, вам нужно написать собственную зависимость для шейдера, который вы хотите найти, и регулярно обновлять её. Это предотвращает обход функцией Shader.Find() других средств проверки зависимости. Приведенный ниже код является примером того, как вы можете написать собственную зависимость для этой цели.

using UnityEditor;
using UnityEngine;

static class ShaderDependencyUpdater { [InitializeOnLoadMethod] static void ShaderDependencyInit() { EditorApplication.update += ShaderDependencyUpdate; } static void ShaderDependencyUpdate() { var shader = Shader.Find("Standard"); AssetDatabase.TryGetGUIDAndLocalFileIdentifier(shader, out var guid, out long id); var hash = new Hash128(); hash.Append(guid); hash.Append(id); AssetDatabase.RegisterCustomDependency("StandardShaderDependencyHash", hash); } }

Используйте LazyLoadReference<T0> для объявления зависимости от артефакта (e.g., AnimationClip). Это гарантирует успешное объявление зависимости, даже если артефакт, на который сделана ссылка, еще не импортирован.

using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEngine;

public class MyImporter : ScriptedImporter { public LazyLoadReference<AnimationClip> sourceClip; public LazyLoadReference<GameObject> sourcePrefab;

public override void OnImportAsset(AssetImportContext ctx) { var clipPath = AssetDatabase.GetAssetPath(sourceClip.instanceID); ctx.DependsOnArtifact(clipPath);

var prefabPath = AssetDatabase.GetAssetPath(sourcePrefab.instanceID); ctx.DependsOnArtifact(prefabPath);

if (sourceClip.asset != null && sourcePrefab.asset != null) { // Do import stuff.. } } }