unity特效ParticleSystem在UI上缩放(自适应屏幕)

结合了下面这两个方案:

http://www.xuanyusong.com/archives/4271

http://www.unity.5helpyou.com/3630.html

第一个方案,应付不了复杂些的特效;

两篇文章结合后的代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ScaleParticles : MonoBehaviour {
    private List<float> m_initialSizes = new List<float>();

    public void CacheParticleScale() {
        // Save off all the initial scale values at start.
        ParticleSystem[] particles = gameObject.GetComponentsInChildren<ParticleSystem>();
        for (int i=0;i<particles.Length;i++) {
            m_initialSizes.Add(particles[i].startSize);

            ParticleSystemRenderer renderer = particles[i].GetComponent<ParticleSystemRenderer>();
            if (renderer) {
                m_initialSizes.Add(renderer.lengthScale);
                m_initialSizes.Add(renderer.velocityScale);
            }
        }
    }

    public void ResetParticleScale() {
        float designWidth = 1920;//开发时分辨率宽
        float designHeight = 1080;//开发时分辨率高
        float designScale = designWidth / designHeight;
        float scaleRate = (float)Screen.width / (float)Screen.height;
        float scaleFactor = scaleRate / designScale;

        // Scale all the particle components based on parent.
        int arrayIndex = 0;
        ParticleSystem[] particles = gameObject.GetComponentsInChildren<ParticleSystem>();
        for (int i = 0; i < particles.Length; i++) {
            float rate = 1;
            if (scaleRate < designScale) {
                rate = scaleFactor;
            }
            else {
                rate = 1;
            }

            particles[i].startSize = m_initialSizes[arrayIndex++] * rate;
            ParticleSystemRenderer renderer = particles[i].GetComponent<ParticleSystemRenderer>();
            if (renderer) {
                renderer.lengthScale = m_initialSizes[arrayIndex++] *
                rate;
                renderer.velocityScale = m_initialSizes[arrayIndex++] *
                rate;
            }
        }
    }
}
时间: 2024-11-03 21:15:41

unity特效ParticleSystem在UI上缩放(自适应屏幕)的相关文章

UGUI 特效怎样在UI上裁剪

刚好碰到有人问怎样把粒子特效放到 UI 上并且能正确被 Mask 裁剪, 首先想到给粒子效果的 Shader 添加模板模仿一般 UI 的模板方式, 应该就能正确裁剪了吧, 不过没那么简单, 我们看到在一般 UI 上, 没在 Mask 下的 UI 对比在 Mask 下的 UI, 它们的材质设置是不一样的, 也就是说有哪个组件对材质进行了修改, 查了一下就是 Mask 组件, 它会收集子节点下的所有对象, 然后对可以修改的材质进行修改, 所以才能自动控制裁剪. 为了搞清楚, 这里做了一下测试: 1.

unity特效ParticleSystem用到UI上

A_ui为带特效的UI a_effect是A_ui上的特效 a_child_panel为A的字panel,在a_effect上 A的RenderQ:automatic a_child_panel的RenderQ:startAt 然后脚本设置,a_effect(所有子material)和a_child_panel的renderQ: 参考Ngui源代码:

unity区分点击在3D物体还是2D UI上

当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下: 1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI.但无论Physics2D.Raycast()还是Physics.Raycast()都只能检测到含有Collider组件的物体,普通UI如Image Button等一般用射线是不起作用的.EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个Po

[Unity] Simple Shaderlab 1 // UI用的简单shader 1 - 流光

最近经常要给2D游戏写一些新的shader来做特效.比起粒子特效,着色器特效可能更适合UI和2D元素上的表现. 先看一下效果: 关于在shaderlab种实现流光的文章很多,但很少有给UI实现的,并且常常只是Add一层颜色,并没有去表现“光”的效果. 以下是shader全文,后面会介绍一些细节: 1 Shader "UI/Unlit/Flowlight" 2 { 3 Properties 4 { 5 [PerRendererData] _MainTex ("Sprite Te

前端开发入门到实战:通过 rem 和 vw 实现页面等比例缩放自适应

一.rem 和 vw 简介 1. rem rem?是相对长度单位,是指相对于根元素(即html元素)font-size(字号大小)的倍数. 浏览器支持:Caniuse 示例 若根元素?font-size?为 12px html { font-size: 12px; } h1 { font-size: 2rem; /* 2 × 12px = 24px */ } p { font-size: 1.5rem; /* 1.5 × 12px = 18px */ } div { width: 10rem;

Android webView 支持缩放及自适应屏幕

//支持javascript web.getSettings().setJavaScriptEnabled(true); // 设置可以支持缩放 web.getSettings().setSupportZoom(true); // 设置出现缩放工具 web.getSettings().setBuiltInZoomControls(true); //扩大比例的缩放 web.getSettings().setUseWideViewPort(true); //自适应屏幕 web.getSettings

如何查找Fiori UI上某个字段对应的后台存储表的名称

今天微信群里有朋友问到这个问题. 如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成. 比如我想知道下图"Sales Unit"这个字段的值到底保存在哪张表的哪个字段里,只需要选中这个字段,按F1,在弹出窗口里即可得知表名是MVKE,字段名是VRKME. 在S/4 Fiori UI里,因为UI是由SAP UI5开发的,所以F1这个功能键无法继续使用.我们需要Chrome Development Tool的帮助. 还是看个具体例子: 我希望知道S/4HANA的

Unity3D_UGUI判断鼠标或者手指是否点击在UI上

比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分.为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上. 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法. #if UNITY_ANDROID && !UNITY_EDITOR #define ANDROID #endif #if UNITY_IPHONE && !UNITY_EDITOR #define IPHONE #e

NGUI之自适应屏幕

 转载: 雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 ,原文链接   现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少这么多游戏都在用,它目前是能hold住的,嘿嘿. 这篇文章说说我现在是怎么自适应UI 和 3D 游戏的.. 1.获取屏幕的宽高 Screen.width  Screen.height 可以回去设备屏幕的宽高,但是它并不是NGUI的宽高.比如你想做一个全屏的UISprite .