Unity 3D物体模型的透明和不透明实现

最近在做项目中遇到一个需求,需要将物体模型进行透明虚化效果。看了网上一些博客文章。已实现该需求,为此博主写篇文章记录一下该功能的实现操作。希望能帮助到大家,不足之处还望海涵。一起学习交流。

透明效果:

使用一个方块来进行操作。
透明前
透明后
实现的脚本
该脚本挂在物体父级上,因为获取的是该对象所有子物体的MeshRenderer。(改脚本主要是获取需要透明的所有MeshRenderer然后进行更改操作)
主要操作在于这YPTools.SetMaterialRenderingMode(mrs[j],YPTools.RenderingMode.Transparent);
mrs[j].color = new Color(mrs[j].color.r, mrs[j].color.b, mrs[j].color.g, 0.1f);

public class EmptyControl : MonoBehaviour{

    private void Awake()
    {
        for (int i = 0; i < this.transform.childCount; i++)
        {
            Transform wallTransform = this.transform.GetChild(i);
            MeshRenderer mr = wallTransform.GetComponent<MeshRenderer>();
            if (mr !=null)
            {
                //MeshRenderer[] mr = wallTransform.gameObject.GetComponentsInChildren<MeshRenderer>();           
                Material[] mrs = mr.materials;
                for (int j = 0; j < mrs.Length; j++)
                {
                    Color mcolor = mrs[j].color;
                    if (mcolor != null)
                    {
                        //mcolor.a = 0.4f;
                        mrs[j].color = new Color(65/255f,65/255f,65/255f,85/255f);//设置材质球颜色为灰色,方便透明时不那么明亮
                        // 设置材质的颜色为半透明的颜色才能看到效果,如果材质有贴图,那么贴图也必须是半透明的
                        YPTools.SetMaterialRenderingMode(mrs[j], YPTools.RenderingMode.Transparent);
                        mrs[j].color = new Color(mrs[j].color.r, mrs[j].color.b, mrs[j].color.g, 0.1f);
                        //wallTransform.gameObject.GetComponent<Renderer>().material.color = mcolor;
                    }
                }
            }                  
        }
    }
}

YPTools工具类

public class YPTools : MonoBehaviour
{
    /// <summary>
        /// 设置Rendering Mode
        /// </summary>
        /// <param name="material"></param>
        /// <param name="renderingMode"></param>
    public static void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)
    {
        switch (renderingMode)
        {
            case RenderingMode.Opaque:
                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 = 2000;
                break;
            case RenderingMode.Cutout:
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                material.SetInt("_ZWrite", 1);
                material.EnableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = 2450;
                break;
            case RenderingMode.Fade:
                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 = 3000;
                break;
            case RenderingMode.Transparent:
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                material.SetInt("_ZWrite", 0);
                material.DisableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = 3000;
                break;
        }

    }
   }
   
   public enum RenderingMode
    {
        Opaque,
        Cutout,
        Fade,
        Transparent,
    }

RenderingMode枚举对应材质这四种类型(更改类型为Transparent设置参数为0.1f就可以实现透明效果)

不透明效果:

YPTools.SetMaterialRenderingMode(mrs[j],YPTools.RenderingMode.Transparent);
mrs[j].color = new Color(mrs[j].color.r, mrs[j].color.b, mrs[j].color.g, 0.1f);

将上面Transparent更改为Opaque 然后在设置Material 材质颜色的a值为1

YPTools.SetMaterialRenderingMode(mrs[j],YPTools.RenderingMode.Opaque);
mrs[j].color = new Color(mrs[j].color.r, mrs[j].color.b, mrs[j].color.g, 1f);

