Unity模型变灰Shader 作者: rontian 时间: 2017-12-22 分类: Unity3D 评论 #### 使用方法 ```csharp Renderer tryRenderer = gameObject.GetComponent(); if (value) { tryRenderer.material.SetInt("_Desaturate", 1); } else { tryRenderer.material.SetInt("_Desaturate", 0); } ``` #### 代码 ``` // Shader created with Shader Forge v1.38 Shader "Shader Forge/Model gray" { Properties { _Diffuse ("Diffuse", 2D) = "white" {} _Color ("Color", Color) = (0.5,0.5,0.5,1) [MaterialToggle] _Desaturate ("Desaturate", Float ) = 0 [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" } Pass { Name "FORWARD" Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "AutoLight.cginc" #include "Lighting.cginc" #pragma multi_compile_fwdbase_fullshadows #pragma multi_compile_fog #pragma only_renderers d3d9 d3d11 glcore gles metal #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform float4 _Color; uniform fixed _Desaturate; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; LIGHTING_COORDS(3,4) UNITY_FOG_COORDS(5) }; VertexOutput vert (VertexInput v) { VertexOutput o = (VertexOutput)0; o.uv0 = v.texcoord0; o.normalDir = UnityObjectToWorldNormal(v.normal); o.posWorld = mul(unity_ObjectToWorld, v.vertex); float3 lightColor = _LightColor0.rgb; o.pos = UnityObjectToClipPos( v.vertex ); UNITY_TRANSFER_FOG(o,o.pos); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } float4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3 normalDirection = i.normalDir; float4 _Diffuse_var = tex2D(_Diffuse,TRANSFORM_TEX(i.uv0, _Diffuse)); clip(_Diffuse_var.a - 0.5); float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz); float3 lightColor = _LightColor0.rgb; ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); ////// Emissive: float3 node_544 = (lerp( _Diffuse_var.rgb, (float3(0.6,0.6,0.6)*lerp(_Diffuse_var.rgb,dot(_Diffuse_var.rgb,float3(0.3,0.59,0.11)),1.0)), _Desaturate )*_Color.rgb); // Diffuse Color float3 emissive = (node_544*_LightColor0.rgb*UNITY_LIGHTMODEL_AMBIENT.rgb); float node_7731 = 0.5; float node_5683 = ((max(0,dot(lightDirection,normalDirection))+node_7731)*node_7731); float3 finalColor = emissive + ((node_544*(node_5683*node_5683))*_LightColor0.rgb*attenuation); fixed4 finalRGBA = fixed4(finalColor,1); UNITY_APPLY_FOG(i.fogCoord, finalRGBA); return finalRGBA; } ENDCG } Pass { Name "FORWARD_DELTA" Tags { "LightMode"="ForwardAdd" } Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDADD #include "UnityCG.cginc" #include "AutoLight.cginc" #include "Lighting.cginc" #pragma multi_compile_fwdadd_fullshadows #pragma multi_compile_fog #pragma only_renderers d3d9 d3d11 glcore gles metal #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform float4 _Color; uniform fixed _Desaturate; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; LIGHTING_COORDS(3,4) UNITY_FOG_COORDS(5) }; VertexOutput vert (VertexInput v) { VertexOutput o = (VertexOutput)0; o.uv0 = v.texcoord0; o.normalDir = UnityObjectToWorldNormal(v.normal); o.posWorld = mul(unity_ObjectToWorld, v.vertex); float3 lightColor = _LightColor0.rgb; o.pos = UnityObjectToClipPos( v.vertex ); UNITY_TRANSFER_FOG(o,o.pos); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } float4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3 normalDirection = i.normalDir; float4 _Diffuse_var = tex2D(_Diffuse,TRANSFORM_TEX(i.uv0, _Diffuse)); clip(_Diffuse_var.a - 0.5); float3 lightDirection = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w)); float3 lightColor = _LightColor0.rgb; ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); float3 node_544 = (lerp( _Diffuse_var.rgb, (float3(0.6,0.6,0.6)*lerp(_Diffuse_var.rgb,dot(_Diffuse_var.rgb,float3(0.3,0.59,0.11)),1.0)), _Desaturate )*_Color.rgb); // Diffuse Color float node_7731 = 0.5; float node_5683 = ((max(0,dot(lightDirection,normalDirection))+node_7731)*node_7731); float3 finalColor = ((node_544*(node_5683*node_5683))*_LightColor0.rgb*attenuation); fixed4 finalRGBA = fixed4(finalColor * 1,0); UNITY_APPLY_FOG(i.fogCoord, finalRGBA); return finalRGBA; } ENDCG } Pass { Name "ShadowCaster" Tags { "LightMode"="ShadowCaster" } Offset 1, 1 Cull Back CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_SHADOWCASTER #include "UnityCG.cginc" #include "Lighting.cginc" #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_shadowcaster #pragma multi_compile_fog #pragma only_renderers d3d9 d3d11 glcore gles metal #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; struct VertexInput { float4 vertex : POSITION; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { V2F_SHADOW_CASTER; float2 uv0 : TEXCOORD1; }; VertexOutput vert (VertexInput v) { VertexOutput o = (VertexOutput)0; o.uv0 = v.texcoord0; o.pos = UnityObjectToClipPos( v.vertex ); TRANSFER_SHADOW_CASTER(o) return o; } float4 frag(VertexOutput i) : COLOR { float4 _Diffuse_var = tex2D(_Diffuse,TRANSFORM_TEX(i.uv0, _Diffuse)); clip(_Diffuse_var.a - 0.5); SHADOW_CASTER_FRAGMENT(i) } ENDCG } } FallBack "Diffuse" CustomEditor "ShaderForgeMaterialInspector" } ```
Unity复制GameObject路径到剪切板 作者: rontian 时间: 2017-12-22 分类: Unity3D 评论 ```csharp /// /// 添加Hierarychy中的右键菜单 /// 说明:"GameObject/"下[priority小于等于49]的按钮会出现在Hierarychy的右键菜单中 /// public class HierarchyEditor { private static readonly TextEditor CopyTool = new TextEditor(); /// /// 将一个GameObject在Hierarchy中的完整路径拷贝的剪切板 /// [MenuItem("GameObject/Copy Path", priority = 20)] static void CopyTransPath() { Transform trans = Selection.activeTransform; if(null == trans) return; CopyTool.text = GetTransPath(trans); CopyTool.SelectAll(); CopyTool.Copy(); } /// /// 获得GameObject在Hierarchy中的完整路径 /// public static string GetTransPath(Transform trans) { if (null == trans) return string.Empty; if (null == trans.parent) return trans.name; return GetTransPath(trans.parent) + "/" + trans.name; } } ``` ---- > 转载来源:[http://www.jianshu.com/p/19dac8d94f29](http://www.jianshu.com/p/19dac8d94f29)
UGUI 新手引导镂空代码 作者: rontian 时间: 2017-12-22 分类: Unity3D 评论 ```csharp /// /// 实现镂空效果的Mask组件 /// public class HollowOutMask : MaskableGraphic, ICanvasRaycastFilter { [SerializeField] private RectTransform _target; private Vector3 _targetMin = Vector3.zero; private Vector3 _targetMax = Vector3.zero; private bool _canRefresh = true; private Transform _cacheTrans = null; /// /// 设置镂空的目标 /// public void SetTarget(RectTransform target) { _canRefresh = true; _target = target; _RefreshView(); } private void _SetTarget(Vector3 tarMin, Vector3 tarMax) { if (tarMin == _targetMin && tarMax == _targetMax) return; _targetMin = tarMin; _targetMax = tarMax; SetAllDirty(); } private void _RefreshView() { if(!_canRefresh) return; _canRefresh = false; if (null == _target) { _SetTarget(Vector3.zero, Vector3.zero); SetAllDirty(); } else { Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(_cacheTrans, _target); _SetTarget(bounds.min, bounds.max); } } protected override void OnPopulateMesh(VertexHelper vh) { if (_targetMin == Vector3.zero && _targetMax == Vector3.zero) { base.OnPopulateMesh(vh); return; } vh.Clear(); // 填充顶点 UIVertex vert = UIVertex.simpleVert; vert.color = color; Vector2 selfPiovt = rectTransform.pivot; Rect selfRect = rectTransform.rect; float outerLx = -selfPiovt.x*selfRect.width; float outerBy = -selfPiovt.y*selfRect.height; float outerRx = (1 - selfPiovt.x)*selfRect.width; float outerTy = (1 - selfPiovt.y)*selfRect.height; // 0 - Outer:LT vert.position = new Vector3(outerLx, outerTy); vh.AddVert(vert); // 1 - Outer:RT vert.position = new Vector3(outerRx, outerTy); vh.AddVert(vert); // 2 - Outer:RB vert.position = new Vector3(outerRx, outerBy); vh.AddVert(vert); // 3 - Outer:LB vert.position = new Vector3(outerLx, outerBy); vh.AddVert(vert); // 4 - Inner:LT vert.position = new Vector3(_targetMin.x, _targetMax.y); vh.AddVert(vert); // 5 - Inner:RT vert.position = new Vector3(_targetMax.x, _targetMax.y); vh.AddVert(vert); // 6 - Inner:RB vert.position = new Vector3(_targetMax.x, _targetMin.y); vh.AddVert(vert); // 7 - Inner:LB vert.position = new Vector3(_targetMin.x, _targetMin.y); vh.AddVert(vert); // 设定三角形 vh.AddTriangle(4, 0, 1); vh.AddTriangle(4, 1, 5); vh.AddTriangle(5, 1, 2); vh.AddTriangle(5, 2, 6); vh.AddTriangle(6, 2, 3); vh.AddTriangle(6, 3, 7); vh.AddTriangle(7, 3, 0); vh.AddTriangle(7, 0, 4); } bool ICanvasRaycastFilter.IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera) { if (null == _target) return true; // 将目标对象范围内的事件镂空(使其穿过) return !RectTransformUtility.RectangleContainsScreenPoint(_target, screenPos, eventCamera); } protected override void Awake() { base.Awake(); _cacheTrans = GetComponent(); } #if UNITY_EDITOR void Update() { _canRefresh = true; _RefreshView(); } #endif } ``` --- >转载来源:[http://www.jianshu.com/p/ea2b68f0a345](http://www.jianshu.com/p/ea2b68f0a345)