0
votes

Comment faire disparaître / faire disparaître un GameObject lentement?

J'ai une fonction où je dois dissiper certains GameObjects, pour le moment j'utilise SetActive (false) mais ça ne devrait pas disparaître instantanément, ça devrait disparaître lentement en 2 ou 3 secondes. Je suppose que l'opacité devrait aller lentement à transparent ou quelque chose comme ça ...

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--;
     }

 }


1 commentaires

Changez l'opacité au fil du temps (soit dans Update soit en utilisant une Coroutine) - vous devrez écrire le code vous-même


4 Réponses :


1
votes

Vous pouvez obtenir le composant rendu d'une gameObject, puis modifier l'alpha de la couleur progressivement dans update () .

ex: < Pré> xxx

Bien sûr, vous ne devez pas utiliser les valeurs codées dures telles que 0.01f , mais plutôt une valeur de l'inspecteur. Cela devrait également être multiplié par temps.delatime de ne pas faire de la vitesse de fondue basée sur FPS.

Certains des noms ou similaires risquent de ne pas être corrigé à 100% dans cet exemple , mais il devrait vous donner une idée de quelle partie de la partie du Documentation API UNITY à regarder autour de.


2 commentaires

J'essaie de tester un code de base avec le moteur de rendu du gameobject dans la fonction ci-dessus. puzzleStuk.GetComponent () .material.color = Color.red; Ça ne marche pas, je ne vois pas le gameobject changer sa couleur.


Le code suivant ne fonctionne pas non plus rend = puzzleStuk.GetComponent (); rend.enabled = false;



0
votes

Vous pouvez utiliser une Coroutine combinée avec Color.Lerp pour réduire la valeur alpha de tous les matériaux au fil du temps.

(Je suppose que vous voulez dire ici les maillages avec les moteurs de rendu, pas les éléments d'interface utilisateur, mais cela fonctionnerait également de la même manière)

// 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++;
        }
    } 
}

Notez que pour que la transparence fonctionne sur tous vos matériaux, pour utiliser un shader supportant la transparence.


Ce n'est peut-être pas la meilleure solution en termes de performances. D'autant plus que plusieurs Renderers peuvent faire référence au même Material, donc dans l'exemple actuel, il y a peut-être des redondances.

Mais si vous n'avez de toute façon qu'un seul Renderer avec un Material, vous pouvez ajuster un peu le code et sauter toutes les boucles ;)


0 commentaires

0
votes

Comme mentionné dans les réponses précédentes, vous pouvez le faire facilement en manipulant

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

Un détail important à ajouter est que le matériau doit être mis en place dans la file d'attente transparente (et prend en charge la transparence). Ceci est réalisé via une liste déroulante dans l'inspecteur de matériaux, pour les shaders de surface standard, mais doit être traité dans les shaders personnalisés en utilisant un mode de fusion alpha moins et une file d'attente transparente dans les shaders personnalisés

Balises {"Queue" = "Transparent" "RenderType" = "Transparent"}

Mélanger SrcAlpha OneMinusSrcAlpha


1 commentaires

J'utilise le code suivant dans la fonction pour tester le rendu du jeuObject. puzzle_1.getcomponentinChildren (). matériau.color = couleur.red; Puzzle_1 est un gameObject et doit normalement changer sa couleur en rouge une fois que la fonction est appelée. Mais ça ne répond pas ça ne change rien ...



0
votes

Voici mon approche utilisant les coroutines.

void Awake()
{
    StartCoroutine(FadeOutMaterial(1f));
}

IEnumerator FadeOutMaterial(float fadeSpeed)
{
    Renderer rend = objectToFade.transform.GetComponent<Renderer>();
    Color matColor = rend.material.color;
    float alphaValue = rend.material.color.a;

    while (rend.material.color.a > 0f)
    {
        alphaValue -= Time.deltaTime / fadeSpeed;
        rend.material.color = new Color(matColor.r, matColor.g, matColor.b, alphaValue);
        yield return null;
    }
    rend.material.color = new Color(matColor.r, matColor.g, matColor.b, 0f);
}


0 commentaires