Как медленно исчезать / исчезать из GameObject? - PullRequest
0 голосов
/ 04 января 2019

У меня есть функция, при которой я должен отменить некоторые GameObjects, в данный момент я использую SetActive (false), но он не должен исчезать мгновенно, он должен исчезнуть медленно через 2 или 3 секунды. Я думаю, что непрозрачность должна постепенно переходить в прозрачный или что-то в этом роде ...

public void SlotCheck(string gemColor,GameObject slotColor,GameObject 
puzzleStuk,ref int scoreGem,ref bool Visibility)
{
if (DragHandler2.itemBegingDragged.name.Contains(gemColor)
DragHandler2.itemBegingDragged.transform.parent.name == "green_small_b")
     {
         Visibility=false;
         puzzleStuk.SetActive(Visibility);
         slotColor.SetActive(false);
         DragHandler2.itemBegingDragged.SetActive(false);
         scoreGem--;
     }

 }

Ответы [ 3 ]

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

Вы можете использовать сопрограмму в сочетании с Color.Lerp, чтобы уменьшить альфа-значение всех материалов с течением времени.

(я предполагаю, что вы имеете в виду меши с Renderers, а не вещи пользовательского интерфейса, но это также будет работать аналогичным образом)

// How long should fading take (in seconds)
public float fadingDuration = 1;

// For storing Renderer components
private Renderer[] renderers;

// For storing original color data
private List<Color> originalColors = new List<Color>();

// For storing FadeOut color data
// (= Original data with alpha=0)
private List<Color> fadeOutColors = new List<Color>();

private void Awake() {
    // Get all renderers, own and children
    renderers  = GetComponentInChildren<Renderer>(true);

    // Run through renderers
    foreach(var rend in renderers)
    {
        // Run through all materials
        foreach (vat mat in rend.materials)
        {
            // Get original color
            var color = mat.color;
            // Add to original list
            originalColors.Add(color);

            // Get fadeout color (alpha 0)
            var fadeoutColor = new Color(color.r, color.g, color.b, 0);

            // Add to fadeout list
            fadeoutColors.Add(fadeOutColor);
    } 
}

// Call this to start fading
public void StartFadeout()
{
    StartCoroutine(FadeOut());
}

private IEnumerator FadeOut()
{
    var timePassed = 0;

    while(timePassed < fadingDuration)
    {
        // Get factor between 0 and 1 depending on passed time
        var lerpFactor = timePassed / fadingDuration;

        // Run through all renderers
        int colorIndex = 0;
        foreach(var rend in renderers)
        {
            // Run through all materials
            foreach (vat mat in rend.materials)
            {
                // Set color interpolated between original and FadeOut color depending on lerpFactor
                mat.color = Color.Lerp(originalColors[colorIndex], fadeOutColors[colorIndex], lerpFactor);

                // Count up index
                colorIndex++;
            }
        }

        // Add time passed since last frame
        timePassed += Time.deltaTime;

        // return to render the frame and continue from here in the next frame
        yield return null;
    }

    // In the end just to be sure apply the final target values (FadeOut colors)
    // Alternatively you could also deactivate/destroy the object here

    // Run through all materials
    int colorIndex = 0;
    foreach(var rend in renderers)
    {
        // Run through all materials
        foreach (vat mat in rend.materials)
        {
            // Set color to final FadeOut value
            mat.color = fadeOutColors[colorIndex];

            // Count up index
            colorIndex++;
        }
    } 
}

Обратите внимание, что для обеспечения прозрачности всех ваших материалов необходимо использовать шейдер, поддерживающий прозрачность.


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

Но если у вас все равно есть только один рендерер с одним материалом, вы можете немного изменить код и пропустить все циклы;)

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

Как уже упоминалось в предыдущих ответах, вы можете легко манипулировать

meshrenderer.material.color=new Color (,,,x);

Одна важная деталь, которую нужно добавить, - это то, что материал должен быть установлен в прозрачной очереди (и поддерживает прозрачность). Это достигается с помощью раскрывающегося списка в инспекторе материалов для стандартных шейдеров поверхности, но это необходимо решать в пользовательских шейдерах, используя один минус альфа-режим смешивания и прозрачную очередь в пользовательских шейдерах

Tags {"Queue"="Transparent" "RenderType"="Transparent" }

Blend SrcAlpha OneMinusSrcAlpha

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

Вы можете получить Renderer компонент GameObject и затем постепенно изменять альфа цвета в Update().

Ex:

Renderer renderer;

void Start() {
    renderer  = GetComponent<Renderer>();
}

void Update() {
    Color oldCol = renderer.material.color;
    Color newCol = new Color(oldCol.r, oldCol.g, oldCol.b, oldCol.a - 0.01f);
    renderer.material.color = newCol;
}

Конечно, вы не должны использовать жестко закодированные значения, такие как 0.01f, а вместо этого - значение из инспектора. Это также следует умножить на Time.deltaTime, чтобы скорость фейдера не зависела от FPS.

Некоторые имена и т.п. могут быть не на 100% правильными в этом примере, но они должны дать вам представление о том, в какой части документации Unity API искать.

...