Ponto V!

Home Unity Classes Genericas no Unity
Bruno Xavier
Classes Genericas no UnityImprimir
Escrito por Bruno Xavier

Olá. Já faz um tempo, mas aqui estamos nós novamente. :)

Estou trabalhando em dois projetos relativamente pesados e peço desculpas pela breve ausência.

Bom, da última vez que nos falamos conversamos sobre as formas de se trabalhar com scripts/classes não genéricas que executam funções específicas; na Unity classificados como Mono Behaviours…

Como todos sabemos, programadores são criaturas estranhas que, por algum motivo bizarro qualquer, gostam de automatizar tudo que podem, graças a deus eu nasci normal… Ou quase, ou não, melhor deixar isso pra lá…

Enfim, já que falamos sobre as classes não genéricas, hoje aqui vamos pensar um pouco sobre as genéricas, onde praticamente tudo é válido principalmente para os criadores de "ferramentas". Boa leitura! Ou quase… Ou não… Enfim…

Classes Genéricas

Bom, a parte enfadonha você pode tomar nota começando por aqui.

Isso praticamente resume o que elas são no ponto de vista dos programadores, mas como somos "fazedores de joguinho" podemos tentar encarar a coisa com um ar um tanto diferente:

Do ponto de vista mais abrangente possível, na Unity encare como "genérica" qualquer classe que execute funções liberais em produtos não previamente estabelecidos que estendem a funcionalidade de qualquer outra classe, alocando memória somente no momento de execução.

Quando existem certas funções que você sabe estarem sendo usadas em diversos e diversos MonoBehaviours durante a execução do jogo, talvez seja bom considerar tratar esta situação de uma forma "genérica" evitando que cada uma de suas classes tenha que criar referências o tempo todo para o objeto que acomoda estas funções.

Por exemplo, digamos que em vários momentos no jogo seu personagem sofra danos em seus pontos de vida, causados por diversos tipos de adversários onde cada um deles tem uma potência de ataque diferente. Sem uma classe genérica seria necessário criar um espaguete virtual onde cada uma das criaturas precisariam processar o dano de uma forma diferente. Ou seja cada um precisaria conter um MonoBehaviour que ditaria como o dano seria causado. Se o jogo é de tamanho considerável e o Game Designer elaborou uma fórmula única de dano para cada criatura no jogo, a coisa só tende a piorar em um cenário assim.

Já com uma classe genérica, todos os inimigos podem simplesmente utilizar a mesma função, e é ai onde o termo genérico realmente faz sentido para nós meros mortais, veja:

Classe Genérica:

public class MyGeneric {

    public static DamageFromTypeA(int damage, GameObject target) {

        //... Este é um local ideal para inserir as formulas malucas de dano dos game designers…
        int result = damage + Random.Range(20,100);

        target.SendMessage("ReceiveDamage",result);

        //Ao receber a mensagem com o valor do dano, o personagem processa o valor considerando items, etc.

    }

    public static DamageFromTypeB() {

        //Outra fórmula qualquer utilizada por outro tipo de inimigo…

    }

}

MonoBehaviour de um dos inimigos:

public class MyEnemyA : MonoBehaviour {

    void OnCollisionEnter(Collision collision) {

        MyGeneric.DamageFromTypeA(100,collision.gameObject);

    }
}


Estruturar seus scripts desta forma sempre que possível/necessário é muito importante conforme seu projeto cresce.

Imagine que, de repente se torna necessário balancear todo o dano causado por inimigos no jogo. Você como programador saberia exatamente qual script editar, já que centralizou todas as fórmulas de dano em um único script não seria problema… Não importa quantos tipos de inimigos existam no seu jogo, você sabe que todos eles passam por esta classe antes de causar dano ao jogador; Isso não apenas torna o projeto mais organizado, economiza tempo e automatiza muito os resultados.

E é isso, para os "scripters" que focam na jogabilidade em si, é isso o que deve ser uma classe genérica e para isso que ela deve servir: facilitar a troca de dados entre GameObjects sem interferir de forma brusca na coexistência entre os mesmos.

Nota: Classes genéricas não precisam ser MonoBehaviours, apesar de que você pode ainda assim manter funções genéricas em qualquer MB; o que pode acabar se tornando uma tremenda bagunça para ser sincero. Então, mantenha cada um no seu quadrado!

Boa sorte e divirta-se com a Unity!


Comentários (4)
  • Sanjuan
    avatar

    Não era exatamente isso que eu tinha como classe genérica, mas de qualquer forma já é uma maneira de reaproveitar código ^^

    Valeu pela dica!

  • Bruno Xavier
    avatar

    Olá Sanjuan.
    Como o Mono e a Unity já tem funções para tratar tipos genéricos,
    é bem improvável que você precise criar funções para esse fim, por isso escolhi um exemplo mais simplório de uso.
    É esse o meu ponto de vista no texto, não acho que classes genéricas na Unity devam ser abordadas como "tipos genéricos", como:

    Código:

    public class MyGeneric {
    public T aType;
    public float aFloat;
    }

    public class MyBehaviour : MonoBehaviour {
    public MyGeneric genericObject;
    }

    Devo dizer que ainda estou esperando o dia em que seja necessário usar um tipo genérico na Unity. Nunca me ocorreu. t+

  • Daniel Bonfim  - WWW Classe
    avatar

    ei, estou fazendo um projeto, onde eu uso o WWW para acessar uma URL em um banco de dados hospedado em um servidor online, eu quero saber se toda essa informação que eu pucho usando o WWW durante a execução do app é jogada fora depois de fechar? por exemplo, alocando espaço somente durante a execução.

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter