Как изменить размер всех частиц из системы частиц? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь динамически изменить размер частиц с помощью ползунка, а также изменить их цвет.

Частицы используются для отображения точек данных на трехмерной диаграмме рассеяния. Я использую этот код: https://github.com/PrinzEugn/Scatterplot_Standalone

private ParticleSystem.Particle[] particlePoints;
void Update () {
    pointScale = sizeSlider.value;
    for (int i = 0; i < pointList.Count; i++) {
        Quaternion quaternion = Camera.current.transform.rotation;
        Vector3 angles = quaternion.eulerAngles;
        // Set point color
        particlePoints[i].startColor = new Color(angles.x, angles.y, angles.z, 1.0f);
        particlePoints[i].transform.localScale = new Vector3(pointScale, pointScale, pointScale);
    }

}

Проблема в том, что для частиц не существует метода преобразования, а изменение «startColour» ничего не меняет.

API заявляет, что «текущий размер частицы рассчитывается процедурно на основе этого значения и модулей активного размера».

Что это значит, и как я могу изменить размер частиц?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Благодаря предыдущим ответам мне удалось заставить это работать:

В методе PlacePrefabPoints я добавляю каждый экземпляр префаба в список и добавляю слушателя к ползунку, который выглядит следующим образом:

void changedPointSize(){
    pointScale = sizeSlider.value;
    for (int i = 0; i < objects.Count; i++) {
        objects[i].transform.localScale = new Vector3(pointScale, pointScale, pointScale);
    }
}

Спасибо всем!

0 голосов
/ 16 января 2019

Я только что посмотрел на PointRenderer.cs -> CreateParticles и PlacePrefabPoints дает хороший совет, что нужно изменить.

Так что, я думаю, вы просто изменили бы значения шкалы

foreach (var point in particlePoints) 
{
    Quaternion quaternion = Camera.current.transform.rotation;
    Vector3 angles = quaternion.eulerAngles;
    // Set point color
    point.startColor = new Color(angles.x, angles.y, angles.z, 1.0f);
    point.startSize = sizeSlider.value;
}

и затем перезвоните

GetComponent<ParticleSystem>().SetParticles(particlePoints, particlePoints.Length);

сомнительно, если вы действительно сделаете это в Update. Я бы предпочел сделать это в sizeSlider.onValueChanged, чтобы сделать это только в случае необходимости (вы могли бы даже сделать определенный порог, который должен быть изменен перед обновлением представления), но для цвета не могло быть никакой другой опции чем делать это в Update но по крайней мере там я бы использовал порог:

privtae ParticleSystem ps;

// I assume you have that referenced in the inspector
public Slider sizeSlider;

// flag to control whether system should be updated
private bool updateSystem;

privtae void Awake()
{
    ps = GetComponent<ParticleSystem>();
}

private void OnEnable()
{
    // add a listener to onValueChanged
    // it is secure to remove it first (even if not there yet)
    // this makes sure it is not added twice
    sizeSlider.onValueChanged.RemoveListener(OnsliderChanged());
    sizeSlider.onValueChanged.AddListener(OnsliderChanged());
}

private void OnDisable()
{
    // cleanup listener
    sizeSlider.onValueChanged.RemoveListener(OnsliderChanged());
}

private void OnSliderChanged()
{
    foreach (var point in particlePoints) 
    {
        point.startSize = sizeSlider.value; 
    }

    // do the same also for the instantiated prefabs
    foreach(Transform child in PointHolder.transform)
    {
        child.localScale = Vecto3.one * sizeSlider.value;
    }

    updateSystem = true;
}

private Quaternion lastCameraRot;

public float CameraUpdateThreshold;

private void Update()
{
    if(Quaternion.Angle(Camera.current.transform.rotation, lastCameraRot) > CameraUpdateThreshold)
    {
        foreach (var point in particlePoints) 
        {
            Quaternion quaternion = Camera.current.transform.rotation;
            Vector3 angles = quaternion.eulerAngles;
            // Set point color
            point.startColor = new Color(angles.x, angles.y, angles.z, 1.0f);
        }

        lastCameraRot = Camera.current.transform.rotation;
        updateSystem = true;
    }

    if(!updateSystem) return;

    updateSystem = false;
    ps.SetParticles(particlePoints, particlePoints.Length);
}
...