Criando uma Árvore de Natal com Blender e Unity

Veja como criar um pisca-pisca usando a Unity com poucas linhas de código e configurações.

Para aquecer o nosso clima natalino, nesse artigo você confere duas videoaulas na qual criamos, importamos e programamos uma Árvore de Natal com pisca-pisca usando a Unity e o Blender 3D.

Está disponível também, o código utilizado durante as aulas, então, foque a sua atenção na explicação e no que está acontecendo, e não em copiar os códigos, afinal, eles estão disponíveis logo abaixo.

Basicamente no Blender modelamos uma lâmpada única e elá é duplicada várias vezes dentro da Unity.

Criamos um script que processa todas as lâmpadas e insere uma cor com emissão de acordo com o array de cores estabelecido. Ainda nesse mesmo script, criamos também uma opção para que as luzes fiquem piscando aleatoriamente, que é executado através de um método pela função InvokeRepeating.

Vídeo 1

Vídeo 2

 

ArvoreDeNatal.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArvoreDeNatal : MonoBehaviour
{
    public GameObject[] parentLamps; //Setar o objeto que os filhos são as lampadas
    public Color[] colorsLamps; //Cores que podemos personalizar
    [Range(1.0f, 5.0f)]
    public float intensity = 1; //Itensidade da emissão de luz

    [Space(5)]
    public bool flasher = true;//Vai ficar piscando?
    [Range(0.1f, 5.0f)]
    public float timeRefresh = 1.0f;

    private List lamps = new List(); //Todas as lâmpadas encontradas durante o get

    private void Start()
    {
        foreach (GameObject go in parentLamps)
        {
            for (int i = 0; i < go.transform.childCount; i++)
            {
                GameObject g = go.transform.GetChild(i).gameObject;
                lamps.Add(g);
            }
        }

        foreach (GameObject go in lamps)
        {
            Color c = this.GetColor();
            Renderer re = go.GetComponent();
            re.material.color = c;
            re.material.EnableKeyword("_EMISSION");
            re.material.SetColor("_EmissionColor", c * intensity);
        }

        if (this.flasher)
        {
            InvokeRepeating("Flasher", this.timeRefresh, this.timeRefresh);
        }
    }


    private void Flasher()
    {
        foreach (GameObject go in lamps)
        {
            bool turnOn = (UnityEngine.Random.Range(0, 10) <= 5 ? true : false);
            Renderer re = go.GetComponent();

            if (turnOn)
                re.material.EnableKeyword("_EMISSION");
            else
                re.material.DisableKeyword("_EMISSION");
        }
    }

    private Color GetColor()
    {
        int rand = UnityEngine.Random.Range(0, this.colorsLamps.Length);
        return this.colorsLamps[rand];
    }
}