源文件:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ModelTransparencyHelper : MonoBehaviour
{
/*
/// <summary>
/// 从不透明到透明的过渡时间
/// </summary>
public float TransitonTime=0.3f;*/
/// <summary>
/// 透明的程度
/// </summary>
public float TransparenceValue = 0.01f;
/// <summary>
/// 原材质球组的主颜色值
/// </summary>
private List<Color> m_colors=new List<Color>();
/// <summary>
/// 原材质球组的引用
/// </summary>
private List<Material> m_Materials=new List<Material>();
void Start () {
try
{
if (m_Materials==null|| m_colors == null)
{
m_Materials=new List<Material>();
m_colors=new List<Color>();
}
if (GetComponent<MeshRenderer>() != null)
{
m_Materials = GetComponent<MeshRenderer>().materials.ToList();
for (int i = 0; i < m_Materials.Count; i++)
{
m_colors.Add(m_Materials[i].color);
}
}
//测试使用
ToTransparence();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
/// <summary>
/// 从不透明到透明
/// </summary>
/// <returns></returns>
public bool ToTransparence()
{
try
{
if (m_Materials.Count<1)
{
return false;
}
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode", 3);
m_Materials[i].SetInt("_SrcBlend",(int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend",(int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
m_Materials[i].SetInt("_ZWrite",0);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = 500;
m_Materials[i].color = new Color(m_colors[i].r,m_colors[i].g,m_colors[i].b,TransparenceValue);
}
print("try ToTransparence!");
return true;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
/// <summary>
/// 在物体半透明时控制物体透明度
/// </summary>
public bool ControlTran(float t)
{
try
{
if (m_Materials.Count < 1)
{
return false;
}
if (t > 0.05 && t < 0.1)
{
}
else
{
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode", 3);
m_Materials[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
m_Materials[i].SetInt("_ZWrite", 0);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = 500;
m_Materials[i].color = new Color(m_colors[i].r, m_colors[i].g, m_colors[i].b, t);
}
}
// print("try ToTransparence!");
return true;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
/// <summary>
/// 从透明到不透明
/// </summary>
/// <returns></returns>
public bool ToOpaque()
{
try
{
if (m_Materials.Count < 1)
{
return false;
}
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode", 0);
m_Materials[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
m_Materials[i].SetInt("_ZWrite", 1);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = -1;
m_Materials[i].color = new Color(m_colors[i].r, m_colors[i].g, m_colors[i].b, m_colors[i].a);
}
print("try ToOpaque!");
return true;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private void Update()
{
//if (Input.GetMouseButtonDown(0))
//{
// ToTransparence();
//}
}
}
修改(要求一开始透明):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System;
public class ARModeTransparency : MonoBehaviour {
public List<Material> m_Materials = new List<Material>();
public List<Color> m_colors = new List<Color>();
// Use this for initialization
void Start ()
{
try
{
if (m_Materials == null || m_colors == null)
{
m_Materials = new List<Material>();
m_colors = new List<Color>();
}
if (GetComponent<MeshRenderer>() != null)
{
m_Materials = GetComponent<MeshRenderer>().materials.ToList();
for (int i = 0; i < m_Materials.Count; i++)
{
m_colors.Add(m_Materials[i].color);
}
}
InitStateMode();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private void InitStateMode()
{
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode",1);
m_Materials[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
m_Materials[i].SetInt("_ZWrite", 0);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = 500;//渲染层级
m_Materials[i].color = new Color(m_colors[i].r, m_colors[i].g, m_colors[i].b, 0);
Debug.LogError("000 " + m_Materials[i].color.a);
}
}
public void controllerTrans(float inputvalue)
{
if (inputvalue >= 0 && inputvalue <= 0.15)
{
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode",1);
m_Materials[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
m_Materials[i].SetInt("_ZWrite", 0);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = 500;
m_Materials[i].color = new Color(m_colors[i].r, m_colors[i].g, m_colors[i].b, inputvalue);
Debug.LogError("000 " + m_Materials[i].color.a);
}
}
else
{
for (int i = 0; i < m_Materials.Count; i++)
{
m_Materials[i].SetFloat("_Mode", 3);
m_Materials[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
m_Materials[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
m_Materials[i].SetInt("_ZWrite", 0);
m_Materials[i].DisableKeyword("_ALPHATEST_ON");
m_Materials[i].DisableKeyword("_ALPHABLEND_ON");
m_Materials[i].EnableKeyword("_ALPHAPREMULTIPLY_ON");
m_Materials[i].renderQueue = 3000;
m_Materials[i].color = new Color(m_colors[i].r, m_colors[i].g, m_colors[i].b, inputvalue);
Debug.LogError("000 " + m_Materials[i].color.a);
}
}
}
// Update is called once per frame
void Update () {
}
}
