我一直在尝试在我正在制作的编辑器脚本中实现一个简单的Resources.Load调用,但是尽管我尝试了许多不同的方法,它仍然会返回null。
目的
用户将.jpg添加到项目中的文件夹,在本例中为Assets / Resources / 360Photos
后处理脚本检测到此文件,将立方体贴图纹理导入设置应用于其中
然后,脚本将创建天空盒/立方体贴图材质并将纹理应用于材质
我遇到的障碍是在将纹理对象作为立方体贴图进行后处理后获取纹理对象,然后如何将其应用于Skybox / Cubemap着色材质的_Tex属性,因为我似乎连加载与我导入的纹理相关联的资源并处理到立方体贴图。
是否可以在Unity Editor Scripting(特别是AssetPostProcessor)中使用Resources.Load,或者我是否尝试执行仅在运行时可用的功能?
如果有人可以查看我的代码,并查看我提供的Unity屏幕截图,那将非常感激。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Postprocess360Photo : AssetPostprocessor {
void OnPostprocessTexture(Texture2D texture)
{
string lowerCaseAssetPath = assetPath.ToLower ();
bool isIn360PhotoDirectory = lowerCaseAssetPath.IndexOf ("360photos") != -1;
if (isIn360PhotoDirectory)
{
TextureImporter textureImporter = (TextureImporter)assetImporter;
textureImporter.textureType = TextureImporterType.Default;
textureImporter.textureShape = TextureImporterShape.TextureCube;
textureImporter.generateCubemap = TextureImporterGenerateCubemap.Cylindrical;
textureImporter.sRGBTexture = true;
textureImporter.alphaSource = TextureImporterAlphaSource.FromInput;
textureImporter.alphaIsTransparency = true;
textureImporter.npotScale = TextureImporterNPOTScale.ToSmaller;
textureImporter.isReadable = true;
textureImporter.mipmapEnabled = false;
textureImporter.wrapMode = TextureWrapMode.Clamp;
textureImporter.filterMode = FilterMode.Bilinear;
}
AssetDatabase.ImportAsset (assetPath);
CreateMaterial ();
}
void CreateMaterial ()
{
Cubemap cubemap = (Cubemap)Resources.Load ("360Photos/FrontDriveway");
Debug.Log (cubemap);
}
}
请参阅图像以获取空值返回值的层次结构和控制台验证: -
如果有帮助,请使用Unity 5.5.0f3。
答案 0 :(得分:0)
扩展名为.jpg,但尝试使用.jpg和没有 扩展产生相同的结果。
那就是问题
.Jpg !=
.cubemap 。
要获取立方体贴图,请转到资产 - > 创建 - > 旧版 - > Cubemap 。
如果您将其命名为 FrontDriveway 并将其放置在 Resources / 360Photos ,那应该可以。
修改强>:
我上面说的有一个例外。如果您更改了TextureImporter
的{{1}}和generateCubemap
属性,则可以将图片导入为textureShape
。
看起来Unity Cubemap
功能存在错误。您无法从Resources.Load
功能调用Resources.Load
。也许这是一个OnPostprocessTexture
问题?我不知道。
经过长时间的实验,我找到了一个解决方法。处理完图片后,您需要实施EditorApplication.update
回调功能并使用它来调用Thread
代码。
Resources.Load