以上就是Unity对3D物体透明和不透明实现操作学习总结,也希望能帮助到大家。^ _ ^

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Unity 3D实现模型透明遮罩可以通过以下步骤: 第一步是在Shader中使用透明度。可以创建一个新的材质,并将其Shader设置为透明度。 根据模型的需求,可以设置不同的透明度值。透明度为1表示完全不透明透明度为0表示完全透明。 第二步是将半透明材质应用到模型上。在Unity中,可以选择需要添加材质的模型,并将其属性面板的材质设置为步骤一中创建的半透明材质。 第三步是设置模型的深度缓冲区(Depth Buffer)测试。深度缓冲区用于确定模型之间的绘制顺序。在半透明效果中,正确的深度缓冲区测试可以避免模型之间的遮挡问题。在Unity中,可以通过调整Camera组件的Depth Texture Mode和Depth写入设置来实现。 第四步是调整渲染队列(Render Queue)顺序。渲染队列用于确定渲染对象的绘制顺序,这对于半透明遮罩效果非常关键。可以通过修改Shader中的“Queue”指令来调整渲染队列顺序,将半透明材质的渲染队列指定为适当的值,确保其在其他不透明对象之后绘制。 使用以上步骤,可以在Unity 3D实现模型的半透明遮罩效果。通过调整透明度、深度缓冲区测试和渲染队列顺序,可以实现不同类型的半透明遮罩效果,为游戏或应用程序增添视觉上的吸引力。 ### 回答2: Unity 3D中可以通过使用半透明遮罩来实现模型的半透明效果。半透明遮罩是一种材质技术,用于在3D场景中将某些部分的模型透明化,使其能够透过来展示其他模型或场景。 要实现透明遮罩,首先需要为模型创建一个透明的材质。可以在Unity中选择一个透明的材质,如Standard(Transparent) 或 Legacy Shaders/Transparent/Diffuse等。然后,将这个材质拖拽到模型的渲染组件上。 接下来,在材质的设置中,可以调整透明度的参数。可以通过改变材质的Alpha通道值来控制透明度。Alpha通道的取值范围为0(完全透明)到1(完全不透明),可以根据需求进行调整。在半透明的情况下,可以设置为0.5,或根据需要的透明程度进行调整。 此外,也可以使用Shader来实现更复杂的半透明效果。Unity提供了一些内置的Shader,如Transparent/Diffuse 或 Transparent/Cutout/Diffuse等。这些Shader可以通过改变其属性和参数来实现不同的半透明效果。 在设计场景时,可以在需要半透明遮罩的模型上应用透明材质或Shader,然后设置其透明度,从而实现透明效果。通过调整不同模型透明度和位置,可以创造出复杂的遮罩效果,使场景看起来更加真实和有层次感。 总而言之,Unity 3D中可以通过使用透明材质和Shader来实现模型的半透明遮罩效果。通过调整透明度的参数和属性,可以创建出不同透明度和遮罩效果的模型,使场景更加逼真和生动。 ### 回答3: Unity 3D是一款常用的游戏开发引擎,它支持各种3D模型的创建和操作。在Unity 3D实现模型的半透明遮罩可以通过设置材质的透明度来实现。 首先,需要为模型创建一个材质,可以在Unity的资源管理器中右键点击,并选择创建-材质来创建一个新的材质。在材质的属性面板中,可以调整材质的颜色透明度和纹理等属性。 要实现透明效果,需要将材质的透明度设置为0到1之间的值,0表示完全透明,1表示完全不透明。在透明度的下拉菜单中,可以选择合适的透明度类型,例如Alpha Blend(标准透明度混合)或Alpha Test(透明度测试)等。 另外,还可以为材质添加一个透明的贴图。在材质的属性面板中,可以选择一个透明贴图,并通过调整贴图的透明度来改变模型透明度。 除了设置材质的透明度之外,还可以通过物体的渲染模式来控制透明度。在模型的Inspector面板中,打开“Renderer”选项卡,并在“Material”一栏中选择创建好的材质。然后,在渲染模式的下拉菜单中选择合适的选项,例如Opaque(不透明)、Transparent(半透明)或Fade(渐入渐出)等。 通过以上的设置,就可以在Unity 3D实现模型的半透明遮罩效果了。可以根据实际需求,调整模型透明度和颜色,来达到想要的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值