Author Topic: Useful stuff  (Read 62172 times)


ArenMook

  • Administrator
  • Hero Member
  • *****
  • Thank You
  • -Given: 337
  • -Receive: 1171
  • Posts: 22,128
  • Toronto, Canada
    • View Profile
Re: Useful stuff
« Reply #1 on: December 28, 2013, 06:42:12 PM »
If you want to dynamically alter a renderer's draw queue (Renderer or Particle System), you can use the following script:
  1. using UnityEngine;
  2.  
  3. public class SetRenderQueue : MonoBehaviour
  4. {
  5.         public int renderQueue = 3000;
  6.  
  7.         Material mMat;
  8.  
  9.         void Start ()
  10.         {
  11.                 Renderer ren = renderer;
  12.  
  13.                 if (ren == null)
  14.                 {
  15.                         ParticleSystem sys = GetComponent<ParticleSystem>();
  16.                         if (sys != null) ren = sys.renderer;
  17.                 }
  18.  
  19.                 if (ren != null)
  20.                 {
  21.                         mMat = new Material(ren.sharedMaterial);
  22.                         mMat.renderQueue = renderQueue;
  23.                         ren.material = mMat;
  24.                 }
  25.         }
  26.  
  27.         void OnDestroy () { if (mMat != null) Destroy(mMat); }
  28. }
« Last Edit: December 28, 2013, 06:58:14 PM by ArenMook »

gyd

  • Jr. Member
  • **
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 87
    • View Profile
Re: Useful stuff
« Reply #2 on: January 09, 2014, 12:31:22 AM »
If you want to dynamically alter a renderer's draw queue (Renderer or Particle System), you can use the following script:
  1. using UnityEngine;
  2.  
  3. public class SetRenderQueue : MonoBehaviour
  4. {
  5.         public int renderQueue = 3000;
  6.  
  7.         Material mMat;
  8.  
  9.         void Start ()
  10.         {
  11.                 Renderer ren = renderer;
  12.  
  13.                 if (ren == null)
  14.                 {
  15.                         ParticleSystem sys = GetComponent<ParticleSystem>();
  16.                         if (sys != null) ren = sys.renderer;
  17.                 }
  18.  
  19.                 if (ren != null)
  20.                 {
  21.                         mMat = new Material(ren.sharedMaterial);
  22.                         mMat.renderQueue = renderQueue;
  23.                         ren.material = mMat;
  24.                 }
  25.         }
  26.  
  27.         void OnDestroy () { if (mMat != null) Destroy(mMat); }
  28. }

I wrote this before. if anyone wants to place a SFX in front/back of a widget, it's very easy to do that at runtime;

RenderQueueModifier rqm = obj.AddComponent<RenderQueueModifier>();
rqm.m_target = whichWidget;
rqm.m_type = RenderType.FRONT;

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class RenderQueueModifier : MonoBehaviour
  5. {
  6.         public enum RenderType
  7.         {
  8.                 FRONT,
  9.                 BACK
  10.         }
  11.  
  12.         public UIWidget m_target = null;
  13.         public RenderType m_type = RenderType.FRONT;
  14.  
  15.         Renderer[] _renderers;
  16.         int _lastQueue = 0;
  17.  
  18.         void Start ()
  19.         {
  20.                 _renderers = GetComponentsInChildren<Renderer>();
  21.         }
  22.        
  23.         void FixedUpdate() {
  24.                 if( m_target == null || m_target.drawCall == null )
  25.                         return;
  26.                 int queue = m_target.drawCall.renderQueue;
  27.                 queue += m_type == RenderType.FRONT ? 1 : -1;
  28.                 if( _lastQueue != queue )
  29.                 {
  30.                         _lastQueue = queue;
  31.  
  32.                         foreach( Renderer r in _renderers )
  33.                         {
  34.                                 r.material.renderQueue = _lastQueue;
  35.                         }
  36.                 }
  37.         }
  38. }
  39.