NGUI粒子系统滚动区域裁剪

看了UWA视频,实现的是将粒子的shader部分做裁剪处理,修改其renderQueue夹杂在不同item之间,附上粒子部分代码:


using UnityEngine;using System.Collections;
[ExecuteInEditMode]//在编辑器下生效
[RequireComponent(typeof(ParticleSystemRenderer))]
public class UIParticle : MonoBehaviour {    
private UIPanel panel;    
private ParticleSystemRenderer pRenderer;    
private Material dyMaterial;    
private UIWidget cover;
// Use this for initialization
void Start (){        
panel = GetComponentInParent();    
pRenderer = GetComponent();

dyMaterial = new Material(Shader.Find("Hidden/Unlit/Transparent Colored 1"))

{

renderQueue = 4000,

mainTexture = pRenderer.sharedMaterial.mainTexture

};

pRenderer.material = dyMaterial;

}

// OnWillRenderObject is called once per frame before rendering

void OnWillRenderObject()

{

if (panel != null && panel.hasClipping)

{

if (cover != null && cover.isActiveAndEnabled && cover.drawCall != null)

{

dyMaterial.renderQueue = cover.drawCall.renderQueue;

}

Vector4 cr = panel.drawCallClipRange;

Vector2 soft = panel.clipSoftness;

Vector2 sharpness = new Vector2(1000.0f, 1000.0f);

if (soft.x > 0f) sharpness.x = cr.z / soft.x;

if (soft.y > 0f) sharpness.y = cr.w / soft.y;

float scale = 1.0f / transform.lossyScale.x;

Vector3 position = -panel.transform.position * scale;

dyMaterial.SetVector(Shader.PropertyToID("_ClipRange0"), new Vector4(-cr.x / cr.z + position.x / cr.z, -cr.y / cr.w + position.y / cr.w, 1f / cr.z * scale, 1f / cr.w * scale));

dyMaterial.SetVector(Shader.PropertyToID("_ClipArgs0"), new Vector4(sharpness.x, sharpness.y, 0, 1));

}

}

// Destroy the dyMaterial to avoid leaking

void OnDestroy()

{

DestroyImmediate(dyMaterial);

dyMaterial = null;

}

}

代码部分中new一个material(dyMaterial = new Material)是因为直接修改本身的material的话,unity也会自动创建一个material,而到最后这个material如果不手动销毁,那么就会驻存在内存中,当加载关卡切换场景或是unload的时候才会释放掉,如果直接destroy则不清楚到底销毁的是哪个材质,这样直接new出来的话就清晰多了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实...
    IongX阅读 1,799评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,900评论 25 708
  • This article is a record of my journey to learn Game Deve...
    蔡子聪阅读 4,159评论 0 9
  • 用料:番茄半个、胡萝卜小段、南瓜小段、西葫芦小段、青菜少许 所有食材根据宝宝咀嚼能力切好大小,番茄沸水侵泡去皮去蒂...
    丁一嘛嘛阅读 363评论 0 0
  • 梅子泛青时,檐外多雨。江南以南算蛮,不带油伞,丢魂寄何处,锦绣为谁穿?半旬月,夏田换新芒。可怜春草,不端量。何处少...
    何陆离阅读 348评论 0 0

友情链接更多精彩内容