Unity SpriteRender 支持Tile平铺的Shade:效果,可以然图片在一个MashRender 中 重复平铺图片

默认的SpriteRender不支持平铺,因此需要重复平铺地砖的时候,要么就得用一个Quad,要么就得重复的铺多个SpriteRender

使用Quad的情况下,还需要处理Z轴,比较麻烦,要不就会出现Z-Fighting(个别小米手机上会出现)

而使用平铺很多SpriteRanderer的方法,又会引起效能损耗。于是我想通过修改Unity内置的Shader的方式,让SpriteRender支持平铺。

设置如下:

Shader "Sprite/SupportTiling"
{
	Properties
	{
		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
		_Color("Tint", Color) = (1, 1, 1, 1)
		_RepeatX("RepeatX", float) = 1
		_RepeatY("RepeatY", float) = 1
		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
	}
 
	SubShader
	{
		Tags
		{
		"Queue" = "Transparent"
		"IgnoreProjector" = "True"
		"RenderType" = "Transparent"
		"PreviewType" = "Plane"
		"CanUseSpriteAtlas" = "True"
	}
 
		Cull Off
			Lighting Off
			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha
 
			Pass
		{
			CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile _ PIXELSNAP_ON
#pragma multi_compile _ 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;
 
			v2f vert(appdata_t IN)
			{
				v2f OUT;
				OUT.vertex = UnityObjectToClipPos(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;
			fixed _RepeatX;
			fixed _RepeatY;
 
			fixed4 SampleSpriteTexture(float2 uv)
			{
				uv.x = (uv.x - (int)(uv.x / (1 / _RepeatX)) * (1 / _RepeatX)) * _RepeatX;
				uv.y = (uv.y - (int)(uv.y / (1 / _RepeatY)) * (1 / _RepeatY)) * _RepeatY;
 
				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;
				c.rgb *= c.a;
				return c;
			}
			ENDCG
		}
	}
}


版权声明:本文为CSDN博主「幼发拉底河上的无头女尸」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wanghaodiablo/article/details/53488105

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity实现鼠标点击或悬停在字上时查看一张图片的功能,可以按照以下步骤进行操作: 1. 创建一个空对象,并将其命名为"TextHoverDetector"。 2. 在"TextHoverDetector"对象上添加一个Box Collider组件,并将其设置为触发器(Is Trigger)。 3. 在"TextHoverDetector"对象上添加一个脚本组件,命名为"HoverDetection",用于检测鼠标悬停或点击事件。 4. 在场景创建一个3D文字对象,并将其作为子对象放置在"TextHoverDetector"下。 5. 在场景创建一个空对象,并将其命名为"ImageDisplay"。 6. 在"ImageDisplay"对象上添加一个Sprite Renderer组件,用于显示图片。 7. 在"ImageDisplay"对象上添加一个脚本组件,命名为"ImageDisplayController",用于控制图片的显示和隐藏。 8. 将需要显示的图片拖拽到项目资源,并将其设置为Sprite类型。 9. 在"HoverDetection"脚本,编写鼠标悬停和点击事件的逻辑代码。 - 使用OnMouseEnter()方法监听鼠标悬停事件,在方法调用"ImageDisplayController"脚本的显示图片方法。 - 使用OnMouseExit()方法监听鼠标离开事件,在方法调用"ImageDisplayController"脚本的隐藏图片方法。 - 使用OnMouseDown()方法监听鼠标点击事件,在方法调用"ImageDisplayController"脚本的显示图片方法。 10. 在"ImageDisplayController"脚本,编写控制图片显示和隐藏的逻辑代码。 - 使用SetSprite()方法设置Sprite Renderersprite属性为需要显示的图片。 - 使用ShowImage()方法将Sprite Renderer组件的enabled属性设置为true,显示图片。 - 使用HideImage()方法将Sprite Renderer组件的enabled属性设置为false,隐藏图片。 这样,当鼠标悬停或点击在文字上时,图片将会显示出来。你可以根据需要自定义各个组件和方法的实现细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值