unity3D中通过代码修改模型模型半透明度,并动态修改模型半透明度效果

本文介绍了如何在Unity中创建并使用shader实现模型的半透明效果,包括创建shader编辑器、编写透明度相关代码、通过C#动态修改透明度,以及处理复杂贴图和大量材质的情况。
摘要由CSDN通过智能技术生成


前言

学习在Unity中怎么创建shader,实现模型半透明效果,同时从C#代码中获取shader中的参数进行不透明度的修改。
下一期讲解模型中如果有很复杂的贴图,非常多的材质的情况下,如何在UnityEditor中一键生成并替换对应的shader材质,将原本的材质替换为新的、挂载自己的shader脚本的材质球prefabs.


一、shader是什么?

shader中文名称为着色器,其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。其中就包括本期讲的透明度修改的渲染算法。

二、使用流程

1.创建shader编辑器

在Unity3D的Project页面中合适的位置右键创建一个最基础的shader文件

project页面窗口

2.创建材质

同样是在对应位置创建一个空的材质球,这个材质球是是有模型默认的基础材质,我们需要把这个shader赋予对应的材质球上,需要将创建的shader拖入Material上.在这里插入图片描述

3.编写shader代码

双击shader,编写对应的shader脚本

代码如下:


Shader "Custom/Translucent"
{
   Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_MainTex ("Main Tex", 2D) = "white" {}
		//我们使用一个新的属性_AlphaScale 来替代原先的_Cutoff 属性。_AlphaScale用于在透明纹理的基础上控制整体的透明度。
		_AlphaScale ("Alpha_Scale", Range(0, 1)) = 1
	}
	SubShader {
		//把Queue标签设置为Alphaparent	
		//把IgnoreProjector设置为true,意味着这个Shader不会受到投影器(Properties)的影响
		//RenderType标签可以让Unity把这个Shader归入到提前定义的组(这里就是Transparent组),以指明该Shader是一个使用了透明度混合的Shader
		//使用了透明度测试的Shader都应该在SubShader设置这三个标签
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		
		Pass {
			ZWrite On
			ColorMask 0
		}

		Pass {
			Tags { "LightMode"="ForwardBase" }
			//为透明度混合进行合适的混合状态设置
			//关闭深度写入
			ZWrite Off
			//使用了Blend SrcFactor DstFactor语义
			//把源颜色(该片元着色器产生的颜色)的混合因子SrcFactor设为SrcAlpha, 而目标颜色(已经存在于颜色缓冲中的颜色)的混合因子 DstFactor设为 OneMinusSrcAlpha 。
			Blend SrcAlpha OneMinusSrcAlpha//这部分在下面 六 会讲到
			
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			
			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _AlphaScale;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};
			
			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				
				fixed4 texColor = tex2D(_MainTex, i.uv);
				
				fixed3 albedo = texColor.rgb * _Color.rgb;
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				
				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
				
				//设置了该片元着色器返回值中的透明通道,它是纹理像素的透明通道和材质参数_AlphaScale的乘积。
				return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
			}
			
			ENDCG
		}
	} 
	FallBack "Transparent/VertexLit"
}

其中这一行语句为透明度修改的变量,透明度只能在0-1之间进行修改,默认为1

_AlphaScale ("Alpha_Scale", Range(0, 1)) = 1

4.材质赋予

在场景中拖入对应模型,将这个模型的材质,将带有这个shader的材质球赋予这个模型,此时用Cube替代,将材质球拖动给此模型。然后发现这个cube身上的材质已经被替换成对应的shader材质。
在这里插入图片描述
在这里插入图片描述

5.材质页面修改

然后我们发现对应的材质文件替换后,材质页面会显示我们shader代码中的变量,其中提到的_AlphaScale透明度修改变量也在其中,拖动此进度条会修改此模型的材质,具体的数值为透明度,例如0是完全透明,1是完全不透明。
在这里插入图片描述

6.C#代码动态修改或者动态获取透明度

首先是获取透明度参数,比如把脚本挂载在此cube上,然后获取Renderer的材质从而获取shader的变量。

private Renderer shaderRenderer; // 用于存储shader材质
shaderRenderer= shaderRenderer.material.GetFloat("_AlphaScale"); // 获取属性值,_AlphaScale为自定义属性名称

其次是修改对应的透明度,原理一样。

[Header("透明度")]
public float alpha;
shaderRenderer.material.SetFloat("_AlphaScale", alpha);

其中采用了协程的递归,实现透明度在0.2到0.5之间来回渐变切换,每秒渐变一次,如果当前是0.5透明度,则下次递归返回自己时透明度在1秒内变为0.2,如果不是,则变回0.5。

 IEnumerator DelayChange(float _alpha)
 {
     DOTween.To(() => alpha, x => alpha = x, _alpha, 1);//第一个1是透明度,第二个1是时间,1秒内将alpha变为1
     yield return new WaitForSeconds(1f);
     yield return StartCoroutine(DelayChange(_alpha == 0.5f ? 0.2f : 0.5f));
 }

其中用了Dotween插件,就是修改float值alpha在1秒内变为一个值,如果不用Dotween的话,则可以用计时器来写。

DOTween.To(() => alpha, x => alpha = x, _alpha, 1);//第一个1是透明度,第二个1是时间,1秒内将alpha变为1

最终代码如下:

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MaterialControl : MonoBehaviour
{
    [Header("透明度")]
    public float alpha;
    [Header("是否透明一直切换")]
    public bool isChangeAlways;
    private Renderer shaderRenderer; // 用于存储shader材质

    private void Start()
    {
        TryGetComponent(out shaderRenderer);
        isChangeAlways = true;
        //propertyValue = shaderRenderer.material.GetFloat("_AlphaScale"); // 获取属性值,_PropertyName为自定义属性名称
        StartCoroutine(DelayChange(0.5f));
    }

    private void Update()
    {
        if (isChangeAlways)
        {
            shaderRenderer.material.SetFloat("_AlphaScale", alpha);
        }
    }
    IEnumerator DelayChange(float _alpha)
    {
        DOTween.To(() => alpha, x => alpha = x, _alpha, 1);//第一个1是透明度,第二个1是时间,1秒内将alpha变为1
        yield return new WaitForSeconds(1f);
        yield return StartCoroutine(DelayChange(_alpha == 0.5f ? 0.2f : 0.5f));
    }

}

将此脚本挂载在需要变色的物体上后,会发现有两个变量,一个是alpha值,这个对应的是shader里的透明度,还有一个bool变量isChangeAlways,这个变为true时会一直切换,否则会停留在上次关闭时的透明度值。
在这里插入图片描述


总结

下一期讲解模型中如果有很复杂的贴图,非常多的材质的情况下,如何在UnityEditor中一键生成并替换对应的shader材质,将原本的材质替换为新的、挂载自己的shader脚本的材质球prefabs.

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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实现模型半透明遮罩效果了。可以根据实际需求,调整模型透明度和颜色,来达到想要的效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兮途途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值