繁体   English   中英

Unity 3d 错误 CS0246:找不到类型或命名空间名称“ParticleEmitter”

[英]Unity 3d error CS0246: The type or namespace name 'ParticleEmitter' could not be found

“Assets\ParticleScaler\ParticleScaler.cs(99,12):错误 CS0246:找不到类型或命名空间名称‘ParticleEmitter’(是否缺少 using 指令或程序集引用?)”

我到处寻找这个问题。 我在 stackoverflow 中找到了一些答案,一些类似的错误,我做了他们所说的一切,但它们不起作用。任何时候我尝试一个答案都会得到与我再次定义的名称相同的错误。 几天来我一直在寻找答案,但没有答案。如果你帮我解决这个问题,我将非常感激。 谢谢

此脚本仅适用于编辑器模式。 您无法在游戏中动态调整比例!

    using UnityEngine;
    using System.Collections;
    using UnityEngine.ParticlesLegacyModule; // i defined particleEmitter here!

    #if UNITY_EDITOR 
    using UnityEditor;
    #endif

    [ExecuteInEditMode]
    public class ParticleScaler : MonoBehaviour 
    {
        public float particleScale = 1.0f;
        public bool alsoScaleGameobject = true;

        float prevScale;

        void Start()
        {
            prevScale = particleScale;
        }

        void Update () 
        {
    #if UNITY_EDITOR 
            //check if we need to update
            if (prevScale != particleScale && particleScale > 0)
            {
                if (alsoScaleGameobject)
                    transform.localScale = new Vector3(particleScale, particleScale, particleScale);

                float scaleFactor = particleScale / prevScale;

                //scale legacy particle systems
                ScaleLegacySystems(scaleFactor);

                //scale shuriken particle systems
                ScaleShurikenSystems(scaleFactor);

                //scale trail renders
                ScaleTrailRenderers(scaleFactor);

                prevScale = particleScale;
            }
    #endif
        }

        void ScaleShurikenSystems(float scaleFactor)
        {
    #if UNITY_EDITOR 
            //get all shuriken systems we need to do scaling on
            ParticleSystem[] systems = GetComponentsInChildren<ParticleSystem>();

            foreach (ParticleSystem system in systems)
            {
                system.startSpeed *= scaleFactor;
                system.startSize *= scaleFactor;
                system.gravityModifier *= scaleFactor;

                //some variables cannot be accessed through regular script, we will acces them through a serialized object
                SerializedObject so = new SerializedObject(system);

                //unity 4.0 and onwards will already do this one for us
    #if UNITY_3_5 
                so.FindProperty("ShapeModule.radius").floatValue *= scaleFactor;
                so.FindProperty("ShapeModule.boxX").floatValue *= scaleFactor;
                so.FindProperty("ShapeModule.boxY").floatValue *= scaleFactor;
                so.FindProperty("ShapeModule.boxZ").floatValue *= scaleFactor;
    #endif

                so.FindProperty("VelocityModule.x.scalar").floatValue *= scaleFactor;
                so.FindProperty("VelocityModule.y.scalar").floatValue *= scaleFactor;
                so.FindProperty("VelocityModule.z.scalar").floatValue *= scaleFactor;
                so.FindProperty("ClampVelocityModule.magnitude.scalar").floatValue *= scaleFactor;
                so.FindProperty("ClampVelocityModule.x.scalar").floatValue *= scaleFactor;
                so.FindProperty("ClampVelocityModule.y.scalar").floatValue *= scaleFactor;
                so.FindProperty("ClampVelocityModule.z.scalar").floatValue *= scaleFactor;
                so.FindProperty("ForceModule.x.scalar").floatValue *= scaleFactor;
                so.FindProperty("ForceModule.y.scalar").floatValue *= scaleFactor;
                so.FindProperty("ForceModule.z.scalar").floatValue *= scaleFactor;
                so.FindProperty("ColorBySpeedModule.range").vector2Value *= scaleFactor;
                so.FindProperty("SizeBySpeedModule.range").vector2Value *= scaleFactor;
                so.FindProperty("RotationBySpeedModule.range").vector2Value *= scaleFactor;

                so.ApplyModifiedProperties();
            }
    #endif
        }

        void ScaleLegacySystems(float scaleFactor)
        {
    #if UNITY_EDITOR 
            //get all emitters we need to do scaling on
            ParticleEmitter[] emitters = GetComponentsInChildren<ParticleEmitter>();

            //get all animators we need to do scaling on
            ParticleAnimator[] animators = GetComponentsInChildren<ParticleAnimator>();

            //apply scaling to emitters
            foreach (ParticleEmitter emitter in emitters)
            {
                emitter.minSize *= scaleFactor;
                emitter.maxSize *= scaleFactor;
                emitter.worldVelocity *= scaleFactor;
                emitter.localVelocity *= scaleFactor;
                emitter.rndVelocity *= scaleFactor;

                //some variables cannot be accessed through regular script, we will acces them through a serialized object
                SerializedObject so = new SerializedObject(emitter);

                so.FindProperty("m_Ellipsoid").vector3Value *= scaleFactor;
                so.FindProperty("tangentVelocity").vector3Value *= scaleFactor;
                so.ApplyModifiedProperties();
            }

            //apply scaling to animators
            foreach (ParticleAnimator animator in animators)
            {
                animator.force *= scaleFactor;
                animator.rndForce *= scaleFactor;
            }
    #endif
        }

        void ScaleTrailRenderers(float scaleFactor)
        {
            //get all animators we need to do scaling on
            TrailRenderer[] trails = GetComponentsInChildren<TrailRenderer>();

            //apply scaling to animators
            foreach (TrailRenderer trail in trails)
            {
                trail.startWidth *= scaleFactor;
                trail.endWidth *= scaleFactor;
            }
        }
    }

用 ParticleSystem 替换 ParticleEmitter,因为 ParticleEmitter 已过时。 这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM