Quando trabalhamos com iluminação em qualquer Game Engine, precisamos deixar ela de uma forma mais realista, pois não é só clarear o cenário, mas também precisamos trabalhar em outros aspectos, como: mapa de emissão, som dos interruptores e até mesmo recalcular a reflexão do ambiente.
Este artigo é um complemento de uma videoaula disponibilizada em nosso canal e também logo abaixo. Aqui você encontra o script criado durante a aula e a também algumas explicações.
Em nossa aula mostramos três recursos, que são:
Objeto emitir luz - Utilizando um mapa de iluminação, conseguimos determinar que apenas as lâmpadas e não o suporte iria emitir luz, pois através do script acessamos está propriedade e definimos a cor e a intensidade da emissão.
Emitir som – Quando acionamos o interruptor, reproduzimos um som para dar a sensação ao jogador que algo foi realmente pressionado.
Acender e Apagar a luz – De forma bem simples, acessamos todos os componentes light, e de acordo com o estado da ação do usuário, ativamos ou desativamos o componente através da propriedade enabled(bool).
Na figura 1 podemos ver o cenário de onde vamos iluminar, note que ele não está completamente escuro, então precisamos ajustar a intensidade da luz e também o alcance delas.
Figura 1: Cenário onde é iluminamos de forma realista.
Todo código criado e utilizado no vídeo está comentando, então leia com atenção.
Código 01:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlarLuz : MonoBehaviour
{
public GameObject[] _objetos; //Objetos que vão emitir luz
public Light[] _luzes; //Objetos com o componente Light
public string _playerTag = "Player"; //Tag do player
private AudioSource _audio; //Áudio para efeito
private bool _colidindo = false; //Controla se o player está ou não colidindo
private bool _estado = false; //Controla se a luz está ligada ou ou desligada
private List _listRenderComponents = new List(); //Lista de Render
void Start()
{
_audio = this.GetComponent(); //Acessa o componente audiosurce
for (int i = 0; i < _objetos.Length; i++)
{
_listRenderComponents.Add(_objetos[i].GetComponent()); //Acessamos todos os objetos
}
}
void Update()
{
if (_colidindo && Input.GetKeyDown(KeyCode.E))
{
_estado = !_estado; //Nega o valor atual da variável.
AcenderApagar(_estado); //Chama o método de acender ou apagar a luz
AcenderSpot(_estado); //Chama o método de emitir ou não luz no objeto
}
}
//linha 1
//linha 2
//linha 3
void AcenderSpot(bool _estado)
{
foreach (Renderer _rd in _listRenderComponents)
{
_rd.material.EnableKeyword("_EMISSION");
Material _mt = _rd.material;
if (_estado)
{
_mt.SetColor("_EmissionColor", new Color(177f, 116f, 203f, 1) * 1);
}
else
{
_mt.SetColor("_EmissionColor", new Color(177f, 116f, 203f, 1) * 0);
}
}
}
void AcenderApagar(bool _acao)
{
if (!_audio != null && !_audio.isPlaying)
{
_audio.Play();
}
for (int i = 0; i < _luzes.Length; i++)
{
if (_acao)
{
_luzes[i].enabled = true;
}
else
{
_luzes[i].enabled = false;
}
}
}
private void OnTriggerEnter(Collider _col)
{
if (_col.gameObject.tag == _playerTag)
{
_colidindo = true;
}
}
private void OnTriggerExit(Collider _col)
{
if (_col.gameObject.tag == _playerTag)
{
_colidindo = false;
}
}
}
Confira a videoaula completa.
Por hora é isto, quaisquer dúvidas deixem nos comentários, até a próxima!