Tutorial: Criando um Inspector Customizado no Unity3d

Olá, neste tutorial veremos como criar um inspector customizado no Unity3D para nossos MonoBehaviour’s.

É indicado para os casos em que não se consegue atender a questão das propriedades públicas ou serializadas.

Mas o MonoBehaviour já atende muito bem

%d0%be%d0%b1%d0%b8%d0%b4%d0%b0-%d0%b5%d0%b1%d0%b0%d0%bd%d0%b0%d1%8f-%d0%ba%d1%80%d0%b8%d0%ba-%d0%b4%d1%83%d1%88%d0%b8-%d0%b2%d1%81%d0%b5%d0%bc-%d0%bf%d0%be%d1%85%d1%83%d0%b9-%d0%bd%d0%b0%d0%b2%d0%b5

Ok, em boa parte de nossos projetos quando estamos começando a aprender Unity,  saímos colocando tudo como “public” e está lá no editor tudo pronto para que possamos editar.

Até que se percebe que há muitas propriedades no inspetor que precisam ser organizadas. Então aprendemos como personalizar o inspector com cabeçalhos, tooltips etc, usando os atributos que, caso ainda não esteja familiarizado, você pode conhecer nesse tutorial.

Contudo podem existir situações em que você vai precisar de algumas alterações mais específicas. Acreditem elas vão aparecer, quando estamos trabalhando em jogos mais complexos, quando estamos trabalhando com equipes ou até mesmo criando uma extensão.

Beleza, fiquei curioso.

692fd

Primeiro quero deixar claro que esse tutorial apenas arranha a superfície do que se pode fazer. Ele tem um teor introdutório mesmo, pois na verdade esse tema rende tutoriais bem mais específicos de algumas funcionalidades.  

Então vamos lá.

Vamos lá

Para exemplificar vamos construir um script que distribui uma quantidade de pontos para os “atributos” de forma aleatória.

Comece com o ritual padrão, abrindo o Unity e criando um novo projeto, vai lá vou ficar aqui esperando… Pronto? Certo, agora adicione um novo GameObject a cena e a este um novo Script MonoBehaviour. Sim, isso mesmo que você leu. Ainda vamos usar os MonoBehaviours  por enquanto, mas calma já vamos chegar lá. Nomeie o script criado de, por exemplo, DistribuidorDePontos.cs (quanta imaginação não?).

No DistribuidorDePontos.cs vamos criar um array  para guardar os pontos distribuídos.

 

private int[] atributos;

Agora crie um outro script chamado DistribuidorDePontosEditor.cs mas não adicione a nenhum GameObject.

Vamos iniciar nosso arquivo adicionando um a seguinte linha.

using UnityEditor;

Isso vai nos permitir usar as classes do Editor.

Agora temos que dizer qual o MonoBehaviour vamos alterar. Dessa forma:

[CustomEditor(typeof(DistribuidorDePontos))]

public class DistribuidorDePontosEditor : MonoBehaviour {

}

Contudo, nossa classe vai precisar herdar não de MonoBehaviour e sim de Editor

[CustomEditor(typeof(DistribuidorDePontos))]

public class DistribuidorDePontosEditor : Editor {

}

Vamos precisar de uma referência para o objeto que estamos editando e uma propriedade para guardar a quantidade de pontos.

private DistribuidorDePontos objeto;

private int quantidadeDePontos;

Usamos o metodo OnEnable para setar o valor da referência.

void OnEnable()

{

// a propriedade target pertence ao Editor

// Devemos sempre fazer o cast para o tipo que vamos editar

objeto = (DistribuidorDePontos)target;

}

Vamos escrever sobre o método que é chamado sempre que o inspector é redesenhado.

public override void OnInspectorGUI()

{

DrawDefaultInspector (); // desenha o insector padrão definido no MonoBehaviour

EditorGUILayout.PrefixLabel (“Meu Editor”);

// Cria um input com uma Label e uma propriedade para ler o valor anterior

quantidadeDePontos = EditorGUILayout.IntField (“Pontos”,quantidadeDePontos);

}

Aqui desenhamos a inspector padrão, se você remover esse trecho a definição do array.

Depois usamos o EditorGUILayout para com o metodo PrefixLabel para configurar uma Label e em seguida criamos um novo campo input que aceita apenas Int.

Se você quiser agora pode ir até o editor e selecionar o objeto em que o DistribuidorDePontos.cs está adicionado para ver as alterações.

Mas ainda não estamos distribuindo os pontos. Vamos precisar alterar o nosso OnInspectorGUI, porém primeiro vamos criar o método de distribuição.

private void Distribuir(int pontos)

{

for (int i = 0; i < objeto.atributos.Length; i++)

{

objeto.atributos [i] = 0;

}

for (int i = 0; i < pontos; i++)

{

int rand = Random.Range (0, objeto.atributos.Length);

objeto.atributos [rand]++;

}

}

Agora sim vamos alterar o método anterior, verificando se alguma alteração foi feita para assim chamar distribuição dos pontos;

public override void OnInspectorGUI()

{

DrawDefaultInspector ();

EditorGUILayout.PrefixLabel (“Meu Editor”);

quantidadeDePontos = EditorGUILayout.IntField (“Pontos”,quantidadeDePontos);

// verifica se alguma alteração foi feita

if(GUI.changed)

Distribuir (quantidadeDePontos);

}

Volte para o editor e veja a mágica acontecer. 😉

Bom, fico por aqui. Se gostou e percebeu o poder que isso pode ter, aconselho que leia a API do EditorGUILayout e, claro, ficque acompanhando os próximo posts aqui do Fábrica.

Allan Douglas

Allan Douglas

Allan Douglas (Redator) – Formado em Análise e Desenvolvimento de Sistemas (Estácio de Sá). Atualmente trabalha como Analista Líder na Teccenter no Recife – PE. Também desenvolve soluções WEB, Mobile e Games. É fanboy da SEGA e adora jogos de estratégia digitais ou analógicos.

Send this to a friend