【发布时间】:2017-11-23 07:43:59
【问题描述】:
在 unity 中导入 sprite 后,我想用它们制作一个 Prefab 并自动为它们分配一个 SpriteRenderer 和 BoxCollider2D 组件。 除了我不能将导入的 Sprite 传递给 SpriteRenderer 组件之外,一切都很好。 我不知道我在这里缺少什么。任何帮助都会得到回报。
void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
{
Sprite sp = sprites[0];
TextureImporter importer = (TextureImporter)assetImporter;
importer.textureType = TextureImporterType.Sprite;
GameObject GO = new GameObject();
GO.name = sp.name;
string ResAddress = importer.assetPath.Remove(importer.assetPath.Length - 4, 4).Replace("Assets/Resources/", "");
Debug.Log("Resource Address = " + ResAddress);// Images/Objects/car acceptable for Resource.load
//GO.AddComponent<SpriteRenderer>().sprite = sp;// not works
GO.AddComponent<SpriteRenderer>().sprite = (Sprite)Resources.Load(ResAddress);// not works
GO.AddComponent<BoxCollider2D>();
Object prefab = PrefabUtility.CreateEmptyPrefab(string.Format("Assets/Resources/X_Temp/{0}.prefab", GO.name));
if (prefab != null)PrefabUtility.ReplacePrefab(GO, prefab, ReplacePrefabOptions.ConnectToPrefab);
}
没有Error或messages,它使用BoxCollider和SpriteRendere组件制作预制件但SpriteRenderer的Sprite Field没有Sprite,并设置为none或Missing。
我该如何解决这个问题? 也在 Unity 社区中问过,没有运气。
https://answers.unity.com/questions/1434068/how-to-pass-sprite-to-spriterenderer-in-onpostproc.html
====== 更新而不推荐的答案 ======
void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
{
TextureImporter importer = (TextureImporter)assetImporter;
if (AssetDatabase.LoadAssetAtPath<Sprite>(importer.assetPath)==null)
{
AssetDatabase.Refresh();
return;
}
foreach (Sprite sp in sprites)
{
importer.textureType = TextureImporterType.Sprite;
GameObject GO = new GameObject();
GO.name = sp.name;
Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(importer.assetPath);
GO.AddComponent<SpriteRenderer>().sprite = sprite;
string address = string.Format("Assets/Resources/Prefabs/{0}.prefab", GO.name);
PrefabUtility.CreatePrefab(address, GO);
PrefabUtility.ReconnectToLastPrefab(GO);
}
}
不推荐,因为以下崩溃错误:
A default asset was created for 'Assets/Resources/Images/Objects/car.png' because the asset importer crashed on it last time.You can select the asset and use the 'Assets -> Reimport' menu command to try importing it again, or you can replace the asset and it will auto import again.UnityEditor.AssetDatabase:Refresh()
【问题讨论】:
-
@Programmer 是的,它肯定返回 null ,因为 Importer.assetPath 没有返回 Resource.load() 的可接受地址。问题是,即使对 Resource.Load() 的可接受路径进行硬编码也不起作用。似乎,与 Unity Doc 所说的相反,当触发 OnPostprocessSprites() 事件时,导入器的工作并未完全完成。我会更新代码。谢谢
-
您是否将资产导入资源文件夹?,只是为了确保
-
@Programmer 当然在说“肯定”之前我测试了你所说的。 1-我在哪里可以找到图像导入设置,我不知道你的意思?!我导入精灵的 2 个文件夹:Assets\Resources\Images\Objects - Unity 版本:unity 2017.1.1f1 - 图片文件名:car.png
-
@endrikexe 。是的,我将资产导入资源文件夹。