如何通过脚本将Material渲染模式改为淡入淡出?
How to change Material Rendering Mode to Fade by script?
material 渲染模式现在默认设置为不透明。
我想把它改成淡入淡出。
到目前为止我做了:
if (g.GetComponent<SkinnedMeshRenderer>() != null)
{
Material[] mats = g.GetComponent<SkinnedMeshRenderer>().materials;
}
material 在索引 0 处只有一个 material 但我不确定如何访问 material 的渲染模式以及如何将其更改为淡入淡出.
到目前为止我尝试了什么:
我创建了一个新的 public 静态 class :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class MaterialUtils
{
public enum BlendMode
{
Opaque,
Cutout,
Fade,
Transparent
}
public static void SetupBlendMode(Material material, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
material.SetFloat("_Mode", 3.0f);
break;
case BlendMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
material.SetFloat("_Mode", 0.0f);
break;
default:
Debug.LogWarning("Warning: BlendMode: " + blendMode + " is not yet implemented!");
break;
}
}
}
然后回到编辑脚本:
OnGUI 内部:
if (GUILayout.Button("Start"))
{
allChildren = new List<Transform>();
foreach (Transform g in transform.GetComponentsInChildren<Transform>())
{
var level = ObjectLevel(g);
names.Add(" Level " + level.ToString());
if (g.GetComponent<SkinnedMeshRenderer>() != null)
{
Material[] mats = g.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
Material mat = mats[0];
MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Fade);
mats[0] = mat;
allChildren.Add(g);
}
}
}
但我在编辑器中收到警告:
警告:混合模式:淡入淡出尚未实现!
在线:
MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Opaque);
渲染模式仍然是不透明的。
只需设置_Mode
的浮点数属性:
renderer.material.SetFloat("_Mode", 1)
例如代码:
private MeshRenderer renderer;
void Start() => renderer = GetComponent<MeshRenderer>();
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
renderer.material.SetFloat("_Mode", 0); // Opaque
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
renderer.material.SetFloat("_Mode", 1); // Cutout
}
if (Input.GetKeyDown(KeyCode.Alpha3))
{
renderer.material.SetFloat("_Mode", 2); // Fade
}
if (Input.GetKeyDown(KeyCode.Alpha4))
{
renderer.material.SetFloat("_Mode", 3); // Transparent
}
}
material 渲染模式现在默认设置为不透明。 我想把它改成淡入淡出。
到目前为止我做了:
if (g.GetComponent<SkinnedMeshRenderer>() != null)
{
Material[] mats = g.GetComponent<SkinnedMeshRenderer>().materials;
}
material 在索引 0 处只有一个 material 但我不确定如何访问 material 的渲染模式以及如何将其更改为淡入淡出.
到目前为止我尝试了什么:
我创建了一个新的 public 静态 class :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class MaterialUtils
{
public enum BlendMode
{
Opaque,
Cutout,
Fade,
Transparent
}
public static void SetupBlendMode(Material material, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
material.SetFloat("_Mode", 3.0f);
break;
case BlendMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
material.SetFloat("_Mode", 0.0f);
break;
default:
Debug.LogWarning("Warning: BlendMode: " + blendMode + " is not yet implemented!");
break;
}
}
}
然后回到编辑脚本:
OnGUI 内部:
if (GUILayout.Button("Start"))
{
allChildren = new List<Transform>();
foreach (Transform g in transform.GetComponentsInChildren<Transform>())
{
var level = ObjectLevel(g);
names.Add(" Level " + level.ToString());
if (g.GetComponent<SkinnedMeshRenderer>() != null)
{
Material[] mats = g.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
Material mat = mats[0];
MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Fade);
mats[0] = mat;
allChildren.Add(g);
}
}
}
但我在编辑器中收到警告:
警告:混合模式:淡入淡出尚未实现!
在线:
MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Fade : MaterialUtils.BlendMode.Opaque);
渲染模式仍然是不透明的。
只需设置_Mode
的浮点数属性:
renderer.material.SetFloat("_Mode", 1)
例如代码:
private MeshRenderer renderer;
void Start() => renderer = GetComponent<MeshRenderer>();
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
renderer.material.SetFloat("_Mode", 0); // Opaque
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
renderer.material.SetFloat("_Mode", 1); // Cutout
}
if (Input.GetKeyDown(KeyCode.Alpha3))
{
renderer.material.SetFloat("_Mode", 2); // Fade
}
if (Input.GetKeyDown(KeyCode.Alpha4))
{
renderer.material.SetFloat("_Mode", 3); // Transparent
}
}