菜单工具:Tools/MenuItem
[MenuItem(“Tools/MenuItem”)]
Editor目录下
资源目录的工具:MenuItem
[MenuItem(“Assets/MenuItem”)]
public static void CreatMeshAsset()
{
GameObject go = GameObject.Instantiate(Selection.activeGameObject)
Mesh mesh = go.GetComponent().mesh;
AssetDatabase.CreateAsset(mesh , “Assets/” + name + “.asset”);
GameObject.DestroyImmediate(go)
}
C#
GameObject go = new GameObject()
go.AddComponent().mesh = ab.LoaddAsset() as mesh;
shader.parse()把shader及其变体发送到GPU调用:加载 prefab、material、shader 形式的assetbundle时和Shader.Find会出现;
原则上只有是有shader加载或创建都会执行
因此,重新从代码构建prefab和其meshfilter以及meshrender,可以避免Shader.Parse的调用
使用自己的FindShader 替换Shader.Find 注意在其shader ab确保在游戏整个过程中独立加载,且不会被依赖项说卸载
===========================================================================
AssetBundle ab = LoadAssetBundle(“shader”);
Object[] obs = ab.LoadAllAssets();
Shader sh = obs[i] as Shader;
if(sh == null)
{
ShaderVariantCollection sv = obs[i] as ShaderVariantCollection;
if(sv !=null)
{
sv.WarmUp()
}
}
注意:
1、AB热更Shader,使用自己的Shader加载模式
Shader AssetBundle加载后需要保存供后续材质创建使用
2、Shader.Find争对预加载和Resources中的Shader
Shader优化:
1、控制shader编译平台
2、ShaderVariantCollection控制变体
3、Edit->project settings->graphics里的shaderstriping优化shader
4、在卸载依赖于shader ab所有对象后,对shader assetBundle Unload(true),可以清掉shader
Shader WarmUp功能:
1、Shader变体初始化,以防创建使用到该Shader导致卡顿
2、清理掉对于Warmup的Shader的ab文本文件
官方:
通常,首次需要着色器时,图形驱动程序才会实际准备着色器。 但是,首次使用先前未使用过的着色器渲染某个对象时, 可能会出现暂时性中断,因为驱动程序需要编译/优化着色器。这可能会非常 明显,尤其是在移动平台上。
调用此函数将使用当前加载的所有着色器的所有变体执行虚拟 one-invisible-triangle 渲染。这可能需要一些时间,但有助于 避免未来出现暂时性中断。一般最好使用 ShaderVariantCollection 实现更精细的 着色器预热控制。
请注意,此函数仅预热当前加载(显式或通过对使用自定义着色器的预制件的引用)的着色器。
如果使用 Resources.Load 加载着色器,则需要再次调用 WarmupAllShaders。