Unity2D - Как двигать и вращать систему частиц по кругу? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь создать экземпляр системы частиц дождя, чтобы следовать по круговому пути. Облака вращаются и движутся по кругу, как идеально. Проблема возникает, когда создается система частиц, она почти никогда не имеет правильного вращения, где бы она ни создавалась. Я пытался сделать частицы дочерними элементами облака, но это тоже не сработало.

Вот где я его создаю - это применимо к любому данному облаку:

void UpdateCloudState(){
        if(isRaining == true){
            Sprite.color = new Color(.2f,.2f,.2f,1f);
            if(!isInstantiated){
                rain = Instantiate(RainParticles, this.transform.localPosition, Quaternion.identity) as GameObject;
                rain.GetComponent<ParticleSystem>().Play();
                isInstantiated = true;
            }
        }
        else{
            isInstantiated = false;
            Sprite.color = new Color(1f,1f,1f,1f);
            rain.GetComponent<ParticleSystem>().Stop();
            Destroy (rain, 1.0f);
            CloudMovement.speed = originalSpeed;
        }
    }

ОБНОВЛЕНИЕ : После обширного тестирования я понял, что проблема РЕШЕНА, когда я создаю экземпляр системы ЧАСТИЦ через скрипт.

- Исправление, которое я обнаружил: я сделал пустой префаб родительским элементом системы частиц, а затем он превратился в 1 префаб.

-Я применил сценарий Cloud Movement (тот, который перемещается и вращается по кругу) к этому новому сборному зданию, и теперь он работает

-ОДНАКО, он по-прежнему НЕ работает через сценарии, когда я создать его.

1 Ответ

0 голосов
/ 31 марта 2020

Я нашел альтернативное решение для моей конкретной проблемы c. Я до сих пор не могу понять, как заставить это работать, создавая его экземпляры. Я должен был сделать пустой игровой объект с системой частиц дочерним по отношению к нему, а затем прикрепить этот новый сборный блок к сборному облаку. и в сценарии:

void Start()
    {
        Sprite = gameObject.GetComponent<SpriteRenderer>();
        originalSpeed = this.gameObject.GetComponent<CloudMovement>().speed;
        StartCoroutine(StormCoroutine());
        stormLength = 10;
        currentPlanet = GameObject.Find("BigPlanet").transform;
        ////////////////////////////////////////////////////////////
        /////////////////This is the first step of the fix//////////
        ////This line sets 'rain' to the particle system/////
        rain = gameObject.transform.GetChild(0).GetChild(0).gameObject;
    }

void UpdateCloudState(){
        if(isRaining == true){
            Sprite.color = new Color(.2f,.2f,.2f,1f);
            if(!isInstantiated){
                ////////////////////////////////////////////////////////////
                ////This if statement accesses the rain object and plays the particles when necessary///
                rain.GetComponent<ParticleSystem>().Play();
                isInstantiated = true;
            }
        }
        else{
            isInstantiated = false;
            Sprite.color = new Color(1f,1f,1f,1f);
            rain.GetComponent<ParticleSystem>().Stop();
            this.gameObject.GetComponent<CloudMovement>().speed = originalSpeed;
        }
    }
...