操作系统:Windows8.1

显卡:Nivida GTX965M

开发工具:Unity5.3.8f1


Unity提供了2D Object Sprite对象,但是没有提供外轮廓Outline效果的支持,本次将会使用扩展版本的默认sprite着色器以及一个简单的组件来添加sprite的轮廓。这可以用于突出鼠标上的精灵,突出显示环境中的元素,或仅仅使精灵从周围环境中脱颖而出。

首先,在您的项目中创建一个名为Sprite-Outline的新着色器。 这个着色器提供了默认sprite着色器的所有功能,并添加了sprite轮廓。

  1. Shader "Sprites/Outline"
  2. {
  3. Properties
  4. {
  5. [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
  6. _Color ("Tint", Color) = (,,,)
  7. [MaterialToggle] PixelSnap ("Pixel snap", Float) =
  8.  
  9. // Add values to determine if outlining is enabled and outline color.
  10. [PerRendererData] _Outline ("Outline", Float) =
  11. [PerRendererData] _OutlineColor("Outline Color", Color) = (,,,)
  12. }
  13.  
  14. SubShader
  15. {
  16. Tags
  17. {
  18. "Queue"="Transparent"
  19. "IgnoreProjector"="True"
  20. "RenderType"="Transparent"
  21. "PreviewType"="Plane"
  22. "CanUseSpriteAtlas"="True"
  23. }
  24.  
  25. Cull Off
  26. Lighting Off
  27. ZWrite Off
  28. Blend One OneMinusSrcAlpha
  29.  
  30. Pass
  31. {
  32. CGPROGRAM
  33. #pragma vertex vert
  34. #pragma fragment frag
  35. #pragma multi_compile _ PIXELSNAP_ON
  36. #pragma shader_feature ETC1_EXTERNAL_ALPHA
  37. #include "UnityCG.cginc"
  38.  
  39. struct appdata_t
  40. {
  41. float4 vertex : POSITION;
  42. float4 color : COLOR;
  43. float2 texcoord : TEXCOORD0;
  44. };
  45.  
  46. struct v2f
  47. {
  48. float4 vertex : SV_POSITION;
  49. fixed4 color : COLOR;
  50. float2 texcoord : TEXCOORD0;
  51. };
  52.  
  53. fixed4 _Color;
  54. float _Outline;
  55. fixed4 _OutlineColor;
  56.  
  57. v2f vert(appdata_t IN)
  58. {
  59. v2f OUT;
  60. OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
  61. OUT.texcoord = IN.texcoord;
  62. OUT.color = IN.color * _Color;
  63. #ifdef PIXELSNAP_ON
  64. OUT.vertex = UnityPixelSnap (OUT.vertex);
  65. #endif
  66.  
  67. return OUT;
  68. }
  69.  
  70. sampler2D _MainTex;
  71. sampler2D _AlphaTex;
  72. float4 _MainTex_TexelSize;
  73.  
  74. fixed4 SampleSpriteTexture (float2 uv)
  75. {
  76. fixed4 color = tex2D (_MainTex, uv);
  77.  
  78. #if ETC1_EXTERNAL_ALPHA
  79. // get the color from an external texture (usecase: Alpha support for ETC1 on android)
  80. color.a = tex2D (_AlphaTex, uv).r;
  81. #endif //ETC1_EXTERNAL_ALPHA
  82.  
  83. return color;
  84. }
  85.  
  86. fixed4 frag(v2f IN) : SV_Target
  87. {
  88. fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
  89.  
  90. // If outline is enabled and there is a pixel, try to draw an outline.
  91. if (_Outline > && c.a != ) {
  92. // Get the neighbouring four pixels.
  93. fixed4 pixelUp = tex2D(_MainTex, IN.texcoord + fixed2(, _MainTex_TexelSize.y));
  94. fixed4 pixelDown = tex2D(_MainTex, IN.texcoord - fixed2(, _MainTex_TexelSize.y));
  95. fixed4 pixelRight = tex2D(_MainTex, IN.texcoord + fixed2(_MainTex_TexelSize.x, ));
  96. fixed4 pixelLeft = tex2D(_MainTex, IN.texcoord - fixed2(_MainTex_TexelSize.x, ));
  97.  
  98. // If one of the neighbouring pixels is invisible, we render an outline.
  99. if (pixelUp.a * pixelDown.a * pixelRight.a * pixelLeft.a == ) {
  100. c.rgba = fixed4(, , , ) * _OutlineColor;
  101. }
  102. }
  103.  
  104. c.rgb *= c.a;
  105.  
  106. return c;
  107. }
  108. ENDCG
  109. }
  110. }
  111. }

现在创建一个名为SpriteOutline的材质,并在检查器中分配新创建的着色器。

接下来创建一个新的C#脚本并将其命名为SpriteOutline。 该组件将在编辑器和运行时处理更新我们的材质,关闭或打开轮廓效果,还可以更改轮廓颜色。 也可以在动画中使用此组件,以启用或禁用特定动画帧的轮廓或更改轮廓颜色。

  1. using UnityEngine;
  2.  
  3. [ExecuteInEditMode]
  4. public class SpriteOutline : MonoBehaviour {
  5.  
  6. public Color color = Color.white;
  7.  
  8. private SpriteRenderer spriteRenderer;
  9.  
  10. void OnEnable () {
  11. spriteRenderer = GetComponent<SpriteRenderer>();
  12.  
  13. UpdateOutline(true);
  14. }
  15.  
  16. private void OnDisable()
  17. {
  18. UpdateOutline(false);
  19. }
  20.  
  21. // Update is called once per frame
  22. void Update () {
  23. UpdateOutline(true);
  24. }
  25.  
  26. void UpdateOutline(bool outline)
  27. {
  28. MaterialPropertyBlock block = new MaterialPropertyBlock();
  29. spriteRenderer.GetPropertyBlock(block);
  30. block.SetFloat("_Outline", outline ? 1f : );
  31. block.SetColor("_OutlineColor", color);
  32. spriteRenderer.SetPropertyBlock(block);
  33. }
  34. }

现在,基本工作完成了,添加了一些精灵到你的场景。 将SpriteRenderer组件的材质字段更改为上面创建的SpriteOutline材质。 您还需要将SpriteOutline组件添加到此游戏对象中,以默认显示白色轮廓。 要隐藏轮廓,只需禁用或删除组件。

随着所有的完成,你现在应该有一个黄色轮廓的精灵。 在检查view中,您可以独立于SpriteRenderer颜色将颜色更改为任何您想要的颜色。 自定义着色器还维护默认sprite着色器的所有现有功能。

大功告成,效果如图所示!

Unity之2D Sprite Outline外轮廓效果的更多相关文章

  1. [ShaderStaff] Sprite Outline外轮廓效果

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity5.3.8f1 Unity提供了2D Object Sprite对象,但是没有提供外轮廓Outline效果的支持 ...

  2. Unity中实现网格轮廓效果,选中边框效果

    问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...

  3. CSS3外轮廓属性

    外轮廓outline在页面中呈现的效果和边框border呈现的效果极其相似,但和元素边框border完全不同,外轮廓线不占用网页布局空间,不一定是矩形,外轮廓是属于一种动态样式,只有元素获取到焦点或者 ...

  4. Unity Chan 2D Asset

    Unity Chan 2D Asset 4月份時,UNITY CHAN 官方網站推出了3D大島こはく,之後也有更新1.11版,而在六月12日時,則釋出了2D版本素材,一樣可以在UNITY CHAN 官 ...

  5. CSS控制边界、边框与外轮廓

    一.CSS控制边界 1.内边距 padding(内边距也叫内填充) padding-bottom 长度/百分比 元件下端边线的空隙 padding-left 长度/百分比 元件左端边线的空隙 padd ...

  6. CSS Outline(轮廓)

    CSS Outline(轮廓) 一.CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. CSS outline 属性规定元素轮廓 ...

  7. Siki_Unity_1-8_使用Unity开发2D游戏_PongGame

    Unity 1-8 使用Unity开发2D游戏 PongGame 任务1:演示 http://pan.baidu.com/s/1pKUHsev; up2i 任务2:案例介绍 创建PongGame,注意 ...

  8. canvas绘制图像轮廓效果

    在2d图形可视化开发中,经常要绘制对象的选中效果. 一般来说,表达对象选中可以使用边框,轮廓或者发光的效果.  发光的效果,可以使用canvas的阴影功能,比较容易实现,此处不在赘述. 绘制边框 绘制 ...

  9. unity 之2D游戏简单操作

    unity 做2D项目也很方便.  首先要调整camera的模式,camera 的检视面板参数如下: perspective 模式就是平时用的 模式.摄像机到游戏物体是有角度的张开, 而 orthog ...

随机推荐

  1. WPF之路五:wpf 隐藏与显示 Visibility

    WPF里枚举变量Visibility 有三个值:Visible, Collapsed和Hidden.其中Collapsed是WPF新引进的,其作用是不仅隐去Control,同时也会移除Control所 ...

  2. Html5-测试Canvas

      // 浏览器不支持Html5 Canvas"; var theCanvas=document.getElementById("canvas_one"); if(!th ...

  3. android开发之-Android 开发之4.0界面设计原则-整理

    设计原则: 一.让人着迷: 1.给人惊喜:使用漂亮的界面.精心的动画.适时的音乐. 2.真实的对象比按钮和菜单更有趣   这句话的意思是:使用描述描述性的图标作为快捷方式,界面美观   当然这个快捷方 ...

  4. 【Ubuntu】您没有查看“sf_VirtualDisk”的内容所需的权限。

    原文链接:http://www.crifan.com/can_not_access_share_folder_in_ubuntu_virtualbox/ [问题] 之前已经搞定可以自动共享文件夹了: ...

  5. Windows入门基础:1.关于CreateWindow()函数使用中遇到的问题

    我在实现显示窗口的程序中,遇到一个问题:首先程序没有任何语法错误,编译能够通过,但是就是不能弹出窗口. 后来在MSDN中查询CreateWindow()函数,发现了下面这句话: "If lp ...

  6. C#委托冒泡

    委托的实现,就是编译器自行定义了一个类:有三个重要参数1.制定操作对象,2.指定委托方法3.委托链 看如下一个列子: class DelegatePratice { public static voi ...

  7. 36.java_exception_test

    package mytext1; class TZException extends Exception{ TZException(String str){ super(str); } public ...

  8. ArrayList,LinkedList的对比

    ArrayList,LinkedList都是Collection接口的通用实现方式,两者采用了不用的存储策略,用来适应不同场合的需要. 实现方式 ArrayList的内部采用集合的方式存储数据 唯一需 ...

  9. Elasticsearch1.7服务搭建与入门操作

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  10. MapReduce中一次reduce方法的调用中key的值不断变化分析及源码解析

    摘要:mapreduce中执行reduce(KEYIN key, Iterable<VALUEIN> values, Context context),调用一次reduce方法,迭代val ...