Depois do ultimo post com os detalhes sobre o jogo ZIM, algumas pessoas me pediram pra comentar um pouco sobre como foi feita os lasers das sentinelas.No inicio, pensei que seria mais simples se objetos "refletores" tivessem um script pra detectar que foram atingidos pelo laser e emitir um laser na direcao/angulo apropriada. Apesar de funcionar, achei que uma solucao mais limpa seria o emissor script emissor do laser, se responsabilizar pelas reflexoes.Para explicar o codigo dos lasers preciso explicar que neste projeto tenho enumeracoes globais (Enums) para as tags e layers configurados na Unity3D. Por que ?Primeiramente, facilita para as pessoas que pegam o projeto, saberem que tags e layers precisam definir na Unity. Segundo, pois algumas vezes, precisamos dizer pra um script que objetos com a tag X deve ser afetados mas com a tag Y ou no layer Z, devem ser ignorados. Permitir que um script afete apenas um grupo de tags ou layers direto pelo editor, da uma flexibilidade imensa pro projeto. Tambem diminui a quantidade de strings fixas no codigo, que e um anti-padrao que gera bastante rertabalho caso uma tag seja renomeada mais a frente.Entao, nos codigos abaixo, quando vir "GameTags" e "GameLayers" saiba que se trata destas enumeracoes globais contendo todas as tags e layers do projeto. Um efeito colateral e ter que converter string para enumeracao e vice-versa.O laser e basicamente um LineRenderer entao, nada mais justo que tornar o LineNereder um componente necessario pro script [RequireComponent (typeof(LineRenderer))] Abaixo 4 variaveis importantes que definem respectivamente:quanto dano o lase causa por segundoobjeto atualmente sob a mira do lasertags que recebem dano em contato com o lasertags de objetos que refletem o laser public float damagePerSecond = 30; private GameObject currentTarget;public List AffectedTags = new List(); public List ReflectiveTags = new List(); Perceba que tenho listas de tags como parametros publicos, assim posso definir diretamente no editor, que objetos refletem o laser ou recebem dano desta sentinela.O LineRenderer permite ter um numero variavel de vertices. Uma linha reta sem refletir em nada, teria 2 vertices. A cada reflexao do laser, teremos 1 vertice a mais. Entao precisei de uma variavel para controlar a quantidade de vertices do LineRenderer private int vertexCount = 1; A cada frame, defino o LineRenderer como tendo apenas 1 vertice posicionado na origem do gameObject e em seguida chama o metodo ApplyLaserReflection() void FixedUpdate() { // Reseta o line renderer e faz o primeiro ponto iniciar na posicao deste transform vertexCount=1; lineRenderer.SetVertexCount(vertexCount); lineRenderer.SetPosition(0,transform.position); // Emite o laser e calcula as possiveis reflexoes ApplyLaserReflection(transform.position,transform.forward); } Este e o meodo principal responsavel por emitir o laser.Observe que este metodo checa se a tag objeto na mira esta entre as tags que devem receber dano (configurada pelo editor) ou esta entre as tags que refletem o laser. A cada reflexao do laser um novo vertice e adicionado ao LineRenderer e ha uma nova recursao do metodo. Para evitar loops infinitos caso um objeto esteja 100% alinhado com o laser, impus um limite de 10 reflexoes. Caso o objeto atingido nao seja um objeto reflexivo, o