操作系统:Windows8.1

显卡:Nivida GTX965M

开发工具:Unity5.3.8f1


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

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

Shader "Sprites/Outline"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (,,,)
[MaterialToggle] PixelSnap ("Pixel snap", Float) = // Add values to determine if outlining is enabled and outline color.
[PerRendererData] _Outline ("Outline", Float) =
[PerRendererData] _OutlineColor("Outline Color", Color) = (,,,)
} SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
} Cull Off
Lighting Off
ZWrite Off
Blend One OneMinusSrcAlpha Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ PIXELSNAP_ON
#pragma shader_feature ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc" struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
}; fixed4 _Color;
float _Outline;
fixed4 _OutlineColor; v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color;
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap (OUT.vertex);
#endif return OUT;
} sampler2D _MainTex;
sampler2D _AlphaTex;
float4 _MainTex_TexelSize; fixed4 SampleSpriteTexture (float2 uv)
{
fixed4 color = tex2D (_MainTex, uv); #if ETC1_EXTERNAL_ALPHA
// get the color from an external texture (usecase: Alpha support for ETC1 on android)
color.a = tex2D (_AlphaTex, uv).r;
#endif //ETC1_EXTERNAL_ALPHA return color;
} fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color; // If outline is enabled and there is a pixel, try to draw an outline.
if (_Outline > && c.a != ) {
// Get the neighbouring four pixels.
fixed4 pixelUp = tex2D(_MainTex, IN.texcoord + fixed2(, _MainTex_TexelSize.y));
fixed4 pixelDown = tex2D(_MainTex, IN.texcoord - fixed2(, _MainTex_TexelSize.y));
fixed4 pixelRight = tex2D(_MainTex, IN.texcoord + fixed2(_MainTex_TexelSize.x, ));
fixed4 pixelLeft = tex2D(_MainTex, IN.texcoord - fixed2(_MainTex_TexelSize.x, )); // If one of the neighbouring pixels is invisible, we render an outline.
if (pixelUp.a * pixelDown.a * pixelRight.a * pixelLeft.a == ) {
c.rgba = fixed4(, , , ) * _OutlineColor;
}
} c.rgb *= c.a; return c;
}
ENDCG
}
}
}

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

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

using UnityEngine;

[ExecuteInEditMode]
public class SpriteOutline : MonoBehaviour { public Color color = Color.white; private SpriteRenderer spriteRenderer; void OnEnable () {
spriteRenderer = GetComponent<SpriteRenderer>(); UpdateOutline(true);
} private void OnDisable()
{
UpdateOutline(false);
} // Update is called once per frame
void Update () {
UpdateOutline(true);
} void UpdateOutline(bool outline)
{
MaterialPropertyBlock block = new MaterialPropertyBlock();
spriteRenderer.GetPropertyBlock(block);
block.SetFloat("_Outline", outline ? 1f : );
block.SetColor("_OutlineColor", color);
spriteRenderer.SetPropertyBlock(block);
}
}

现在,基本工作完成了,添加了一些精灵到你的场景。 将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. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  2. POI 操作Excel疑难点笔记

    在POI中,我们可以通过Workbook, Sheet, Row, Cell 对象分别对应Excel文件.工作表.行.单元格. 在POI的使用中,我遇到了几个非常诡异.捉摸不透的问题,现在记录下来. ...

  3. redux计算器

    //简单运用redux写了一个加减乘除功能 <!DOCTYPE html><html lang="en"><head> <meta cha ...

  4. mysql自动备份删除5天前的备份

    1.查看磁盘空间情况: # df -h 2.创建备份目录: 上面我们使用命令看出/home下空间比较充足,所以可以考虑在/home保存备份文件: cd /home mkdir backup cd ba ...

  5. Struts2基础学习(三)—Result和数据封装

    一.Result      Action处理完用户请求后,将返回一个普通的字符串,整个普通字符串就是一个逻辑视图名,Struts2根据逻辑视图名,决定响应哪个结果,处理结果使用<result&g ...

  6. 第三人称角色移动及自由移动视野(RigidBody实现)

    重点:向量的运算.在获得水平及垂直方向的速度之后,将方向进行重设,让方向与视野同步(即:相机的方向与人物方向相同) 下面以一个实例来说明如何操作: 1.如图创建一个地形(Terrain),两个正方体( ...

  7. 使用spring利用HandlerExceptionResolver实现全局异常捕获

    最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...

  8. 【linux 爱好者群】程序猿的那些聊天记录

    分享&&交流&&开放 you should get it 声明:好吧,我们的群只有5个人,但是有句话不是说的很对吗,一个项目最理想的不就是5个人么.我是写文本那个. 下 ...

  9. spring之bean

    Bean的基本配置 id属性 id属性确定bean的唯一标识符,容器对bean的管理,访问,以及该bean的依赖关系,都通过该属性来完成.bean的id属性在Spring容器中应该是唯一的. clas ...

  10. js中的IP格式正则匹配校验详解~

    IPV4的格式为x:y:z:w,其中{x,y,z,w}属于{0~255}的正整数: 下面是其校验的正则表达式: function isIP(ip) { var re =  /^(\d{1,2}|1\d ...