可能會讀取着色器的名稱,並嘗試用舊的着色器替換它,例如,通過使用查找表。編譯Unity5着色器與舊版Unity4着色器對應的列表。或者,您必須從新的Unity「標準」着色器中將某些紋理或值傳輸到舊着色器,例如,檢測到使用了一個法線貼圖,您必須選擇適當的遺留着色器並重新指定着色器變量。示例腳本:
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(Renderer))]
public class ChangeToLegacyShader : MonoBehaviour {
// At startup..
void Start() {
var oldShaderName = GetComponent<Renderer>().material.shader.name;
//try to search for the shader name in our lookup table
if (shaderTable.ContainsKey(oldShaderName))
{
//Replace the shader
var newShader = Shader.Find(shaderTable[oldShaderName]);
GetComponent<Renderer>().material.shader = newShader;
//Additional stuff: Set new paramers, modifiy textures, correct shader variables,...
}
else
{
Debug.LogWarning("Couldn't find replacement for shader: " + oldShaderName);
}
//Remove this script after we're done.
Destroy(this);
}
public static Dictionary<string, string> shaderTable = new Dictionary<string, string>()
{
{"Standard", "Legacy Shaders/Diffuse"}, //map standard to the diffuse shader, good enough for this small example
{"Standard (Specular Setup)", "Legacy Shaders/Specular"}
//more...
};
}
測試紅色立方體和具有地球紋理的球體。腳本之前材料被執行:
後:
在遊戲中顯示視圖之前:
後:
非常感謝你的詳細解答。我有2個問題。 1.我如何找到映射放在上面可見的地方。我認爲現在有大約20個或更多的遺留着色器,現在都使用標準着色器。從哪裏可以找到它們的新標準着色器名稱,例如diifuse transparent,vertex lit等... – Madhu
2.導入模型時,我嘗試讀取OnAssignMaterialModel函數中AssetPostprocessor類中的舊着色器,但它顯示新的不是舊的。爲了像你一樣獲得oldShaderName,我需要在哪裏設置這個腳本?謝謝 – Madhu