怎么把一个sprite变灰色 unity3d sprite 图集

1314人阅读
unity3d(2)
上期讲了在UIpanel.clipping != Clipping.SoftClip下按钮变灰的方案,但是当应用到SoftClip下时,会导致Sprite无法正常遮罩,而且变灰效果也消失的情况,例如ScrollView下,会导致上述问题。
因一时无从知晓到底哪里出现问题,于是便从ScrollView实现遮罩的方式入手,先了解下NGUI实现遮罩的方式,NGUI的渲染都是通过UIDrawCall类进行的,通过断点发现,当ScrollView进行遮罩时会在UIDrawCall的CreateMaterial()函数内进行动态换Shader操作:
if (panel.clipping == Clipping.TextureMask)
mTextureClip = true;
shader = Shader.Find("Hidden/" + shaderName +textureClip);
else if (mClipCount != 0)
shader = Shader.Find("Hidden/" + shaderName + " " + mClipCount);
if (shader == null) shader = Shader.Find(shaderName + " " + mClipCount);
if (shader == null && mClipCount == 1)
mLegacyShader = true;
shader = Shader.Find(shaderName + soft);
通过上述代码可知,当为SoftClip状态下时,NGUI会自动给Sprite寻找名字为”Hidden/” + shaderName + ” ” + mClipCount的shader,显然,在Normal状态下,此时shader会变为NGUI自带的”Hidden/Unlit/Transparent Colored 1”,进入该shader后,我们会发现在frag()函数内有这么句代码col.a *= clamp( min(factor.x, factor.y), 0.0, 1.0);问题找到了,原来ScrollView是通过句代码来实现遮罩的,那么当我们将shader换成我们自己的shader时,首先在SoftClip下找不到一个叫”Hidden/xxxx 1”的shader进行替换,这时NGUI会强行换成默认状态的shader,因此,这就是导致我们上述问题的元凶。
替换为默认shader代码// Always fallback to the default shader
if (shader == null) shader = Shader.Find(“Unlit/Transparent Colored”)。
既然问题找到了,那么就可以着手解决这个问题了,首先仿照NGUI的shader,建立一个名叫”Hidden/UI/Sprite/Gray 1” 的shader,///注意此处shader命名需要与我第一篇的shader命名一致才可,即UI/Sprite/Gray处两个shader必须保持一致!!!!然后将”Hidden/Unlit/Transparent Colored 1”完全copy过来,最后在他的frag()函数内自行添加实现Sprite变灰的代码即可,这样在遮罩时就会找到正确的shader并替换,现在贴上我修改后的shader:
Shader "Hidden/UI/Sprite/Gray 1"
Properties
_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
Lighting Off
ZWrite Off
Offset -1, -1
Fog { Mode Off }
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex
float4 _ClipRange0 = float4(0.0, 0.0, 1.0, 1.0)
float2 _ClipArgs0 = float2(1000.0, 1000.0)
struct appdata_t
float4 vertex : POSITION
half4 color : COLOR
float2 texcoord : TEXCOORD0
struct v2f
float4 vertex : POSITION
half4 color : COLOR
float2 texcoord : TEXCOORD0
float2 worldPos : TEXCOORD1
v2f vert (appdata_t v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex)
o.color = v.color
o.texcoord = v.texcoord
o.worldPos = v.vertex.xy * _ClipRange0.zw + _ClipRange0.xy
half4 frag (v2f IN) : COLOR
// Softness factor
float2 factor = (float2(1.0, 1.0) - abs(IN.worldPos)) * _ClipArgs0
// Sample the texture
half4 col = tex2D(_MainTex, IN.texcoord) * IN.color
col.rgb = dot(col.rgb, fixed3(.222,.707,.071))
col.a *= clamp( min(factor.x, factor.y), 0.0, 1.0)
return col
跟上一篇shader一样,通过 col.rgb = dot(col.rgb, fixed3(.222,.707,.071)); 实现变灰效果, col.a *= clamp( min(factor.x, factor.y), 0.0, 1.0);实现遮罩效果,现在两种效果合一,应该可以正常工作了,
可以看到正常工作,ok收工,下期开讲当ScrollView下有成百上千个item时优化工作,让滑动变得流畅。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4548次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'请问使用NGUI应该使用哪个控件,怎么操作才能显示上面的背景图片,
尝试了创建sprite,但是给sprite添加图片时候失败了,-Unity3D-论坛-U3D在线
Unity3D在线
当前位置: ->
-> 请问使用NGUI应该使用哪个控件,怎么操作才能显示上面的背景图片,
尝试了创建sprite,但是给sprite添加图片时候失败了,
Unity3D 论坛 > 请问使用NGUI应该使用哪个控件,怎么操作才能显示上面的背景图片,
尝试了创建sprite,但是给sprite添加图片时候失败了,围观:1393 | 回复:21
楚尘洪积分:80帖子:12
请问使用NGUI应该使用哪个控件,怎么操作才能显示上面的背景图片,
尝试了创建sprite,但是给sprite添加图片时候失败了,
沈以安积分:3帖子:0
大家晚上好~~打扰一下发个招聘信息~ 高薪招聘:网站开发技术经理:(年薪35-40万) ,官网产品经理:(年薪35-50万)Unity 3D开发工程师:(年薪20-30万),编辑器开发工程师:(年薪20-30万)、客户端开发界面工程师:(年薪20-30万)高级服务端开发工程师:(年薪20-30万),资深前端开发工程师:(年薪20-40万),高级Java服务开发工程师(服务端):(年薪30-50万),资深PHP应用开发工程师:(年薪20-40),资深网络平面设计师:(年薪20-50)欢迎自荐或推,请小窗联系!!!
沈以安积分:3帖子:0
独孤俊仞积分:1帖子:0
看来我去面试的时候要价太低没录用- -
赫连留冰积分:11帖子:0
地点都没有
赫连留冰积分:11帖子:0
地方是第一要考虑的吧
项智元积分:4帖子:0
客户端开发界面工程师
是干嘛?画画吗
赫连留冰积分:11帖子:0
赫连留冰积分:11帖子:0
UI工程师喽
项智元积分:4帖子:0
UI还专门搞个人啊
项智元积分:4帖子:0
我们游戏UI我顺道做了
免责声明:本站所有内容来源于互联网,如果本站部分内容侵犯您的权益,请您告知,站长会立即处理
Copyright Unity3D在线 All Rights Reserved.Theme by U3dOL 备案:京ICP备号-4 |SiteMap |网站地图 |百度统计| 联系我们1371人阅读
unity入门(16)
unity3d 更换sprite renderer中sprite的图片&
所更换图片尺寸与原图片相同
SpriteRenderer spr = gameObject.GetComponent&SpriteRenderer&();
Texture2D texture2d = (Texture2D)Resources.Load(&herominired&);//更换为红色主题英雄角色图片
Sprite sp = Sprite.Create(texture2d,spr.sprite.textureRect,new Vector2(0.5f,0.5f));//注意居中显示采用0.5f值
spr.sprite =
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51843次
排名:千里之外
原创:26篇
转载:132篇
(8)(5)(3)(1)(24)(26)(19)(1)(9)(6)(5)(2)(10)(3)(1)(2)(13)(13)(5)(2)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 unity3d sprite 切图 的文章

 

随机推荐