您的位置:首页 > 移动开发 > Unity3D

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

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

直接看效果:



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






就是和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 200

CGPROGRAM
// 基于物理的标准照明模型,并允许所有光线类型的阴影
#pragma surface surf Standard fullforwardshadows vertex:vert

// 使用着色器模型3.0目标,以获得更好的照明
#pragma target 3.0

sampler2D _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到back
material.SetFloat ("_Mode",3.0f);//颜色变化方向

}
void Update()
{
//这里播放就放update里吧,懒得写接口获取数据播放变化效果
v = v - 0.001f;
material.SetFloat ("_Clip",v);//颜色变化比例
print(v);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: