Unity中的浮动原点和视觉效果图

问题描述

我敢肯定,每个人都知道这个http://wiki.unity3d.com/index.php/Floating_Origin脚本,可以轻松解决浮点源问题。

问题在于脚本已过时,并且不会移动视觉效果图创建的粒子效果

我试图重写它,但是我似乎无法像上一个一样创建一个数组来存储所有粒子,因此我无法从那里继续。

这是我的代码

// Based on the Unity Wiki FloatingOrigin script by Peter Stirling
// URL: http://wiki.unity3d.com/index.PHP/Floating_Origin

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.VFX;
using UnityEngine.Experimental.VFX;

public class FloatingOrigin : MonoBehavIoUr
{
    [Tooltip("Point of reference from which to check the distance to origin.")]
    public Transform ReferenceObject = null;

    [Tooltip("distance from the origin the reference object must be in order to trigger an origin shift.")]
    public float Threshold = 5000f;

    [Header("Options")]
    [Tooltip("When true,origin shifts are considered only from the horizontal distance to orign.")]
    public bool Use2Ddistance = false;

    [Tooltip("When true,updates ALL open scenes. When false,updates only the active scene.")]
    public bool UpdateallScenes = true;

    [Tooltip("Should ParticleSystems be moved with an origin shift.")]
    public bool UpdateParticles = true;

    [Tooltip("Should TrailRenderers be moved with an origin shift.")]
    public bool UpdateTrailRenderers = true;

    [Tooltip("Should LineRenderers be moved with an origin shift.")]
    public bool UpdateLineRenderers = true;

    private ParticleSystem.Particle[] parts = null;

    VisualEffect[] visualEffect = null;

    void LateUpdate()
    {
        if (ReferenceObject == null)
            return;

        Vector3 referencePosition = ReferenceObject.position;

        if (Use2Ddistance)
            referencePosition.y = 0f;

        if (referencePosition.magnitude > Threshold)
        {
            MoveRoottransforms(referencePosition);

            if (UpdateParticles)
                MoveParticles(referencePosition);

            if (UpdateTrailRenderers)
                MoveTrailRenderers(referencePosition);

            if (UpdateLineRenderers)
                MoveLineRenderers(referencePosition);
        }
    }

    private void MoveRoottransforms(Vector3 offset)
    {
        if (UpdateallScenes)
        {
            for (int z = 0; z < SceneManager.sceneCount; z++)
            {
                foreach (GameObject g in SceneManager.GetSceneAt(z).GetRootGameObjects())
                    g.transform.position -= offset;
            }
        }
        else
        {
            foreach (GameObject g in SceneManager.GetActiveScene().GetRootGameObjects())
                g.transform.position -= offset;
        }
    }

    private void MoveTrailRenderers(Vector3 offset)
    {
        var trails = FindobjectsOfType<TrailRenderer>() as TrailRenderer[];
        foreach (var trail in trails)
        {
            Vector3[] positions = new Vector3[trail.positionCount];

            int positionCount = trail.GetPositions(positions);
            for (int i = 0; i < positionCount; ++i)
                positions[i] -= offset;

            trail.SetPositions(positions);
        }
    }

    private void MoveLineRenderers(Vector3 offset)
    {
        var lines = FindobjectsOfType<LineRenderer>() as LineRenderer[];
        foreach (var line in lines)
        {
            Vector3[] positions = new Vector3[line.positionCount];

            int positionCount = line.GetPositions(positions);
            for (int i = 0; i < positionCount; ++i)
                positions[i] -= offset;

            line.SetPositions(positions);
        }
    }

    private void MoveParticles(Vector3 offset)
    {
        var particles = FindobjectsOfType<ParticleSystem>() as ParticleSystem[];
        foreach (ParticleSystem system in particles)
        {
            if (system.main.simulationSpace != ParticleSystemSimulationSpace.World)
                continue;

            int particlesNeeded = system.main.maxParticles;

            if (particlesNeeded <= 0)
                continue;

            bool waspaused = system.isPaused;
            bool wasplaying = system.isPlaying;

            if (!waspaused)
                system.Pause();

            // ensure a sufficiently large array in which to store the particles
            if (parts == null || parts.Length < particlesNeeded)
            {
                parts = new ParticleSystem.Particle[particlesNeeded];
            }

            // Now get the particles
            int num = system.GetParticles(parts);

            for (int i = 0; i < num; i++)
            {
                parts[i].position -= offset;
            }

            system.SetParticles(parts,num);

            if (wasplaying)
                system.Play();
        }
        
        var particles2 = FindobjectsOfType<VisualEffect>() as VisualEffect[];
        foreach (VisualEffect system in particles2)
        {
            int particlesNeeded = system.aliveParticleCount;

            if (particlesNeeded <= 0)
                continue;

            bool waspaused = !system.isActiveAndEnabled;
            bool wasplaying = system.isActiveAndEnabled;

            if (!waspaused)
                system.Stop();
            // ensure a sufficiently large array in which to store the particles
            if (visualEffect == null || visualEffect.Length < particlesNeeded)
            {
                visualEffect = new VisualEffect().visualEffectAsset[particlesNeeded];
            }

            // Now get the particles
            int num = system.GetParticles(parts);

            for (int i = 0; i < num; i++)
            {
                parts[i].position -= offset;
            }

            system.SetParticles(parts,num);

            if (wasplaying)
                system.Play();
            
        }
    } 
}

在线(这是一条错误的行,其下方的所有内容也是如此)

visualEffect = new VisualEffect().visualEffectAsset[particlesNeeded];

,我需要创建与该行相似的数组(正确的数组,但对于旧的粒子系统)

parts = new ParticleSystem.Particle[particlesNeeded];

创建充满粒子的数组(但使用VisualEffect类)。

如果我能解决这个问题,其余的应该没有任何问题。 我认为解决这个问题将在实际上和将来为成千上万的人带来帮助,因为统一中浮动原点的限制非常可怕,并且大多数从事统一中工作的人将需要具有VFX图形粒子的浮动原点用于他们的游戏世界。 >

感谢您的帮助。

解决方法

我的问题已在这里回答: https://forum.unity.com/threads/floating-origin-and-visual-effect-graph.962646/#post-6270837

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...