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