unity 物体颜色从一端逐渐变到另一端

来源:互联网 发布:深圳阿里云大厦物业 编辑:程序博客网 时间:2024/06/05 05:24

这个功能主要来自项目中模拟建筑工人每天施工进度情况,一个大构件工人不可能一天完成,这个构件工人完成多少要求该构件变色百分比就为多少

直接看效果:

变色的走向我们可以通过程序控制

就是和shader简单交互就行,我这里是个简单的demo  大体思路没毛病 还是简单粗暴看代码吧

unity的shader(封装的都不知道啥玩意)真的石乐志,一点不奔放,由于版本这块 查api差点放弃,有点openGl就看的懂,shader很简单

Shader:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/dfs" {Properties{_Color("Color", Color) = (1,1,1,1)_Color1("Color1", Color) = (1,0,0,0)_MainTex("Albedo (RGB)", 2D) = "white" {}_Glossiness("Smoothness", Range(0,1)) = 0.5_Metallic("Metallic", Range(0,1)) = 0.0_Clip("Clip", float) = 0.5//-0.5f(全变色)-->0.5f(全不变色)[KeywordEnum(None, Left, Up, Forward)]_Mode("Mode", Float) = 0//左到右,上到下,前到后}SubShader{Tags{ "RenderType" = "Opaque" }LOD 200CGPROGRAM// 基于物理的标准照明模型,并允许所有光线类型的阴影#pragma surface surf Standard fullforwardshadows vertex:vert// 使用着色器模型3.0目标,以获得更好的照明#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;float4 localPos;};half _Glossiness;half _Metallic;fixed4 _Color;float _Clip;float _Mode;float4 _Color1;void vert(inout appdata_full i, out Input o){UNITY_INITIALIZE_OUTPUT(Input, o);o.localPos = i.vertex;}void surf(Input i, inout SurfaceOutputStandard o) {/*if (i.localPos.x >= _Clip && _Mode == 1 || i.localPos.y >= _Clip && _Mode == 2 || i.localPos.z >= _Clip && _Mode == 3){clip(-1);}*///老铁啊Albedo是一种颜色纹理哟fixed4 c = tex2D(_MainTex, i.uv_MainTex) * _Color;if (i.localPos.x >= _Clip && _Mode == 1 || i.localPos.y >= _Clip && _Mode == 2 || i.localPos.z >= _Clip && _Mode == 3){//clip(-1);o.Albedo = _Color1;}else{o.Albedo = c.rgb;}// 金属感和平滑度滑动条条o.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"}


核心脚本:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class getshader : MonoBehaviour {    private MeshRenderer mat;    private Vector4 v41;    private float v=0;//颜色值这里随便默认,主要看shader里的    public Vector4 Scolor = new Vector4(0.0f, 1.0f, 0.0f, 1.0f);Material material;    void Awake()    {        //动态赋予材质,懒得创建材质球 material = new Material (Shader.Find("Custom/dfs"));//material.color = Color.yellow;GetComponent<Renderer>().material = material;    }void Start(){v = material.GetFloat ("_Clip");//1 left到right 2 up到down 3 forward到backmaterial.SetFloat ("_Mode",3.0f);//颜色变化方向}    void Update()    {//这里播放就放update里吧,懒得写接口获取数据播放变化效果        v = v - 0.001f;material.SetFloat ("_Clip",v);//颜色变化比例        print(v);    }}

原创粉丝点击