Unity NGUI UIPanel下对粒子的剪裁
使用 unity 做游戏开发时,有时需要在scroll view下使用粒子,但粒子是不会被 UIPanel 所裁剪的,本人提供了脚本 ParticleSystemClipper,用来处理这种情况。思路是,通过 UIPanel 的 finalClipRegion 换算成 unity3d 世界坐标系中的区域,然后传递到粒子的 shader 中进行裁剪。代码如下:
using System;
using UnityEngine; [RequireComponent(typeof(UIPanel))]
public class ParticleSystemClipper : MonoBehaviour
{
const string ShaderName = "Bleach/Particles Additive Area Clip";
const float ClipInterval = 0.5f; UIPanel m_targetPanel;
Shader m_shader; void Start()
{
// find panel
m_targetPanel = GetComponent<UIPanel>(); if (m_targetPanel == null)
throw new ArgumentNullException("Cann't find the right UIPanel");
if (m_targetPanel.clipping != UIDrawCall.Clipping.SoftClip)
throw new InvalidOperationException("Don't need to clip"); m_shader = Shader.Find(ShaderName); if (!IsInvoking("Clip"))
InvokeRepeating("Clip", , ClipInterval);
} Vector4 CalcClipArea()
{
var clipRegion = m_targetPanel.finalClipRegion;
Vector4 nguiArea = new Vector4()
{
x = clipRegion.x - clipRegion.z / ,
y = clipRegion.y - clipRegion.w / ,
z = clipRegion.x + clipRegion.z / ,
w = clipRegion.y + clipRegion.w /
}; var uiRoot = LuaUtils.UIRoot.GetComponent<UIRoot>();
var pos = m_targetPanel.transform.position - uiRoot.transform.position;
float h = ;
float temp = h / uiRoot.manualHeight; return new Vector4()
{
x = pos.x + nguiArea.x * temp,
y = pos.y + nguiArea.y * temp,
z = pos.x + nguiArea.z * temp,
w = pos.y + nguiArea.w * temp
};
} void Clip()
{
Vector4 clipArea = CalcClipArea();
var particleSystems = this.GetComponentsInChildren<ParticleSystem>(); for (int i = ; i < particleSystems.Length; i++)
{
var ps = particleSystems[i];
var mat = ps.renderer.material; if (mat.shader.name != ShaderName)
mat.shader = m_shader; mat.SetVector("_Area", clipArea);
}
} void OnDestroy()
{
CancelInvoke("Clip");
}
}
对应的shader 代码如下:
Shader "Bleach/Particles Additive Area Clip"
{
Properties
{
_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
_MainTex ("Particle Texture", 2D) = "white" {}
_Area ("Area", Vector) = (,,,)
} Category
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
Blend SrcAlpha One
AlphaTest Greater .
ColorMask RGB
Cull Off
Lighting Off
ZWrite Off
Fog { Color (,,,) } SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_particles #include "UnityCG.cginc" sampler2D _MainTex;
fixed4 _TintColor;
float4 _Area; struct appdata_t
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float2 worldPos : TEXCOORD1;
}; float4 _MainTex_ST; v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
o.color = v.color;
o.worldPos = mul(_Object2World, v.vertex).xy;
return o;
} fixed4 frag (v2f i) : SV_Target
{
bool inArea = i.worldPos.x >= _Area.x && i.worldPos.x <= _Area.z && i.worldPos.y >= _Area.y && i.worldPos.y <= _Area.w;
return inArea? 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord) : fixed4(,,,);
}
ENDCG
}
}
}
}
转载请注明出处:http://www.cnblogs.com/jietian331/p/5075487.html
Unity NGUI UIPanel下对粒子的剪裁的更多相关文章
- Unity NGUI 粒子的排序
Unity NGUI系统中是没有对粒子进行排序的,如: 怎么解决这个问题呢? 思路是把粒子的渲染层级,相对于UI组件的层级进行一个偏移. 解决后的效果如下: 代码如下: using System.Co ...
- Unity NGUI和UGUI与模型、特效的层级关系
目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...
- Unity NGUI 网络斗地主 -发牌 脚本交互
Unity NGUI 网络斗地主 -发牌 脚本交互 @By 灰太龙 Unity4.2.1f4 NGUI 3.0.4 本篇说的问题是脚本与控件的交互! 现在对界面进行了改进,先看副图! 1.制作发牌效果 ...
- Unity NGUI 网络斗地主 -制作图集 Atlas
Unity NGUI 网络斗地主 -制作图集 Atlas by @杨海龙 开发环境 Win7+Unity4.2.1f4+NGUI 3.0.4版本 这一节告诉大家如何制作(图集)Atlas! 1.首 ...
- Unity NGUI 网络斗地主 -界面制作
Unity NGUI 网络斗地主 -界面制作 源文件在群(63438968群共享!) @灰太龙 这一节说一下NGUI的界面摆放,并且教会大家使用NGUI的自适应功能! 在这里感谢@Gamer,是他给我 ...
- Unity NGUI 3.0.4版本 制作网络版斗地主
Unity NGUI 3.0.4版本 @by 灰太龙 开发环境 Win7旗舰版 Unity 4.2.1f4 本文就写个开门篇,告诉大家怎么用NGUI,第一步导入NGUI 3.0.4版本! 1.启动U ...
- BMFont中文字体图集制作的方法~(for unity ngui)
BMFont中文字体图集制作的方法~(for unity ngui) 好吧~似乎这个问题困扰了很多人,游戏开始中文化是个不错的事儿啊,这里我就做下说明,如何制作中文字体图集~ 这里的字库图集的制作更多 ...
- unity NGUI点击消息不传入到场景中去
unity NGUI点击消息不传入到场景中去 1.今天遇到的问题是点击NGUI的按钮,场景中也相应了这个消息 解决的办法是在场景中需要互动的时候,也就是在update中进行判断 是否是点击了NGUI按 ...
- Unity NGUI 多个UIPanel对粒子的剪裁
之前写过一篇单个 UIPanel 对粒子的裁剪,地址是:https://www.cnblogs.com/jietian331/p/5075487.html 但项目中有时会遇到多个UIPanel,如下面 ...
随机推荐
- byte数组转16进制 输出到文件
try { File file = new File(Environment.getExternalStorageDirectory(),"shuju2"); if(!file.e ...
- wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选
在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...
- win8.1下安装ubuntu 14.0 4LTS
1.前奏 电脑上已经安装了win8.1系统 2.准备工作 关闭win8.1的快速启动 步骤: 控制面板->电源选项->选择电源按钮的功能->更改不可用的设置,然后把"启用快 ...
- 35W行数据的文本文件,每500行添加4个换行符。代码实现思路
- runtime获取一个控件的所有属性
控件的有些属性API并没有开放,可以通过runtime查看: unsigned int count; Ivar *ivarList = class_copyIvarList([UITextField ...
- CodeForces--TechnoCup--2016.10.15--ProblemA--Transformation: from A to B
http://codeforces.com/contest/727/problem/A Transformation: from A to B time limit per test 1 second ...
- android 原生的DownloadManager
代码: public class MainActivity extends Activity { private DownloadManager downloadManager; public sta ...
- CentOS6下配置Django+Apache+mod_wsgi+Sqlite3过程
0. 安装环境: CentOs版本: VMWare中CentOs 6.4 Apache版本: Httpd 2.2.15 http://httpd.apache.org/ Sqlit ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- C# 通过接口 post 请求
/// <summary> /// 提交数据请求 方法一 /// </summary> /// <param name="POSTURL">请求 ...