Acendendo e apagando luz no Unity 5

Neste artigo apresento como podemos obter um resultado de iluminação mais realista.

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!