You are on page 1of 183

Introduo ao Jogo de programao:

Usando C # e Unity 3D
Contedo
Agradecimentos
Sobre o autor
Prefcio
Introduo
Captulo 1 Conceitos de Programao
O que um Programa?
Fundamentos da Programao
Conceitos de programao orientada a objetos
Classes e Objetos
Encapsulamento
Passagem de mensagens
Abstrao
Composio
Herana
Polimorfismo
Modularidade
Genricos
Interfaces
Delegados
Eventos
Captulo 2 - Breve Introduo IDE Unity
Resumo da interface
Painel Cena
Painel Game
O Inspetor
Janela Hierarquia
Janela Projeto
Criando Nosso Primeiro Objeto do Jogo
Entrar na Programao C # e Unity 3D
Editar Construtor e Configuraes do Jogador
Captulo 3 - Objetos do Jogo e Componentes
O que um GameObject?
Adicionando e Editando Componentes
Scripts como Componentes
GameObjets Estticos
Prefabs Conceitos e Uso
Relacionamento Pai-filho
Captulo 4 Regras e Mecnica de Jogo
Conceitos Bsicos de Mecnica de Jogo
Exemplos Simples da Mecnica
Fsica para os Jogos
Entrar no Componente Collider
Interaes do Collider
Corpo rgido
Juntas
Mecnica de Caracteres

ix
xi
xiii
1
3
3
3
16
17
20
22
22
23
24
25
25
26
28
29
30
35
35
36
36
36
37
37
38
46
49
51
51
52
53
54
59
60
61
61
66
71
72
73
74
74
78

Captulo 5 Criando a Interface do Usurio


Os Princpios de Design de Interface em Unity 5
Criando Nossa Primeira Interface do Usurio
Melhorar a Interface do Usurio
Captulo 6 - Criando Battleship
Contexto Histrico
Play de Jogo
Plano de Jogo para a Implementao
Reunindo tudo Objetos do Jogo
Fluxo de Jogo + Lgica
Interface de Usurio do Jogo
Captulo 7 Aprofundando-se nos Cdigos
Script BoardUIVer1.cs
Script BoardVer1.cs
Funes Definidas na Classe BoardVer1
Interface de Usurio do Jogo
Anexo 1 ndice de figuras
ndice de figuras
Apndice 2 Tabela dos Blocos de Cdigos
Tabela dos Blocos de Cdigos

Agradecimentos
Quero aproveitar a oportunidade e reconhecer e agradecer a minha parentos lugar. Sinto-me humilde e grato pelas grandes obras que tm
realizado para mim. Eles tm sofrido muito por seus filhos e
deram-se muito para o bem de seus filhos. Espero que um dia
Eu posso pagar por seus esforos, e ser capaz de ser um bom pai para o meu prprio
crianas.
Em segundo lugar, gostaria de reconhecer cada indivduo que tem
entrou e me influenciou por toda a minha vida. Estes so os mentores
desde a minha infncia, seguido por meus professores na universidade e
todos os outros no meio. O bom, o mau eo feio, tenho verdadeiramente
moldado e formado o meu carter, personalidade e sabedoria. Pode o
jornada continuar para sempre!
Por ltimo, gostaria de agradecer a minha mulher para pacientemente lendo
o projecto do livro e dando-lhe um feedback ao longo do
desenvolvimento. O livro nem perto de uma obra de arte, e com certeza
no romance romntico. Pelo contrrio, muito seco e tcnica, assim
obrigado por sua pacincia e feedback, enquanto gestora da casamanter e cuidar das crianas, que, no momento da redao deste texto so de
2 anos e 4 meses de idade.
Sobre o autor
Quando criana, eu era sempre curioso sobre como as coisas funcionam e quais
a fora motriz por trs deles era. Esta curiosidade, eventualmente, dirigido
me no estudo da Cincia da Computao. Um dos nicos campos com
potencial ilimitado para criar tudo o que voc pode sempre possivelmente
conceber.
Na realidade, a capacidade de criar seu prprio mundo e ser capaz de command e controlar o virtual eo ambiente fsico o que eu
queria fazer. Como construir e robs de controle, como fazer computadores
pensar, como criar uma simulao e assim por diante. Para encurtar a histria, isso

131
132
141
175
185
185
186
187
196
199
203
207
207
212
216
248
255
255
257
257

como a minha jornada comeou.


Vah Karamian detm um mestrado em cincia da computao, a sua
interesse incluem a forma de melhorar a aprendizagem virtual atravs do Virtual
Mundos e ambientes 3D. Ele desenvolveu e ensinou computador
cursos de cincias desde 2011. Os tpicos incluem Introduo Computao
Cincia, Java, C #, Python, Estruturas de Dados e Algoritmos, Operating
Sistemas e Game Design e Programao.
Prefcio
O livro chegou a ser baseada em vrios fatores. Em primeiro lugar,
o principal objetivo deste livro fornecer um ponto de partida no campo
da cincia da computao e programao especificamente jogo. Em segundo lugar,
destina-se como uma forma de aumentar o interesse em indivduos no domnio da comcincia informtica.
O livro destinado a pblico especfico. Supe-se que o
leitor tem uma paixo para o estudo da cincia da computao, e que eles
tem uma paixo em game design e desenvolvimento. Assume-se tambm que
o leitor pr-ativa e que eles teriam a capacidade de se envolver
num nvel mais profundo por conta prpria.
O livro destina-se principalmente para o programador em vez do
artista. H uma abundncia de livros l fora, visando especificamente o arparte tistic de desenvolvimento de jogos. Este livro escrito para aqueles que
quer dar vida s partes artstico bonito! para a mgica
parte de todo o processo. para o guerreiro cdigo.
Uma vez que os temas discutidos no livro so extremamente grandes em
amplitude e profundidade, impossvel cobrir todos os aspectos de uma
livro. Tendo em mente que este concebido como um livro introdutrio para
o assunto, o contedo discutido nos primeiros captulos so genricos
para o campo da cincia da computao, o resto do livro concentra-se em
mecnica do jogo e como escrever jogos de computador.
O outro assunto teria uma atrao em comparao com jogo
design e desenvolvimento? O futuro da Human Computer Interaction
vai ser atravs de Realidade Virtual e Realidade Aumentada na
nos prximos anos. Este livros lhe dar os blocos de construo para o caminhocaminho para o futuro.
Introduo
Este livro escrito com dois objetivos em mente, em primeiro lugar, para introduzir
o leitor aos conceitos de programao usando C #, em segundo, para colocar em
praticar os conceitos de uma forma divertida e descontrada atravs do desenvolvimento de comjogos de informtica e conceitos de design do jogo.
Mesmo que este um livro introdutrio, presumo que o leitor
teria alguma familiaridade com programao de computadores e objectprogramao orientada com a linguagem C #. Assume-se tambm que o
leitor sabe o bsico do ambiente Unity 3D.
No Captulo 1, o leitor dada uma breve viso geral sobre os conceitos
da programao e da terminologia projeto orientado a objetos. O captulo
destina-se como uma referncia rpida. Para aqueles leitores que j esto familiar com o bsico, que ser uma boa reviso rpida. Para aqueles leitores
que esto apenas comeando para fora, ele vai te dar uma boa base e espero fazer
os temas mais acessveis medida que crescem no campo.
Captulo 2, uma introduo ao ambiente Unity 3D IDE.

As sees bsicas do IDE so explicados. O usurio mostrado como


navegar dentro do IDE e criar GameObjects. Como usar o transferramentas de formulrio para a traduo, escala e girar uma GameObject. o Inspector
Janela discutida em que todos os componentes e GameObject
propriedades podem ser modificadas atravs do designer e muitos outros til
dicas e truques.
Captulo 3, aprofunda o conceito de GameObjects. Como
cri-los, como adicionar componentes, existente ou personalizado. Scripts so
discutido e mostrado como eles podem ser anexados a GameObjects e agir
como componentes. O conceito de uma casa pr-fabricada introduzido eo paiRelacionamento da criana dentro de um GameObject tambm introduzido e disamaldioado.
Captulo 4, o leitor apresentado a Regras e Mecnica de jogo.
Este o captulo que define as bases e as regras de design de jogo
e o desenvolvimento. Ele discute os conceitos bsicos de mecnica de jogo que so
usado em todos os jogos para uma extenso. Em seguida, vrios exemplos so construdos a partir
arranhar para ilustrar os conceitos. Fsica, aceleradores e corpo rgido so
tambm discutiu.
Captulo 5, o leitor apresentado ao design de interface do usurio, e
a nova arquitetura de built-in para o design da interface do usurio na Unidade 5. Uma viso geral
a arquitetura de interface do usurio dada no captulo e os exemplos construir em
Captulo 4 so usados para introduzir conceitos de interface do usurio e demonstrar como
construir UIs interessantes para o seu jogo.
Captulo 6, discute um jogo clssico chamado Battleship. Uma breve histrica fundo dado e as regras do jogo e jogo so discutidas.
Em seguida, o leitor orientado as etapas para projetar e implementar
cuo do jogo. Objetos do jogo, o fluxo de jogo, lgica do jogo eo usurio
interface so discutidas.
Captulo 7, investiga o cdigo C # que tem sido discutido e
gerado durante todo o Captulo 6 e reforada no Captulo 7. A priscripts de mary so dissecados, as funes so definidos e explicados ea
Interface de usurio para o jogo finalizado.
Captulo 1 - Programao Conceitos
O que um Programas?
Um programa uma instruo de passo-a-passo, que foi concebido para
resolver um determinado problema. Aqui est outra definio:
"Uma lista organizada de instrues que, quando executado, faz com que o
computador a comportar-se de uma maneira predeterminada. Sem programas,
computadores so inteis. "
Mas a melhor definio que foi dada foi pelo meu Professor Dr. Lee em
a classe estrutura de dados na Cal Poly:
Programa = Dados + Algorithm
Um programa como uma receita. Ele contm uma lista de variveis que representam
enviou os dados a serem processados, e uma lista de instrues, o algoritmo (s)
que executam operaes especiais sobre os dados.
Fundamentos da Programao
Cada programa precisa para armazenar dados. A fim de armazenar dados em um cominformtica, ns usamos o que so chamados de variveis. Uma varivel precisa saber o que
tipo de dados que est armazenando, portanto, uma varivel precisa ter um tipo de dados.
Tipos de dados
Linguagens e frameworks de programao de hoje oferecem vrios

tipos de dados bsicos que podem ser usados para armazenar e recuperar informaes sobre
o computador. Esses tipos de dados so, em geral:
1. numrico
2. Alpha-Numeric
3. booleana
4. Complex
Os tipos de dados numricos so representados por byte, short, int, long,
float e double. Tipos de dados alfanumricos so CHAR e cordas. Ento
voc tem o seu tipo de dados booleano, que apanhar um verdadeiro de um falso valor,
e tipos de dados, finalmente complexas que so definidos pelo usurio. Complexo ou usurio
tipos de dados definidos so as classes que sero discutidos mais tarde.
Existem 15 diferentes built-in tipos de dados na linguagem C #. o
seguinte tabela vai list-los para fora para voc e tambm fornecer-lhe com o
gama possvel de cada tipo.
Nome curto
uint
9223372036854775
64
Tipo de base de
.NET Classe
UInt32
807
todos os outros
Digitar
inteiro sem sinal
ulong
1.79769313486232
tipos
Largura
32
UInt64
e308 para
corda
Range (bits)
De 0 a 4294967295 inteiro sem sinal 1.79769313486232
Corda
byte
baixo
64
E308
A sequncia de
Byte
Int16
0carbonizar
caracteres
inteiro sem sinal
inteiro assinado 1844674407370955
carbonizar
decimal
8
16
1615
Um personagem
Decimal
0 a 255
32.768 a 32.767
flutuador
Unicode nica Precise fraccionada
sbyte
ushort
solteiro
16
ou inteSByte
UInt16
Flutuante de
Unicode smbolos Tipo de gral que
inteiro assinado
inteiro sem sinal preciso simples
usados no texto
pode
8
16
tipo de ponto
bool
representar
-128 A 127
0 a 65535
32
boolean
nmeros decimais
int
longo
-3.402823e38 Para Tipo booleano
com 29 dgitos
Int32
Int64
3.402823e38
lgica
significativos
inteiro assinado
inteiro assinado
duplo
8
128
32
64
Duplo
Verdadeiro ou falso 1,0 10e-28 a
-2.147.483.648
Flutuante de
objeto
7,9 10e28
para
9223372036854775 preciso dupla
Objeto
2,147,483,647
808 para
tipo de ponto
O bloco de cdigo a seguir ilustra como usar alguns dos mais
tipos de dados comuns:
// Verdadeiro ou falso - um pouco
bool b = true;
// 0 ... 255
byte B = 9;
// -32.768 .. 32.767
curtas s = 25;
// 2,147,483,648 ... 2.147.483, 647
int i = 10;

// -3.402823e38 ... 3.402823e38


float f = 10.0f;
// -9.223.372.036.854.775.808 .. 9.223.372.036.854.775.807
longo l = 34;
// -1.79769313486232e308 ... 1.79769313486232E308
dupla z = 13,33;
Cdigo de bloco tipos 1-variveis de atribuio e de dados
importante compreender os tipos de dados. Cada varivel que voc definir
no seu programa tem que ser de algum tipo de dados. importante ser capaz
atribu-los adequadamente, ser capaz de atualizar e ou modific-las e,
vezes, voc vai querer converter de um tipo de dados para outro.
Condicionais e deciso de estruturas que permitam
Ento precisamos de alguma maneira de fazer a deciso dentro do nosso programa
com base em algumas condies. Estas so feitas pela declarao if..else e
switch. Podemos ter vrias instrues if..else. Ns tambm podemos
combinar declaraes if..else condicionais com a instruo switch e
vise-versa.
int x = 4;
se (x> 2)
{
. System Console .WriteLine ( "X > 2");
if (x <5)
{
. System Console .WriteLine ( "X <5, mas> 2");
}
}
outro
{
. System Console .WriteLine ( "X <= 2");
}
Bloquear Cdigo 2-se ... exemplo de estrutura de outra pessoa
O computador tem de executar cada instruo de se encontrar.
page 20
Unity 3D - Jogo de Programao Intro
6
A poro do outro if..else opcional, e apenas ser executada
primeiro se ele definido e, segundo, se a se a condio falsa. o if..else
declarao tambm pode ser aninhados. Isso permite que o programador para verificar se h
muitas condies diferentes. Um exemplo seria:
se (x> 100)
{
// faa alguma coisa;
}
else if (x> = 25 && x <= 50)
{
// Fazer outra coisa
}
else if (x> = 10 && x <25)
{

// Fazer outra coisa


}
outro
{
// Fazer outra coisa
}
Cdigo Bloco 3 - declarao if..else Nested
Em um comunicado if..else aninhada, cada um se condio ser executado em
a ordem theyare listados. Uma vez que um dos, se as condies de satisfazer os critrios,
seu corpo vai ser executada, e o resto das condies sero ignorados.
page 21
Vah Karamian
7
Os dois diagramas acima ilustram a condio if..else graphcamente.
A instruo switch uma outra maneira de fornecer a tomada de deciso
dentro de seus programas. Leva em uma varivel como um parmetro, e demultas casos especiais. Se o parmetro satisfaz o caso, ento o corpo de
o caso ser executado. O caso default opcional assim como o resto
declarao na estrutura de deciso if..else. Se o caso padro definido,
e nenhum dos casos primrios so combinados, ento ele ser executado.
// X se de um valor atribudo antes desta etapa
switch (x)
{
case 1:
{
// Cdigo aqui para lidar com caso quando x = 1
break;
}
case 2:
{
// Cdigo aqui para lidar com caso quando x = 2
break;
}
case 3:
{
// Cdigo aqui para lidar com caso quando x = 3
break;
}
default:
{
// Cdigo aqui para lidar com lgica quando x
// No corresponde a nenhum dos casos definidos
break;
}
}
Cdigo Bloco 4-switch exemplo estrutura de declarao
Uma grande diferena que voc vai notar entre o if..else eo
Estruturas de switch, a capacidade de executar vrios blocos de cdigo em um
switch. Observe que cada caso encerrado por uma quebra command. O comando ruptura opcional. Se ele estiver presente, aps o

execuo do bloco caso, a estrutura switch ir terminar. Se for


no estiver presente, a lgica ir fluir para o prximo bloco caso.
page 22
Unity 3D - Jogo de Programao Intro
8
Para compreend-lo, considere o seguinte: assumir o valor para o
varivel x definido como 1. Tambm assumem que a instruo break no demultado no bloco caso. Quando a instruo switch avaliado, ele vai
executar caso 1. Uma vez que no existe nenhum comando quebra de presente, ele ir exebonito o prximo bloco caso, que passa a ser o caso 2. Isso vai continuar
at que uma instruo break identificado.
Cdigo Bloco 2 e Cdigo Bloco 4 fornecer um exemplo simples de como
para usar a deciso de fazer declaraes na linguagem C #. Tenha em mente
que a listagem exibir a estrutura bsica, voc pode estend-los para atender
cenrios complexos.
page 23
Vah Karamian
9
Estruturas de loop
s vezes a gente tambm precisa ser capaz de repetir o mesmo bloco de cdigo
um certo nmero de vezes. Isto conseguido em uma estrutura em ansa. Existem Sevestruturas de loop eral na linguagem C #:
loop
Byusing um loop for, voc pode executar uma instruo ou um bloco de declarao
repetidamente at que uma expresso especificada for avaliada como falsa. Este tipo de
circuito til para a iterao sobre matrizes e para outras aplicaes em
que voc sabe de antemo quantas vezes voc quiser que o loop para itperar. A estrutura de um loop for:
for (initializer; condio; iterator)
{
// Corpo do lao
}
A seco de inicializador define o inicial
condio. As declaraes neste seco executado apenas uma vez, antes de entrar
o lao.
A seco contm uma condio Boolexpresso ean que avaliada para
determinar se o ciclo deve
sair ou continuar a executar.
A seo iterador define o que aconcanetas aps cada iterao do corpo de
o lao.
O corpo do circuito consiste numa
declarao, uma declarao vazia, ou uma
bloco de instrues que voc cria
colocando a zero ou mais declarao em
suspensrios.
Figura 1 - para o diagrama de circuito

page 24
Unity 3D - Jogo de Programao Intro
10
loop foreach
A declarao foreach repete um grupo de comandos incorporados para
cada elemento em uma matriz ou um objeto de coleo que implementa o
IEnumerable ou IEnumerable <T> interface. A declarao foreach
usado para percorrer uma coleo para obter a informao que voc precisa, mas
ele no pode ser usado para adicionar ou remover itens do conjunto fonte.
Isto para evitar efeitos colaterais imprevisveis.
Figura 2 - Diagrama de loop foreach
As demonstraes incorporados continuar a executar para cada elemento
a matriz ou coleo. Aps a iterao foi concluda para todos
os elementos de recolha, o controlo transferido para a prxima declarao
mento seguinte do bloco foreach.
int [] = new fibarray int [] {0, 1, 1, 2, 3, 5, 8, 13};
foreach (int elemento em fibarray)
{
. System Console .WriteLine (elemento);
}
page 25
Vah Karamian
11
while
A declarao enquanto executa uma instruo ou um bloco de instrues
at que uma expresso especificada for avaliada como falsa. Uma vez que o teste do
enquanto que a expresso ocorre antes de cada execuo do ciclo, um tempo
ciclo executa zero ou mais vezes.
do-while
A declarao do-while executa uma instruo ou um bloco de declarao
mentos repetidamente at que uma expresso especificada for avaliada como falsa. Ao contrrio
o loop while, um loop do-while executado uma vez antes da condio
expresso nal avaliado.
Figura 3 - enquanto diagrama de circuito
Figura 4 - do-while diagrama de circuito
Cada linguagem de programao e ambiente ir fornecer alguma
uma espcie de mecanismo de loop. Em C #, temos quatro tipos que tm
foi discutida acima. Cada estrutura de lao usado para a finalidade especfica
tal como descrito. Os laos mais utilizados so o loop for, o fochegar loop e a estrutura de loop while. O loop do-while usado em
ocasies especiais, onde voc gostaria de executar o corpo do loop
page 26
Unity 3D - Jogo de Programao Intro
12
pelo menos uma vez antes de verificar a condio para determinar se
quero continuar a iterao ou seguir em frente com o ramo principal do cdigo.
Por exemplo, a estrutura for loop deve ser usado quando voc sabe
o tamanho dos elementos ou o nmero de vezes que voc gostaria de execute o bloco de cdigo dentro do corpo do ciclo. O loop foreach
estrutura deve ser usado quando voc quer iterar sobre um conjunto de coleta.

O tempo e as estruturas de loop do..while so normalmente utilizados quando


no sabemos quantas vezes precisamos para executar a estrutura do corpo
do circuito, mas, sabemos que a condio para a qual para sair do
loop.
for (int LoopCount = 0; LoopCount <10; LoopCount ++)
{
// Fazer alguma coisa aqui ...
}
enquanto (x <10)
{
// Fazer alguma coisa aqui ...
X ++;
}
Faz
{
// Fazer alguma coisa aqui ...
X ++;
} While (x <10);
Amostras de estrutura 5 de circuito cdigo de bloco
Mtodos
Um mtodo de programao orientada a objeto um as- procedimento
ciado a uma classe de objeto. Um objecto composta de comportamento e de dados.
Os dados so representados como propriedades do objeto e comportamentos como metanfetamina
ods. Os mtodos so tambm um objecto da interface para o exterior apresenta
mundo. Mtodos tambm fornecem a interface que outras classes usar para accesso e modificar as propriedades de dados de um objeto. Isto conhecido como
encapsulamento.
Um mtodo um bloco de cdigo que contm uma srie de instrues. UMA
programa faz com que as instrues a serem executadas chamando o mtodo
page 27
Vah Karamian
13
e especificar quaisquer argumentos de mtodo necessrios. Em C #, cada executada
instruo realizada no contexto de um mtodo.
Mtodos so declarados em uma classe ou estrutura, especificando o acesso
nvel, como, modificadores pblicos ou privados opcionais, tais como abstrato ou
selada, o valor de retorno, o nome do mtodo, e qualquer mtodo patros. Todas estas partes so em conjunto o assinatura do mtodo.
Parmetros do mtodo esto entre parnteses e so separados por
vrgula, parnteses vazios indicam que o mtodo no requer PAtros. O que se segue um exemplo de assinatura de um mtodo:
[modificador de acesso]-tipo de retorno mtodo-name ([tipo de parmetro parmetro de nome []])
{/ * Mtodo de corpo * /}
Os elementos de sintaxe so como se segue:
acesso modificador: determina o grau em que o seu
mtodo acessvel por outras classes.
retorno-type: o tipo de varivel retornado pelo mtodo (a
mtodo tambm pode retornar um objeto de uma classe especificada). Seu
mtodo deve retornar um valor usando a palavra-chave de retorno e
ele deve retornar um valor que corresponda ao tipo de retorno.
mtodo-name: o nome que voc atribui ao seu mtodo.

parmetro-type: o tipo de parmetro passado para o seu


mtodo (um mtodo tambm pode aceitar objetos de um determinado
classe).
parmetro-name: o nome do parmetro passado para o seu
Mtodo.
mtodo de corpo: a afirmao de que executar o seu mtodo de
tarefa.
// A funo a seguir leva de dois dados de ponto flutuante
// Parmetros, e retorna a soma das duas variveis
// Como outro tipo de dados de vrgula flutuante
flutuador Add privada (float x, flutuador y)
{
voltar x + y;
}
Cdigo Bloco 6-exemplo de um mtodo
page 28
Unity 3D - Jogo de Programao Intro
14
Por padro, quando um tipo de valor passado para um mtodo, uma cpia
passou, em vez do prprio objeto. Portanto, as alteraes ao argumento
no tm efeito sobre a cpia original no mtodo de chamada. Voc pode passar
um tipo de valor por referncia usando a palavra-chave ref.
Ao passar por valores de referncia, o mtodo no recebe o obJect em si, mas um argumento que indica a localizao do objecto em
memria. Se voc alterar um membro do objeto usando essa referncia,
a alterao refletida no argumento do mtodo de chamada, mesmo se
voc passar o objeto por valor.
Aqui est um exemplo que demonstra passagem de parmetros por referncia:
// O parmetro x passado por referncia.
// Alteraes x afetar o valor original de x.
SquareIt static void (ref int x)
{
X * = x;
System Console .WriteLine ( "O valor dentro do mtodo: {0}", x).;
}
static void Main (string [] args)
{
int n = 5;
System Console .WriteLine ( "O valor antes de chamar o mtodo.:
{0} ", N);
SquareIt (ref n); // Passando a varivel por referncia.
System Console .WriteLine ( "O valor depois de chamar o mtodo: {0}".,
n);
. System Console .WriteLine ( "Prima qualquer tecla para sair.");
System Console .ReadKey (.);
}
Cdigo Bloco 7 - parmetro Mtodo passar por referncia
Os mtodos podem retornar um valor para o chamador. Se o tipo de retorno no
vazio, o mtodo pode retornar o valor usando a palavra-chave de retorno. UMA
indicao com a palavra-chave de retorno, seguido por um valor que corresponda ao
tipo de retorno retornar esse valor para o chamador mtodo. O teclado de retorno

palavra tambm pra a execuo do mtodo. Sem o retorno


palavra-chave, o mtodo ir parar a execuo, quando se atinge o final do
bloco de cdigo.
page 29
Vah Karamian
15
Para escrever um programa, usamos estes princpios simples e combin
-los para resolver problemas complexos. Agora claro que h mais do que isso
que rene os olhos, mas os princpios so os mesmos. H um monte de outras
conceitos e informaes tcnicas que no tenha sido apresentadas neste
seo. Isto porque, o autor espera que o leitor esteja familiarizado
com as noes bsicas de programao e que ele ou ela tomou programao
cursos Ming e agora est pronto para aplicar essas habilidades ao jogo
programao.
Vamos dar uma olhada em um exemplo simples que ir demonstrar alguns
dos conceitos que acabamos de discutir. O programa a seguir uma simples
calculadora que vai ser usado para executar algumas operaes bsicas tais como
adio, subtrao, multiplicao e diviso:
flutuador Add private static (float x, flutuador y)
{
voltar x + y;
}
Subtrair flutuador private static (float x, flutuador y)
{
voltar x - y;
}
flutuador private static Multiply (float x, flutuador y)
{
voltar x * y;
}
flutuador esttica privada? Divida (float x, flutuador y)
{
se (y> 0.0f)
voltar x / y;
outro
return null;
}
static void Main (string [] args)
{
flutuar R1 = Adicionar (2.0F, 2.0F);
flutuar r2 = Subtrair (R1, 2.0F);
flutuar R3 = Multiply (R2, R1);
flutuar R4 = Divide (8.0f, 0.0f);
if (R4 == null)
{
R4 = Divide (8.0f, 2.0F);
}
page 30
Unity 3D - Jogo de Programao Intro
16

String R = cadeia .format ( "R1 = {0}; R2 = {1}; R3 = {2}; R4 = {3}", R1, R2, R3,
R4);
. System Console .WriteLine (r);
}
Cdigo Bloco 8-programa simples calculadora de demonstrao
Neste ponto, voc deve ter uma boa compreenso dos princpios bsicos. H sim
um monte de contedo aqui se voc no tiver feito qualquer programao antes. Para
aqueles que tiveram exposio a alguma programao, este se destinava
como uma lembrana rpida, bem como proporcionar uma verso mais condensada
dos conceitos.
Agora que temos uma viso preliminar dos fundamentos, podemos
comear a discutir modernos conceitos de programao usando Object-Oriented
Programao.
Conceitos de programao orientada a objeto
Jogos sem programao no ser muito divertido! Programao
o que traz tudo para a vida em um jogo, portanto, veryimportant
para aprender e compreender os conceitos de programao e como aplicar
-los para os jogos que voc pretende projetar e desenvolver.
-Programao Orientada a Objetos (OOP) , uma filosofia de design, um
modelo de programao onde os programas so organizados em torno de objetos e
de dados, ao invs de ao e lgica, tudo em OOP agrupado como auto
sustentvel. Programao Orientada a Objetos permite a decomposio de um
problema em um nmero de entidades chamadas objetos e, em seguida, constri dados
e mtodos em torno destes objectos.
O conceito de objectos de software surgiu da necessidade de modelar
objetos do mundo real em simulaes de computador. Um objeto pode ser considerado como uma representao de um item de fsica ou de uma ideia que pode executar
um conjunto de atividades relacionadas. O conjunto de atividades que o objeto executa
define o comportamento do objeto.
Por exemplo, em seu jogo voc ter vrios objetos que fazem
o seu jogo. Por exemplo, pense em como voc pode representar um tanque
page 31
Vah Karamian
17
em seu jogo. O tanque, o qual uma espcie de um veculo, pode apresentar uma varivel
ety de comportamentos, como mover do ponto A para o ponto B, carregamento e
un-carregar os reservatrios, o acompanhamento de um alvo, e tiro ao alvo. Deve
tambm manter informaes sobre suas caractersticas (sade, combustvel, velocidade,
velocidade mxima, a capacidade de shell, e etc ...) para no mencionar a sua actual
estado (localizao, velocidade de orientao, estoque e etc ...).
Para representar o tanque como um objeto, voc iria programar a sua tamento
IORs como mtodos e declarar variveis para conter informaes sobre a sua
caractersticas e estados. Durante o jogo, o objeto vai levar
os seus vrios mtodos, alterando as variveis como necessrio para reflectir a
efeito de suas aes. O conceito de um objeto simples, mas poderosa.
Objetos fazem mdulos de software ideais porque eles tambm podem ser definidos e
mantidas independentemente uma da outra, com cada objecto a formao de um
puro, universo auto-suficiente. Tudo o que um objeto sabe capturado
em suas variveis, e tudo o que ele pode fazer expressa em seus mtodos.
Classes e Objetos
Os blocos de construo bsicos de programao orientada a objetos so o

classe eo objeto. Uma classe o projeto de um objeto. Um objeto


uma instncia da definio de classe. Isso ser muito mais clara medida que disxingar-lo e coloc-lo em prtica ao longo do livro.
Nosso mundo est cheio de objetos. Meu carro um objeto, minha bicicleta um
objeto, minha casa um objeto e meu avio um objeto. Na verdade, qualquer
item tangvel um objeto. De igual modo, os objectos podem ser agrupados em conjunto
em uma classe. Meu carro podem ser agrupados em uma classe genrica de veculos, todos
que tm caractersticas e comportamentos semelhantes. Um objeto tambm pode
representam coisas mais abstratas - como formas geomtricas, e ou transaes.
A maneira mais fcil de demonstrar este conceito com um ex- simples
amplo. Vamos considerar que gostaramos para modelar um carro. Para que ns
Para conseguir isso, gostaramos de criar uma classe chamada carro. Nossa classe carro
precisa armazenar algumas informaes sobre o objeto do carro e alguns logia
ODS para representar o comportamento do objecto carro. O que se segue um Visual
representao do nosso modelo de carro:
page 32
Unity 3D - Jogo de Programao Intro
18
Figura Objeto 5-Car
Agora, na realidade, as propriedades e funes de um carro moderno so
muito mais complexo. Mas por causa da manifestao que eu tenho guardado
as coisas simples. Continuando a nossa discusso, cada objeto carro ter
os pontos de dados definidos, e os mtodos que sero designadas usadas para
o acesso e ou alterar o comportamento do objeto carro instanciado.
Voc declarar uma classe usando a palavra-chave classe, que usam o acompanhamento
ing sintaxe simplificada:
[modificador de acesso] class class-name { / * corpo * / }
acesso modificador : o grau em que sua classe acessibilible para o mundo exterior.
class-name : o nome que voc atribui a sua classe.
classe de corpo : o corpo de vocs classe.
As aulas so normalmente declaradas usando o modificador de acesso pblico,
o que significa que a classe est disponvel sem restries. Voc vai aprender
mais sobre o acesso modificadores posteriores. A sintaxe anterior foi simplified de modo que voc no est sobrecarregado com demasiada informao.
Aqui um simples carro de classe:
page 33
Vah Karamian
19
public class Car
{
private string make;
// Store fazer como tipo de cadeia
private string modelo;
// Modelo de loja como tipo de cadeia
private int ano;
// Ano loja como tipo int
private string de cor;
// Cor loja como tipo de cadeia

pblica Car () { / * construtor * / }


public void start () { / * cdigo para ligar o carro * / }
public void Stop () { / * cdigo para parar o carro * / }
public void Acelerar () { / * cdigo para a acelerao * / }
Cadeia pblica GetMake () { return este .make; }
Cadeia pblica getModel () { return este .model; }
public int GetYear () { return este .ano; }
Cadeia pblica GetColor () { return este .Color; }
public void SetMake ( cadeia make) { este .make = fazer; }
public void setModel ( cadeia modelo) { este .model = modelo; }
public void setYear ( int ano) { este .ano = ano; }
public void SetColor ( string de cor) { este .Color = cor; }
}
Cdigo Bloco 9 - Exemplo de classe carro
No carro de classe, temos declarado quatro campos: faa , modelo , ano
e cor . O ano de campo do tipo int , eo resto so do tipo cadeia .
O modificador de acesso dos campos definida como privada . Isto indica que
os campos so restritas, e que ningum tem acesso direto a eles. Para
acessar esses campos, o usurio precisaria passar pelo getter e
Setter mtodos, tais como o GetMake () mtodo para recuperar o valor
do campo, ou para definir ou modificar o valor atravs do SetMake () mtodo.
Como voc j sabe, uma classe define um modelo para a criao de objetos.
Uma vez que voc declarou uma classe, voc pode criar objetos dessa classe.
A declarao a seguir cria um carro objeto:
Carro myCar = new Car ();
A primeira seo, declara uma referncia a um carro de objeto, chamado meuCarro , e usado para manter o local da memria real de um carro objecto.
A segunda seo, na verdade, cria um carro objeto no computador de
page 34
Unity 3D - Jogo de Programao Intro
20
memria. o novo
1
operador aloca a memria para o carro de objeto,
eo carro () mtodo cria o objeto. A Car () mtodo conhecido como
um construtor . A localizao de memria do recm-criado Car objeto
atribudo a myCar e myCar uma referncia atravs do qual voc pode
acessar o real Car objeto.
encapsulamento
dados e procedimentos relacionados com a embalagem em conjunto chamado de encapsulao. A chave para o objecto de encapsulao o interface de mensagens. o
interface de mensagem serve para proporcionar uma barreira essencial entre o inestrutura terna do objeto e tudo o que est fora do objeto.
A interface de mensagem garante que todas as interaes com o objeto tomar
colocar atravs de um sistema pr-definido de mensagens que o objeto gaanteed para compreender e tratar corretamente.
O encapsulamento essencial para a criao sustentvel Object-oriProgramas mas orientados. Quando a interao com um objeto usa apenas o
interface disponvel publicamente de mtodos e propriedades, a classe do
objeto se torna uma unidade corretamente isolado. Esta unidade pode ento ser substitudo
de forma independente para corrigir erros, mudar comportamentos internos ou para melhorar

funcionalidade ou desempenho.
Em nossa analogia do carro, o motorista de um carro realmente no precisa saber
a mecnica complexa que vo para ligar o carro e tornandoacelerar ou desacelerar, tudo que eles precisam saber o que botes apertar
para ligar o carro, parar o carro, e fazer o movimento do carro. Os detalhes so
escondido! A complexidade escondido! Portanto, podemos facilmente atualizar
os sistemas internos do carro sem mudar a forma como os motoristas de carro
seus carros!
Propriedades permitem definir e obter campos usando mtodos. devidamente,
laos so uma grande caracterstica do C #, porque eles permitem que voc esconda seus campos
de seus usurios de classe, tornando-os privado , enquanto continua a fornecer
1
O novo operador eo construtor so usadas para criar um objeto. Voc acessar um objeto
atravs de uma referncia de objeto, que detm a localizao do objeto real na memria.
page 35
Vah Karamian
21
-lhes uma maneira fcil de chegar a esses campos. A propriedade um invlucro em torno
um campo privado, atravs do qual o campo acessado.
A propriedade pode definir dois mtodos, chamado get e set . o get
mtodo retornar o valor do campo, e o mtodo conjunto define o valor
do campo. Aqui a classe de carro com propriedades:
class Car
{
private string make;
// Store fazer como tipo de cadeia
private string modelo;
// Modelo de loja como tipo de cadeia
private int ano;
// Ano loja como tipo int
private string de cor;
// Cor loja como tipo de cadeia
Cadeia pblica Marca
{
obter { return este .make; }
set { este .make = valor ; }
}
Cadeia pblica Modelo
{
obter { return este .model; }
set { este .model = valor ; }
}
public int Ano
{
obter { return este .ano; }
set { este .ano = valor ; }
}
Cadeia pblica Cor
{
obter { return este .Color; }
set { este .Color = valor ; }

}
pblica Car () { / * construtor * / }
public void start () { / * cdigo para ligar o carro * / }
public void Stop () { / * cdigo para parar o carro * / }
public void Acelerar () { / * cdigo para a acelerao * / }
}
Cdigo Bloco 10 - classe Car usando propriedades
SimplyPut, propriedades tornam o acesso campos de dados em C # muito mais
elegante. Em uma nota final, tanto o conjunto e obter as funes da propriedade
pode ter lgica complexa antes de definir ou obter os dados.
page 36
Unity 3D - Jogo de Programao Intro
22
passagem de mensagens
Mensagens, tambm conhecidas como interfaces, descrever a comunicao
entre objetos usando suas interfaces acessveis. interfaces de mensagens
oferecer dois tipos importantes de proteo. Em primeiro lugar, eles protegem um objeto de
componentes internos de serem corrompidos por outros objetos. Se outro objectos tinha acesso direto a variveis de um objeto e mtodos internos,
eventualmente, um desses outros objetos iria lidar com uma in- varivel
tamente ou chamar o mtodo errado e danificar o objeto. Um objeto
protege-se contra esse tipo de erro, ocultando suas variveis e interna
mtodos por trs de sua interface de mensagem.
O segundo e menos bvio tipo de proteo trabalha no oposto
direo local, ocultando sua varivel e mtodos internos, um objeto
protege outros objectos de acordo com a sua estrutura interna. por exemamplo eles so poupados ter de manter o controle do nome de cada varivel, a
tipo de informao que contm, a quantidade de espao que ocupa no armazenamento
idade, e uma srie de outros detalhes que iria complicar todo o seu
procedimentos de acesso e as variveis do objeto. Com o encapsulamento, um
objeto s precisa saber como pedir outro objeto para obter informaes.
Todos os detalhes sobre a forma como a informao armazenada esto bem escondido fora
de viso por trs da interface mensagem.
H trs maneiras de passar mensagens em C #: mtodos , propriedades
e eventos . A propriedade pode ser definido em uma classe para permitir que objetos dessa
escreva para anunciar e permitir a alterao de informaes de estado, tais como
PartidaNoMotor propriedade. Os mtodos podem ser fornecidos para que outros objectos
pode solicitar um processo a ser realizada por um objeto, como acelermetros
comeu () mtodo. Os eventos podem ser definidos de um objecto poder aumentar em resposta
a uma ao interna. Outros objetos podem inscrever-se a estes para que eles
pode reagir a um evento ocorrido. Um exemplo poderia ser, por coliso
deteco no mbito do motor Unity.
Abstrao
A classe de carro descrito no nosso exemplo um exemplo de abstraco
o. Abstrao o processo de representar verses simplificadas de
Objetos do mundo real em suas classes e objeto. A classe carro no
page 37
Vah Karamian
23
descrever todos os detalhes possveis de um carro, apenas as partes relevantes para a

sistema que est sendo desenvolvido. software de modelagem em torno do mundo real
objectos pode reduzir consideravelmente o tempo necessrio para compreender uma soluo e
ser capaz de desenvolver e manter o cdigo durante a vida til do sisTEM.
Composio
Os objetos podem trabalhar juntos de muitas maneiras dentro de um sistema. Em alguns
situaes, classes e objetos podem ser fortemente acoplados em conjunto para provide funcionalidade mais complexa. Isto conhecido como composio.
objetos compostos so importantes porque eles podem representar muito
mais estruturas sofisticadas do que simples objetos pode. Por exemplo, uma
aeronave consiste de asas, motores e outros componentes que esto longe
demasiado complexo para ser representado como nmeros ou strings simples.
Os objetos contidos em objetos compostos podem ser eles prprios
objetos compostos, e este assentamento pode ser realizado at ao infinito! o
principais componentes de uma aeronave, so objetos muito complexos por si
certo. Em qualquer modelo razovel de uma aeronave, cada um destes componentes
seria representada por um objecto de compsito que seria composta
objectos de ainda mais compostos, e assim por diante.
Figura 6-Avio Composite Objeto
page 38
Unity 3D - Jogo de Programao Intro
24
Uma vez que os objectos podem ser compostas por outros materiais, que podem represenenviou objetos do mundo real no nvel naturalmente pensamos sobre eles. At
, Uma estrutura profundamente aninhada complexa tal como uma aeronave pode ser tratada como
um nico, objeto unificado. E desde que o objeto complexo pode ter seu prprio
comportamento, outros objetos podem us-lo com muito pouca conscincia de sua intercomplexidade nal. Este um bom exemplo de como a tecnologia objeto pode
trazer ordem para sistemas de larga escala.
No nosso exemplo do carro, as rodas, painis, motor e etc ... pode ser
pensou em aulas individuais. Para criar a classe de carro, voc vai precisar
para conectar todos esses objetos juntos. Isto faz com que seja possvel aumentar
o complexityof definio seu carro ao longo dos anos e introduzir uma melhor
recursos e funcionalidades. O funcionamento interno de cada classe no so
importante devido ao encapsulamento como a comunicao entre o objectos ainda atravs de passar mensagens para as suas interfaces pblicas.
Herana
Herana um conceito de programao orientada a objeto interessante.
Ele permite que uma classe para ser baseada em outra, a super-classe, e herdar
toda a sua funcionalidade automaticamente. cdigo adicional pode ento ser escritos
dez para criar uma verso mais especializada da classe. Se quisssemos
melhorar nosso modelo e design, que iria criar uma nova classe chamada
Veculo. Esta nova classe ser o super-classe, ea classe carro
herdar a classe de veculo.
Hereditariedade no est limitado a um nico nvel, mas dispor descendentemente em cascata
qualquer nmero de nveis em uma hierarquia de classes. Isso faz com que a herana de um muito
mecanismo poderoso porque as classes podem ser dotado de ricos conjuntos de
capacidades simplesmente colocando-os no ramo correta de um hi-classe
erarchy. Eles vo puxar automaticamente junto toda a interface e
definies de implementao das classes acima deles na hierarquia,
definindo por si s os recursos adicionais que os tornam

nica.
page 39
Vah Karamian
25
A Figura 7-Herana Exemplo
Considere o seguinte, um sistema que representa vrios tipos de
veculos. Este sistema ir conter um veculo classe genrica, com subclasses para todos os tipos especializados. A classe de veculo ir conter o
mtodos e variveis que so relevantes para todos os veculos. As subclasses,
por sua vez, ir conter quaisquer mtodos e variveis adicionais que eram
especfico para os casos mais especializados. Isso nos ajuda a adicionar facilmente outros
tipos de veculos para a hierarquia, tais como motocicletas, helicpteros,
Barcos e etc ...
Polimorfismo
O polimorfismo a capacidade de um objeto para alterar o seu comportamento
de acordo com a forma como ele est sendo usado. Onde a classe de um objeto herda
um super-classe ou implementa uma ou mais interfaces, que podem ser referidos
para por esses nomes de classe ou de interface. Ento, se temos um mtodo que expectos um objeto do tipo veculo, a ser passado como um parmetro, podemos
passar qualquer veculo, carro, moto ou avio para esse mtodo mesmo
embora o tipo de dados pode ser tecnicamente diferentes.
Modularidade
Alm dos conceitos descritos at agora, orientadas opor-programao tambm permite maior modularidade. aulas individuais ou em
grupos de ramos pode ser pensado como um mdulo de cdigo que pode ser reusado em projeto manysoftware. Isto reduz a necessidade de re-desenvolver simfuncionalidade Ilar e, portanto, pode reduzir o tempo de desenvolvimento e custos.
pgina 40
Unity 3D - Jogo de Programao Intro
26
Esta foi uma viso geral dos conceitos presentes na objectparadigma de programao orientada. Ns no ser capaz de cobrir todos os pecado
aspecto gle do tema neste captulo, mas eu dei uma viso justa
do tema e para aqueles que esto vindo de uma cincia da computao
fundo, que deveria ser uma reviso rpida. Se esta a primeira vez que
ter visto ou ouvido a terminologia, ento espero que voc faz compreender o
ideias. Como eu estou tentando mant-lo o mais simples possvel.
Generics
Genricos permitem definir estruturas de dados de tipo seguro, sem
comprometendo-se a tipos de dados reais. Isto resulta numa significativa penho
boost mance e cdigo de maior qualidade, porque voc comea a reutilizar os dados
algoritmos de processamento sem duplicao de cdigo especficas do tipo.
Genricos permitem reutilizar o cdigo eo esforo que colocou em imple-as. Os tipos e dados internos pode mudar sem causar cdigo
inchao, independentemente de voc estiver usando tipos de valor ou de referncia.
Voc pode desenvolver, testar e implementar o seu cdigo uma vez, reutiliz-lo com qualquer
Tipo, incluindo tipos de futuros, todos com suporte de compilador e tipo de segurana.
A melhor maneira de compreend-los , provavelmente, com um exemplo simples.
O seguinte uma implementao de um com- Estrutura de Dados Stack
Generics Out:

classe pblica MyStack


{
private int index;
private ArrayList pilha;
pblica MyStack ()
{
este .STACK = new ArrayList ();
index = -1;
}
int pblica COUNT
{
obter { return este .stack.Count; }
}
public void push ( objeto de dados)
{
page 41
Vah Karamian
27
este .stack.Add (dados);
este .index ++;
}
objeto pblico pop ()
{
objeto o = este .STACK [ndice];
este .stack.RemoveAt (index);
este .index--;
devolver o;
}
public void clear ()
{
este .stack.Clear ();
este .index = -1;
}
objeto pblica espiada ()
{
devolver este .STACK [ este .index];
}
}
Cdigo Bloco 11 - Estrutura de Dados MyStack
A prxima execuo est usando Generics:
classe pblica MyStack1 <T>
{
private int index;
private Lista < T > pilha;
pblica MyStack1 ()
{
este .STACK = nova Lista < T > ();
index = -1;
}
int pblica COUNT
{

obter { return este .stack.Count; }


}
public void push ( T de dados)
{
este .stack.Add (dados);
este .index ++;
}
pblica T pop ()
{
T o = este .STACK [ndice];
page 42
Unity 3D - Jogo de Programao Intro
28
este .stack.RemoveAt (index);
este .index--;
devolver o;
}
public void clear ()
{
este .stack.Clear ();
este .index = -1;
}
objeto pblica espiada ()
{
devolver este .STACK [ este .index];
}
}
Cdigo Bloco 12 - Cdigo de exemplo Generics
A vantagem deste modelo de programao que o al- interna
gorithms e manipulao de dados permanecem os mesmos, enquanto os dados reais
tipo pode mudar de acordo com a forma como o cdigo est sendo usado.
Interfaces
Uma interface um contrato. Quando voc est criando uma interface,
voc est dizendo: "Se voc deseja fornecer essa capacidade, voc deve implementar
mento destes mtodos, fornecem estas propriedades e indexadores, e apoio
esses eventos. "O implementador da interface concorda com o contrato
e aplique os elementos necessrios. Ns no ter muito para o
detalhes da definio, mas aqui esto alguns conceitos que voc deve empresas
ficar de p:
A Interface:
Este o contrato. Por conveno, os nomes de interface comeam com um
Capital I , ento sua interface pode ter um nome como IWeapon . o
IWeapon de interface pode exigir, entre outras coisas, um explode ()
funo. Isto indica que qualquer classe que quer implementar IExplosion
muito implementar um explode () funo, mas no especifica como isso
mtodo funciona internamente. Isso at voc o designer.
page 43
Vah Karamian
29
A classe de implementao:

Esta a classe que est de acordo com o contrato descrito na intercara. Por exemplo, uma bomba pode ser uma classe que implementa IWeapon
e, portanto, implementa a explodir () funo dentro da classe com base em
o da bomba requisitos.
A classe Cliente:
O cliente chama funes na classe de implementao. Por exemplo,
voc pode ter um Battleship classe que pode ter uma variedade de IWeapon
objectos. O cliente pode esperar para ser capaz de chamar explode () em cada objeto, e embora cada objeto individual pode implementar o mtodo
de forma diferente, cada um vai faz-lo de forma adequada e sem reclamar!
Voc pode perguntar, qual a diferena entre Abstract Base de Classes e uma interface? A principal diferena que uma classe base abstrata
serve como a classe base para uma famlia de classes derivadas, e uma interface
para ser misturada com outras cadeias de herana. Isto , uma classe
pode herdar de uma nica classe pai, mas pode implementar multiinterfaces de EPP.
Alm disso, quando voc derivar de uma classe abstrata, voc deve sobremontar todos os mtodos abstratos na classe base abstrata, mas voc no faz
tem que substituir quaisquer funes no-abstrato. Voc pode simplesmente usar o
implementao que a classe base fornece. Isto chamado Im- Parcial
plementao . Interfaces no tm qualquer aplicao, ento voc deve
implementar cada funo definida na interface. Voc no pode parcialmente
implementar uma interface.
Os delegados
Na programao, que so muitas vezes confrontados com situaes onde voc
precisa executar uma ao especfica, mas voc no sabe com antecedncia
qual mtodo, ou mesmo qual objeto, voc vai querer recorrer para executar
isto. Por exemplo, voc pode querer dizer um objeto para reproduzir um ficheiro multimdia
durante a execuo, mas voc no pode saber o objeto estar jogando o
arquivo, ou se um vdeo, um arquivo de som, uma animao, ou algo
outro. Em vez de codificar um objeto de mdia jogador em particular, voc
criaria um delegado, e depois resolver esse delegado a um determinado
mtodo quando o programa executado.
page 44
Unity 3D - Jogo de Programao Intro
30
Um delegado um tipo de referncia, como os outros tipos de referncia que voc
visto neste livro, mas em vez de se referir a um objeto, um delegado se refere
a um mtodo. Isto chamado de encapsular o mtodo. Quando voc cria
o delegado, voc especificar uma assinatura de mtodo e tipo de retorno; voc pode
encapsular qualquer mtodo de correspondncia com esse delegado.
Por exemplo, suponha que voc tenha uma classe chamada MediaStorage que
voc usa para armazenar e gerenciar vrios arquivos de mdia arquivos-de udio, vdeo,
arquivos de animao; o tipo de arquivo no importa para a classe. Suponha further que voc quer esta classe para ser capaz de reproduzir os arquivos, para se certificar
eles podem ser reproduzidos com sucesso, e relatar se eles tocaram
corretamente ou no (como uma forma de testar se o arquivo vlido). o MediaStorage classe no precisa saber como playThe arquivos; ele s precisa
para receber um cdigo que indica se o arquivo reproduzido com sucesso ou no.
Voc poderia cumprir este requisito com interfaces, embora possa
no valer a pena para voc a definir uma interface totalmente nova e criar uma

instncia dele quando voc poderia usar um delegado em vez disso. Neste caso, vamos
estar testando apenas dois tipos de arquivos de mdia, por isso vamos usar delegados. Se l
foram uma ampla gama de tipos de arquivos de mdia, voc pode querer definir uma
interface apropriada.
Eventos
Os eventos so uma parte importante do modelo de programao de hoje. UMA
programa moderno apresenta a interface do usurio e espera para o usurio
tomar uma ao. O usurio pode assumir muitas aes diferentes, como
escolhendo entre opes de menu, apertar botes, atualizar campos de texto,
clicando cones, e assim por diante. Cada ao faz com que um evento a ser levantada.
Um evento o encapsulamento da ideia de que "alguma coisa aconteceu "para que o programa deve responder. Eventos e delegados so
conceitos intimamente ligados, porque a manipulao de eventos flexvel requer que
a resposta para o evento ser despachado para o manipulador de eventos apropriado.
Um manipulador de eventos tipicamente implementado em C # atravs de um delegado.
Qualquer objeto pode publicar um conjunto de eventos a que outras classes podem
se inscrever. Quando a classe publicao gera um evento, todos os assinantes so
page 45
Vah Karamian
31
notificado. Com este mecanismo, o objeto pode dizer: "Eu tenho o acompanhamento
ing coisas para notific-lo sobre a ", e outras classes pode querer assinar
-se, dizendo: "Sim, deixe-me saber quando isso acontece." Como exemplo,
fornece um manipulador de eventos para a deteco de coliso. Cada vez que um objecto
est colidindo com outro objeto, isso ainda elevado.
Eventos em C # so implementados com os delegados. A classe de publicao
define um delegado. A classe de inscrio faz duas coisas: a primeira, criaates um mtodo que corresponde assinatura do delegado, e segundo,
cria uma instncia desse tipo delegado encapsular esse mtodo.
Quando o evento gerado, os mtodos da classe de inscrio so invocados
atravs do delegado.
Aqui est um exemplo de um manipulador de eventos:
classe pblica MyEventPublisher
{
evento pblico EventHandler eventHandler;
public void Publicar ()
{
EventHandler handler = eventHandler;
se (eventHandler! = NULL )
{
manipulador ( esta , EventArgs .Empty);
}
}
}
classe pblica MyEventObserver
{
public void MyEventHandler ( objeto remetente, EventArgs args)
{
Console .WriteLine ( cadeia .format ( "Publicao: {0}" ,
remetente));
}

}
classe pblica TestEventHandler
{
static void Main ( string de args [])
{
MyEventPublisher publisher = new MyEventPublisher ();
page 46
Unity 3D - Jogo de Programao Intro
32
MyEventObserver observador = new MyEventObserver ();
publisher.eventHandler + = observer.MyEventHandler;
publisher.Publish ();
}
}
Cdigo Bloco 13 - Simples manipulador de eventos Exemplo
O exemplo acima uma forma simplista de ilustrar evento manudlers, mas no captar a estrutura necessria para a implementao.
Vamos dar uma olhada em outro exemplo. Supondo que o nosso carro de classe tem um
propriedade para combustvel . Se o nvel de combustvel desce at um certo nvel, gostaramos
para levantar um evento que notifica o utilizador que est com pouco combustvel.
O carro de classe ir publicar este evento, e a classe de usurio subscrever
a este evento para atualizar a interface do usurio e ou realizar outras tarefas.
A seguinte listagem de cdigo ir ilustrar o cenrio:
Classe pblica FuelLevelChangeEventArgs: EventArgs
{
public float fuelLevel { obter ; set interna ; }
objeto pblica OldValue { obter ; set interna ; }
objeto pblica NewValue { obter ; set interna ; }
pblicas FuelLevelChangeEventArgs ( flutuar fuelLevel, objeto oldValue, objeto newValue)
{
este .FuelLevel = fuelLevel;
este .OldValue = oldValue;
este .NewValue = newValue;
}
}
public class Car
{
private string make;
// Store fazer como tipo de cadeia
private string modelo;
// Modelo de loja como tipo de cadeia
private int ano;
// Ano loja como tipo int
private string de cor;
// Cor loja como tipo de cadeia
Cadeia pblica Marca
{
obter { return este .make; }
set { este .make = valor ; }
}

Cadeia pblica Modelo


{
obter { return este .model; }
page 47
Vah Karamian
33
set { este .model = valor ; }
}
public int Ano
{
obter { return este .ano; }
set { este .ano = valor ; }
}
Cadeia pblica Cor
{
obter { return este .Color; }
set { este .Color = valor ; }
}
private float fuelLevel;
public float FUEL_LEVEL
{
obter { return este .fuelLevel; }
conjunto
{
objeto oldValue = este .fuelLevel;
este .fuelLevel = valor ;
// Ns queremos elevar o nvel quando o combustvel
// Queda de nvel para um determinado ponto
Se ( este .fuelLevel <0.6f)
{
// Cdigo aqui para aumentar o evento
FuelLevelChanged ( esta , novo FuelLevelChangeEvenTargs ( este .fuelLevel, oldValue, valor ));
}
}
}
// delegado
delegado public void FuelLevelChangeHandler ( objeto remetente, FuelLevelChangeEventArgs de dados);
// evento
evento pblico FuelLevelChangeHandler FuelLevelChanged;
protected void OnFuelLevelChanged ( objeto remetente, FuelLevelChangeEvenTargs dados)
{
// Verificar para ver se h algum assinantes
se (FuelLevelChanged! = NULL )
{
// Chamar o evento
FuelLevelChanged ( esta , de dados);
}
}

pblica Car () { este .fuelLevel = 1.0f; }


page 48
Unity 3D - Jogo de Programao Intro
34
public void start () { / * cdigo para ligar o carro * / }
public void Stop () { / * cdigo para parar o carro * / }
public void Acelerar () { / * cdigo para a acelerao * / }
Cadeia pblica GetMake () { return este .make; }
Cadeia pblica getModel () { return este .model; }
public int GetYear () { return este .ano; }
Cadeia pblica GetColor () { return este .Color; }
public void SetMake ( cadeia make) { este .make = fazer; }
public void setModel ( cadeia modelo) { este .model = modelo; }
public void setYear ( int ano) { este .ano = ano; }
public void SetColor ( string de cor) { este .Color = cor; }
}
Cdigo Bloco 14 - Class carro com manipulador de eventos
O delegado encapsula qualquer mtodo que leva os atributos demultados, este delegado deve ser implementada por todos os assinantes. o
FuelLevelChangeEventArgs classe foi criada para ajudar a controlar o velho
valor da propriedade eo novo valor da propriedade.
Neste ponto, voc ter tido uma boa viso geral dos fundamentos
e tambm foram fornecidos com um bom p com Orientada a Objetos
terminologia. incentivada-se que o leitor faa sua prpria investigao sobre
os tpicos discutidos neste captulo.
page 49
Vah Karamian
35
Captulo 2 - Breve Introduo Unidade IDE
Viso Geral da Interface
Antes de podermos comear com qualquer um dos aspectos legais de Unity, ns
seria necessrio para obter-nos familiarizados com o ambiente. No momento
da escrita, Unity 5.3 foi o lanamento pblico mais recente. Por isso vamos
estar concentrando nossos esforos em Unity 5.3.
Figura 8-Unidade 5 Editor
Na Figura 8, voc vai ver um projeto vazio Unidade 5. Se este for o
primeira vez que voc estiver executando Unidade 5, o IDE pode apresentar uma ligeira difeconfigurao ent. Ou seja, a sua viso pode ser um pouco diferente, ento
o que voc v na Figura 8. Eu gosto de configurar o meu IDE com o con- mostrado
figurao porque torna mais fcil para mim para executar as tarefas que
Estou mais interessado.
Observe tambm, que eu ter quebrado o IDE em cinco de trabalho principal
reas ING. (1) Cena Janela, (2) Jogo Janela, (3) Inspector
Janela, (4) Hierarquia janela, e (5) a janela Project. Esses so
as principais reas do IDE que voc estar utilizando para os seus projectos.
pgina 50
Unity 3D - Jogo de Programao Intro
36
No momento, como voc pode ver, o IDE bastante desinteressante.

Isso porque no temos nada de interessante acontecendo no designatrio, apenas uma tela em branco espera de suas idias criativas! Vamos
obter uma melhor compreenso do que cada uma dessas regies ser usado
em um nut-shell:
cena Vista
The Scene View seu sandbox interativo. Voc usar o
Cena View para selecionar e posicionar seus GameObjects. estes inclui
o jogador, a cmera, seus inimigos, e tudo o que ser
usado para gerar o seu nvel. Manobra e manipulao de objetos
dentro Scene View so algumas das funes mais importantes no
Unidade, por isso importante para aprender a realiz-las de forma eficiente
caminho. medida que avanamos ao longo dos exemplos, sero fornecidos mais dicas para improvar e aumentar a produtividade.
jogo Vista
O jogo de exibio processado a partir da Cmara (s) no seu jogo. isto
representante de seu jogo final, publicado. Voc vai precisar usar
uma ou mais cmeras para controlar o que o jogador v realmente quando eles
est jogando o seu jogo. Voc tambm pode mudar rapidamente a proporo de aspecto
a janela do jogo de exibio para ver rapidamente como o jogo vai olhar para
diferentes resolues e tamanhos de tela. Uma outra grande caracterstica do
Jogo Vista da janela que voc pode realmente obter o Rendering estatstiques que uma grande utilidade para verificar o desempenho do seu jogo.
Estes dados podem ento ser utilizados para optimizar o desempenho para ilustraes
cenas mais complexas.
o Inspector
A janela Inspetor exibe informaes detalhadas sobre o seu
atualmente selecionado GameObject e todos os componentes ligados e
suas propriedades. Dentro da janela Inspector, voc pode modificar o
funcionalidade do GameObjects em sua cena. Qualquer propriedade que visualizado
jogado no Inspector pode ser diretamente modificado. Isto inclui roteiro
varivel. Voc tambm pode usar o Inspector para alterar as propriedades para ver o
resultado real durante a execuo! O Inspector outra parte da Unidade
page 51
Vah Karamian
37
IDE que voc precisa para obter-se muito familiarizado. Voc ser spending maioria de seu tempo na Scene View, a janela Inspector, e
seus scripts.
Janela hierarquia
A Hierarquia contm todos os GameObject na cena atual.
Alguns destes so exemplos diretos de arquivos de recursos, como modelos 3D e
outros so exemplos de Prefabs
2
. A Janela Hierarquia tambm ir descartar
jogar o relacionamento pai-filho de todos os GameObjects no
Janela hierarquia. basicamente uma exibio ao vivo de todos os existentes
GameObject em sua cena.
Janela de projeto
A janela Projeto onde seus ativos do projeto so exibidos.
Este um relacionamento um-para-um para o sistema de arquivo real, onde o
arquivos de projeto esto sendo salvas em sua mquina local. tudo a partir de

Jogo Objectos, scripts, texturas, modelos, udio, vdeo e etc ... Ser
ser acessvel e conseguiu nesta janela. O painel esquerdo da
navegador mostra a estrutura de pastas do projeto como uma lista hierrquica.
Acima da lista de estrutura de projeto uma seo Favoritos onde voc pode
manter os itens utilizados com frequncia para facilitar o acesso. Voc pode arrastar itens de
a lista de estrutura do projeto para os seus favoritos e tambm salvar consultas de pesquisa
h. Isso vai ser til em grandes projetos com centenas ou milhares
de GameObjects.
Como voc pode ver, Unidade tem feito um trabalho maravilhoso de criar um IDE
que fcil de usar e de acesso de ambos os designers e desenvolvedores.
H outros pontos de vista e janelas que oferecem mais recursos e
funes. simplesmente impossvel cobri-los todos em uma sesso. eu tenho
fornecido com o melhor lugar para comear, e cada leitor
deve realizar sua prpria iniciativa e mergulhar mais fundo com base na sua
juros e profisso. Neste livro, so maioritariamente inclinado para o
lado a programao do design de jogos e desenvolvimento. Tenha em mente que
o IDE muito poderoso e tem mais recursos que ir abranger mais tarde
no livro. Mas, por agora, vamos ficar com o bsico.
2
objetos personalizados que so feitas pelo usurio.
page 52
Unity 3D - Jogo de Programao Intro
38
Criando Nosso primeiro objeto do jogo
Unity 3D no um software de modelagem 3D, ento no espere para criar
modelos sofisticados, utilizando Unity 3D. Unity 3D um pri- Game Engine
Marily, que tambm lhe proporciona alguma flexibilidade sobre como modificar e
ou a criao de contedo 3D simples! Para sua modelagem 3D precisa, voc vai
precisa trabalhar com um software como o 3D Studio Max, Maya, Rhino e
etc ... Generallyspeaking, seus modelos sero criados bya 3D Modeler
e Designer e voc vai import-los e us-los dentro de seu jogo.
Por padro, existem vrias primitivas que podem ser criados a partir de
a Caixa. Estes so o Cubo primitiva, a Esfera primitivo, o Cap
sule primitivo, o cilindro primitivo, o primitivo Plane eo Quad
primitivo. Para o propsito desta demonstrao que ir colocar um cubo
primitiva na cena.
NOTA: O processo de criar e modificar qualquer tipo primitivo
o mesmo. Na verdade, a modificao, na medida em que a transformao concausa a mesma para cada Object Game.
Figura 9-Cube Primitive
A fim de criar um cubo primitivo, a partir do menu principal, selecione
GameObject-> 3D Objeto-> Cube. Esta aco ir resultar na colocao de um
cubo em sua cena ativa. Antes de prosseguir, vamos em frente
page 53
Vah Karamian
39
e tambm salvar a nossa cena. Para salvar a cena, a partir do menu principal, selecione
Arquivo-> Salvar Cena ... Unity 3D ir pedir-lhe para guardar a sua cena em
a pasta do projeto na pasta Assets. Faa uma nova pasta chamada
cenas, e depois salvar sua cena dentro desta pasta e nome-la

CH1EX1.
O objetivo deste ficar claro mais tarde, quando comeamos a entrar em
cenrios mais complexos. Assim como qualquer outro projeto que voc tem compreenso
intervindo anteriormente, voc precisa ter algum tipo de estrutura e
organizao, ento porque no comear a faz-lo desde o incio?
Se voc seguiu as instrues que voc deve ter um semelhante
olhando IDE como na Figura 9 . Observe como o Editor de Unidade tem vindo a
vida agora.
1. Ns temos nosso cubo primitivo colocado na Cena janela.
2. A Hierarquia janela est exibindo todo o jogo Obserjectos presentes em nossa cena.
3. O Jogo janela est exibindo o cubo atravs dos olhos
da cmara.
4. O Inspector janela est exibindo todos os componentes
e as propriedades que esto ligados ao Game Cube Obserjeto.
5. O Projeto janela est exibindo todos os ativos que temos
no nosso projeto at agora, que no momento apenas a cena
que temos guardado.
Tome um momento para estudar tudo o que voc v na tela. Vejaing na janela do Inspector, voc pode ver que h um monte de
informao que est sendo exibido para o cubo selecionado.
Temos vrios componentes ligados ao cubo primitivo pelos defalha. Estes so os Transform, filtro de rede, Box Collider, Malha
Renderizador e um material padro ligado ao GameObject cubo.
page 54
Unity 3D - Jogo de Programao Intro
40
Figura 10 Inspector Janela
Tomar um olhar mais atento ao Injanela de Spector na Figura 10, podemos
veja sete regies diferentes.
Regio 1 contm as propriedades
para o nome do GameObject, o
Tag, ea camada. Vamos entrar em
os detalhes mais adiante.
Regies de 2 a 6 so a difeferentes componentes que tenham sido
ligado ao GameObject.
Transformar componentes
que armazena a posio, a rotao e
escala do GameObject.
O filtro de rede, definindo a
malha do cubo.
Os componentes da caixa Collider.
Este utilizado para a deteco de coliso.
O componente de malha Prestados
detalhando como a malha deve ser Renderada.
O componente padro de materiais
que o material usado para processar

nosso cubo.
Regio 7 tem um Add Component
funo que pode ser usado para adicionar mais
componentes para o GameObject
Tomando uma olhada nas informaes Transform, vemos que o cubo
posio, a rotao e a escala so representados pela propriedade de transformar
que composto por trs objetos Vector3D. Neste caso, o cubo
GameObject colocada na posio (0,0,0) representando o (x, y, z) denao
coorde- respectivamente. O vector de rotao do cubo de (0,0,0) sobre o
(X, y, z) do eixo. E o vector escala tambm definida para (1,1,1) sobre o (, y, x z) do eixo.
pgina 55
Vah Karamian
41
Figura 11-Transform Tools
Para comear a fazer quaisquer alteraes propriedade transform do cubo
GameObject, precisamos estar familiarizado com as ferramentas de transformao localizadas em
a parte superior da unidade 3D IDE como mostrado na Figura 11:
1. D-lhe a capacidade de posicionar o objeto em seu x, y e z
eixo na cena.
2. D-lhe a capacidade para girar o objeto em seu x, y e z
eixo na cena.
3. D-lhe a capacidade de dimensionar o objeto em seu x, y e z
eixo na cena.
Quando voc seleciona o cubo e escolher qualquer uma das ferramentas de transformao,
voc ter os seguintes modificadores na janela de cena:
Figura 12-Posio
Figura 13 Rotao
Figura 14 Escala
Usando essas ferramentas, voc pode transformar o GameObject selecionado na
qualquer forma que ir satisfazer suas necessidades. A melhor maneira de comear uma sensao
para
-los tentar-los. Outra maneira de modificar o GameObject de
propriedades de transformao, introduzindo directamente os valores para cada nu- parte
merically atravs da janela do Inspector. Eu geralmente acham mais fcil
fazer o posicionamento, rotao e escala de meus GameObjects atravs
a vista da cena, e depois afinar-los atravs da entrada numrica
campos na janela Inspector.
pgina 56
Unity 3D - Jogo de Programao Intro
42
Os componentes prximos representando o filtro de malha e malha Renderer ser discutido mais tarde nos captulos. A nica coisa que voc deve
estar ciente de que estes componentes so a representao real de
o wireframe ea forma como o GameObject vai ser processado no
cena. Tambm vamos discutir o componente Collider em captulos posteriores
quando estamos construindo nossas demos de jogos. Por enquanto voc s deve ser
ciente de que aceleradores so usados para qualquer deteco de coliso, e eles so
muito importante para entender e configurar corretamente. Especialmente em
modelos mais complexos.
O componente de material usado para definir o tipo de material que

vai ser aplicada ao GameObject seleccionado. Os materiais so utilizados em conjuno com malha de processadores, sistemas de partculas e outros renderizao
componentes. Eles desempenham um papel essencial na definio de como o objeto
exibida. As propriedades que um material do inspector da janela apresenta
so determinados pela Shader que usa o material. Um shader um espetipo cializados de programa grfico que determina a textura e
informaes de iluminao so combinados para gerar os pixels do rendeu
objeto na tela. Ns no estaremos cobrindo shaders neste livro, pois no
nosso tema principal e h muito mais adequado livros para discutir e
cobrir o tema.
Figura 15-New Material nomes CH1EX1MAT
page 57
Vah Karamian
43
Por padro, cada primitiva que voc criar tero a ma- cinza
terial definido pela Unidade atribudo a ele. Voc pode facilmente criar um novo
materiais, selecionando Assets-> Create-> material a partir do menu principal,
isso vai colocar um novo objeto material na pasta selecionada. Alternativamente,
voc tambm pode criar um material clicando com o boto direito na janela Project
e selecionando Create-> Matria. Em ambos os casos, voc deve se certificar
voc est na pasta correta antes de executar essas operaes.
Vamos criar uma nova pasta chamada materiais Sob os bens e
vamos criar um material chamado CH1EX1MAT clicando com o boto direito sobre o
pasta de material e selecionando criar material. D uma olhada na Figura 15
se voc tiver feito tudo corretamente, voc deve estar vendo re- semelhante
sultados.
Como voc pode ver, h um monte de propriedades associada ao
materiais como mostrado na janela Inspetor. Por agora, gostaramos
para mudar apenas a Albedo propriedade para ser de cor verde, para fazer isso, selecione
o selector de cor na janela Inspetor para a propriedade Albedo e
selecione a cor verde. Voc pode selecionar a cor verde movendo
o mouse na janela do seletor de cores ou digite o numrico real
valores no campo RGB. Pus o meu valor para a seguinte: R = 0;
G = 255; B = 0, e Alpha a 255 bem. Para aplicar o recm-criado
material a nosso cubo, basta arrastar e solt-lo para o cubo GameObjeto dentro de nossa cena. Agora v em frente e selecione o cubo GameObject
e voc vai notar as mudanas, como mostrado na Figura 16.
page 58
Unity 3D - Jogo de Programao Intro
44
Figura 16 Aplicando o material CH1EX1MAT ao cubo GameObject
Como mencionado anteriormente, este livro mais concentrado na programao parte do desenvolvimento do jogo. Por isso no vamos aprofundar demais
tanto em grficos tpico relacionado da perspectiva de um designer.
Ento, ns olhamos o aspecto mais bsico de qualquer GameObject de
propriedades. Vamos em frente e criar alguns dos outros tipos primitivos
para obter uma sensao de-los e tambm praticar um pouco do design trans- tempo
formao dos GameObjects. Antes de seguir em frente com que excersise,
h um mais importante recurso de tempo de design que gostaria de
chamar a sua ateno.

Um item mais importante em relao a janela a cena a capacidade


a olhar para o projeto de design cena ou nvel de diferentes pontos de vista.
A fim de conseguir isso, voc precisar ter o mouse na cena
janela e mantendo a tecla Alt
3
para baixo, na janela de cena que voc
vai notar que o cone do mouse mudou para o cone do olho, agora
voc pode clicar em e mova o mouse para mudar o ponto de vista no deassinar tempo na janela de cena. Isso ir ajud-lo a rodar dentro do
cena. Para zoom in e out voc pode usar o boto do meio do mouse. Se vocs
ter usado outras ferramentas de modelagem 3D, a funo funciona de forma semelhante.
3
Para usurios de Mac, voc precisar usar a tecla de comando.
pgina 59
Vah Karamian
45
V em frente e aumentar um pouco fora da vista de cena para que voc possa ver um
rea maior para brincar. Em seguida v em frente e criar outro cubo
GameObject. Por defeito, cada GameObject ser colocado na origem
(0,0,0). Vamos fazer algumas modificaes para a transformao do recm
criado cubo. Observe tambm que o novo GameObject Cube nomeado Cube
(1), para que voc mude o nome do recm-criado GameObjeto, selecione-o e a partir da janela Inspector mudar o nome do objeto para
CUBE2 . Voc tambm pode renomear um GameObject da Hierarquia-ganha
dow selecionando-o e clicando em uma vez ou pressionar a tecla F2. este
funciona de forma semelhante ao seu sistema de arquivos.
Vamos em frente e utilizar as ferramentas de transformao para mover CUBE2 para posicionar
o (2,0,0) e, em seguida, escala-lo para que ele seja metade do seu tamanho original. Voc
pode faz-lo seleccionando a seta vermelha que representa o eixo x, consulte
Figura 12, para arrast-lo na direo positiva ou negativa. Voc vai NoTice que objetos em movimento para locais especficos no vai ser to fcil
com a ferramenta de transformao, se voc precisa para chegar a posies muito especficas tais
como (2.33,0,0). Para este tipo de coordenadas, ser melhor usar o
Inspector Janela e directamente entrada coordena a posio.
Agora vamos expandir nossa GameObject a metade do seu tamanho. Selecione a escala
ferramenta e utilizar os indicadores, referem-se a Figura 14, para obter o tamanho da
objeto at metade do seu tamanho. Note que voc ter que fazer isso em todos 3eixo respectivamente. Como voc pode ver, dimensionar o objeto a exatamente 0,5 em
todos os trs eixos difcil! Tornar a vida fcil e usar a janela Inspetor
para entrar nos valores numricos para o vetor de escala para ser (0.5,0.5,0.5).
Uma ltima transformao e vamos ser bom com este exerccio.
Vamos em frente e gire CUBE2 por 33 graus no eixo xyz. selecionar
a ferramenta de rotao e usar os indicadores, referem-se a Figura 13, para rodar a
objeto. Se voc seguiu os passos sua tela deve se parecer com Fiure 17.
pgina 60
Unity 3D - Jogo de Programao Intro
46
Figura 17-CUBE2 posio, rotao, escala
H mais um ponto de vista que veryimportant estar familiarizado com,

e que a janela do console. Vamos olhar para a janela da consola


em mais detalhes quando comeamos a fazer a nossa programao. Isso importante
para fins de depurao, ele ir mostrar erros, avisos e outros sagem
sbios gerados pela unidade.
Neste ponto, voc deve ter uma compreenso justa do re- principal
regies no Editor de Unidade, e seu propsito. Voc tambm deve ter um
boa compreenso de como fazer suas transformaes de objetos em tempo de design.
Vamos olhar para transformao do objeto em tempo de execuo em captulo posterior.
Digite de programao C # e Unity 3D
Ao projetar um jogo ou uma simulao, voc precisa ser capaz
para manipular o seu ambiente no apenas atravs do designer, mas tambm
em tempo de execuo, de forma dinmica. Este o lugar onde voc vai ter que comear a aplicar
seus conhecimentos e habilidades de programao para dar vida ao ambiente
mento. De modo que no est ocioso. Felizmente ou infelizmente, no h
no h maneira de contornar isso!
Ento, para comear, vamos olhar para as noes bsicas de manipulao
dos objetos por meio de cdigo. Digamos que pretende rodar nosso cubo em seu
pgina 61
Vah Karamian
47
Y-Axis quando criar ou executar nossa aplicao. H vrias etapas
voc ter de tomar:
1. Voc precisar criar um script C #
2. No script C # voc precisar escrever o cdigo que ser
aplicar a rotao para o objecto
3. Finalmente, voc precisar associar o script com o deObjeto do jogo desejado
Neste ponto, eu no vou discutir a estrutura e organizao
o do seu projeto e sistema de arquivos para o seu projeto. Discutiremos
isso nos prximos captulos medida que comear a construir o nosso conhecimento ao longo
o livro.
Para que voc para criar um script C # no seu projeto, dentro do
Janela de Projeto, clique direito para obter o seu menu de contexto, selecione Cre
ate-> C # Script. Esta ao criar um arquivo de script C # no especificada
localizao, e ir pedir-lhe para o nomear. Neste ponto, o nome que voc d
o script no um grande negcio, mas como sempre voc deve considerar a utilizao de
melhores prticas para a conveno de nomenclatura, tal como definido dentro de sua organizao
o ou a si mesmo. Em qualquer caso, eu chamo meus cubeRotate.cs script. Duplo
clique no script para abri-lo no Editor de Mono (editor padro), voc pode
alter-lo para qualquer outro editor de C # de sua escolha. O cdigo deve
algo parecido com isto:
usando UnityEngine;
usando System.Collections;
classe pblica articleRotate : MonoBehaviour {
// Use isso para inicializao
vazio Iniciar () {
}
// Update chamado uma vez por quadro
vazio Update () {
este .transform.Rotate ( novo Vector3 (0, 1, 0), 1);
}

}
pgina 62
Unity 3D - Jogo de Programao Intro
48
Algumas coisas a explicar, antes de seguir em frente. Cada script que
voc cria vontade de herdar padro de MonoBehaviour . Vamos disxingar essa classe em um momento posterior. Cada script que voc cria tambm ter
duas funes definidas como: Iniciar () e Update () .
O Start () funo ser executado apenas uma vez no incio do programa. Assim, qualquer lgica e dados initializations que voc precisa ou quer fazer
pode ser colocada na funo Iniciar ().
O Update () funo onde a maioria da magia acontece. este
a funo que chamada continuamente ao longo da vida do seu
jogo ou simulao. Esta a funo onde voc vai atualizar o seu
objetos do jogo. Em suma, a funo que ser chamado cada quadro
antes de renderizar a cena.
A linha esta .transform.Rotate ( novo Vector3 (0, 1, 0), 1); vai performar a rotao desejada estamos procurando em um determinado objeto
aplicado a. Sem entrar muito em detalhes e por trs do
cena complicao dessa funo. Podemos utilizar a funo Rodar
definido no componente transformada de nosso objeto para passar em um Vector3
objeto, o que representa a nossa (X, Y, Z), e o ngulo de rotao.
Uma vez que estamos planejando para girar sobre o eixo Y, temos que definir
nossa Vector3 como (0,1,0). A funo ir fazer todo o transporte necessrio
formaes e lidar com a computao para voc. O prximo parmetro
o ngulo de rotao, o que temos definido como 1.
Existem vrias maneiras de aplicar um script para um jogo de objeto. o
maneira mais simples seria a de arrastar e soltar o seu roteiro para o desejado
jogo de objetos em cena. Depois de ter aplicado o script, na InSpector Windows, voc vai ver que o script um componente do
cubo.
pgina 63
Vah Karamian
49
Figura 18-Script Anexado ao jogo de objetos
Quando voc aplicar este cdigo ao seu Cube e executar o seu programa, voc
notar que o seu Cube est agora girando em seu eixo Y, um grau
continuamente. Isso porque nossa lgica de rotao est no Update () funo
o, que chamado continuouslybythe motor de jogo enquanto o programa
est correndo. E cada vez, a rotao de um grau aplicada ao
Cubo de transformar componente! Da voc obter o efeito de rotao.
Publishing Construir e configuraes do leitor
Quando estiver satisfeito com a sua criao jogo, voc vai querer
realmente constru-lo para ver como ele se sente e parece na plataforma pretendida.
Uma das principais atraes e benefcios da Unidade que voc pode alvejar
um monte de plataforma diferente com praticamente a mesma base de cdigo. Sim,
haver algumas pequenas alteraes de uma plataforma para o prximo, este
esperado devido aos fatores de forma diferentes entre os diferentes plataforma
formas. A implantao PC muito diferente, em seguida, uma implantao Web, em seguida,
uma implantao Mobile. arquitetura diferente, uma quantidade diferente de re-

fontes e diferentes resolues e tipos de entrada! Por agora voc pode apenas
d uma olhada nas opes de implantao disponveis para voc, selecionando Arquivo> Construir configuraes ... Voc ter diferentes opes com base na sua liincenso.
pgina 64
pgina 65
Vah Karamian
51
Captulo 3 - objetos do jogo e Componentes
O que um GameObject?
GameObjects so o conceito mais importante na Unidade. muito
importante entender o que um GameObject . Cada objeto em seu
jogo um GameObject. Pense em um GameObject como um recipiente vazio
que pode conter diferentes componentes
4
. Estes componentes so ento utilizados
para implementar a funcionalidade do GameObject. Dependendo de quais
tipo de objeto que voc deseja criar, voc ir adicionar diferentes combinaes
de componentes para o GameObject.
No Captulo 2 - Breve Introduo Unidade IDE, se voc se lembra de
a janela Inspector , quando criou o primitivo Cube GameObjeto, todos os pr-definidos componentes que compem o que ns vemos como o
Cube em nossos Ver Cena . Como um lembrete, tivemos a seguinte Componentes ligados ao GameObject Cube:
1. Nome
2. Tag
3. Camada
4. Transform
5. filtro de rede
6. Box Collider
7. malha Renderer
8. material
Cada GameObject ter os 3 primeiros atributos e da Transformulrio Componentes ligado a ele. Isto obrigatrio. a Transform
Componente um dos componentes mais importantes. Ele define o
posio, rotao e escala de GameObject no mundo do jogo.
Uma nota importante sobre a propriedade Tag. Voc vai definir um Tag
palavra para ligar, ou mais precisamente identificar, um ou mais GameObjects. Para
4
Os componentes so as porcas e parafusos de objetos e comportamentos em um jogo. Eles so os
peas funcionais de cada GameObject.
pgina 66
Unity 3D - Jogo de Programao Intro
52
exemplo, voc vai ter um Tag definido que ser associado com voc
personagem do jogador, voc vai ter um Tag definido que ser associado
com os seus inimigos e assim por diante. uma outra maneira de identificar e consulta
GameObjects em sua cena durante a execuo.
importante tirar desta seo que um GameObject

um recipiente para componentes, que em troca definir o que GameObjeto ser semelhante e como ele ir se comportar. Saltar um pouco frente,
at mesmo os programas que escrevemos esto ligados como componentes para a
GameObject para dar-lhe as funes e recursos avanados.
Adicionando e componentes de edio
Voc pode adicionar componentes ao GameObject selecionados atravs do
Menu de componentes ou a adicionar o componente boto no Inspetor Window . H um monte de componentes pr-definidos fora da caixa
j que vm com o Unity. Ns no ser capaz de entrar em todo o
componentes, mas vamos dar uma olhada em alguns dos mais utilizados e
vai deixar o leitor fazer a sua prpria investigao.
Voc pode anexar qualquer nmero ou combinao de componentes para um
GameObject nica. Alguns componentes funcionam melhor em combinao com
outras. Por exemplo, o corpo rgido funciona com qualquer LHC . o
Corpo rgido controlar a transformar atravs da fsica NVIDIA PhysX
motor, e o LHC permite que o corpo rgido de colidir e interagir
com outros Colliders. Consulte a documentao da unidade para saber mais
sobre cada tipo diferente de componente que est disponvel fora da caixa.
Um dos grandes aspectos dos componentes a flexibilidade. Quando voc
anexar um componente a um GameObject, existem diferentes propriedades
O componente que pode ser ajustado no editor enquanto concepo de um
jogo, ou por scripts durante a execuo do jogo. Existem dois tipos principais
de Propriedades:
Valores - propriedades de valor pode ser ajustado atravs do designatrio ou em tempo de execuo. Eles podem ser de qualquer tipo de dados.
Referncias - propriedades de referncia so como ponteiros para outras
GameObjects, udio, scripts, materiais, pr-fabricados, e etc ...
pgina 67
Vah Karamian
53
Figura 19 - Tipos de propriedade, referncia e valor
Os componentes podem incluir referncias a qualquer outro tipo de Componentes, GameObjects, ou bens. Na Figura 19, voc pode ver um exemplo de
ambos tipos de referncia de propriedade e tipos de propriedade valor.
Scripts como componentes
Quando voc cria um script e anex-lo a um GameObject, o script
aparece em Inspector Janela do GameObject como um componente. este
porque os scripts tornam-se componentes quando eles so salvos. em logia
termos tc-, um script compila como um tipo de componente, e tratada
como qualquer outro componente do motor Unity.
pgina 68
Unity 3D - Jogo de Programao Intro
54
Basicamente um script um componente que voc mesmo cria. Tu es
o autor define os membros para ser exposto ao inspector, eo
componente / script ir executar a funcionalidade projetada.
Em outras palavras, cada um de seus scripts uma classe nica, e como
discutido em Conceitos de programao orientada a objetos, a sua defi- classe
definio vai ditar como seu componente ir se comportar no momento da concepo, e
em tempo de execuo. Os campos de dados que tm um pblico modificador de acesso ser

disponvel na janela Inspetor para edio.


Figura 20 - Propriedades de Classe Car
No entanto, na Unidade para expor as propriedades, voc vai precisar para provide a seguinte declarao sobre cada campo:
[SerializeField]
private string make;
// Store fazer como tipo de cadeia
[SerializeField]
private string modelo;
// Modelo de loja como tipo de cadeia
[SerializeField]
private int ano;
// Ano loja como tipo int
[SerializeField]
private string de cor;
// Cor loja como tipo de cadeia
Cdigo Bloco 15 - SerializeField para Inspector Janela
Esta a maneira mais fcil de expor os campos privados de uma classe na
Janela Inspector .
GameObjets estticos
Muitas otimizaes precisa de saber se um objeto pode se mover durante
jogabilidade. Informaes sobre um esttico, no-movimento, objeto muitas vezes pode ser
pr-calculado no editor assumindo que ele no ser invalidada por uma
pgina 69
Vah Karamian
55
mudana de posio do objeto. Isso vai ajudar com a prestao e
taxa de quadros de seu jogo. Tais tcnicas so utilizadas para a optimizao e
uma boa idia para aprender sobre os benefcios de-los como voc projetar e
desenvolver o seu jogo. Para identificar um GameObject como esttico ou no-esttico ,
h uma caixa de seleo na janela Inspetor . Se a opo for marcada,
em seguida, a Unidade informar vrios sistemas internos que o objeto no ser
mover. A idia aqui melhoria de desempenho! estes intersistemas finais so as seguintes:
1. Global Illumination : Iluminao avanada para uma cena.
2. Occluder e Occludee : otimizao de renderizao baseada em
a visibilidade de objetos a partir de posies de cmera especficos.
3. dosagem : Rendio de otimizao que combina vrios objectos em um objeto maior.
4. Navigation : o sistema que permite que os personagens para negociar
obstculos na cena.
5. Off-Mesh Ligaes : conexes feitas pelo Navigation sisTEM entre reas descontnuas da cena.
6. Reflexo Probe : captura uma vista esfrica da sua surround
Ings em todas as direes.
iluminao global
Global Illumination um sistema que modelos como a luz devolvida
off de superfcies para outras superfcies, luz indireta, ao invs de ser limiITED apenas a luz que atinge uma superfcie diretamente de uma fonte de luz, direta
leve. Modelagem de luz indireta permite efeitos que tornam o virtual
mundo parecer mais realista e conectado, uma vez objeto de afectar cada

aparncia do outro. Um exemplo seria quando a luz solar bate no cho


na abertura de um caso e salta ao redor dentro para que as partes internas
o caso so iluminados tambm.
Tradicionalmente, os jogos de vdeo e outros em tempo real grficos aplicao
es foram limitados a iluminao directa, porque os clculos
necessrio para a iluminao indireta eram demasiado lento para que eles s poderiam ser usados
em situao de no-tempo real, como gerado por computador filmes. Um caminho para
jogos de contornar esta limitao calcular apenas a luz indireta
para objetos e superfcies que so conhecidos de antemo que no tm moo, objeto esttico.
pgina 70
Unity 3D - Jogo de Programao Intro
56
Isso ajudar a pr-calcular o efeito de iluminao indireta. apoio Unity
portos esta tcnica, chamada cozidas lightmaps
5
. Alm indirecta
luz, cozidos lightmaps, tambm tirar proveito da maior computao
tempo disponvel para gerar mais realistas sombras suaves de luzes de rea
e luz indirecta do que o que pode normalmente ser conseguida em tempo real com
tcnicas.
ocluso Culling
Ocluso Culling um recurso que desativa o processamento de objetos
quando eles no esto actualmente visto pela cmera, porque eles so obscured (ocluda) byother objectos. Isso no acontece automaticamente,
j que a maioria dos objetos de tempo mais distante longe da cmera so atrados
primeiro e mais estreitos os objetos so desenhados por cima. Isto diferente de
Frustum Culling , como Frustum Culling nica desativa os representantes para
objetos que esto fora da rea de viso da cmera, mas no desativar
nada escondido da vista por overdraw.
O processo de ocluso abate ir percorrer a cena usando um
cmara virtual para construir uma hierarquia de conjuntos de objectos potencialmente visveis.
Estes so os dados que usado por cada cmera em tempo de execuo para determinar
o que visvel eo que no . Isso reduz o nmero de chamadas sorteio
e aumenta o desempenho do jogo.
batching
Para desenhar um objeto na tela, motor Unity tem de emitir um empate
chamada para a API grfica
6
. Desenhe chamadas so muitas vezes caros, com o
API grfica fazendo um trabalho significativo para cada chamada de desenho, fazendo com que perdesempenho sobrecarga no lado do CPU.
Unidade usa lotes esttica para resolver esta questo. O objetivo da esttica
dosagem de reagrupar o maior nmero de malhas em menos buffers para obter melhores perdesempenho, tornando gigante malhas em vez de um monte de pequenas malhas
o que ineficiente.
5
O processo no qual a luz indirecta pr-calculada e armazenada.
6
OpenGL ou Direct3D

pgina 71
Vah Karamian
57
Navegao
O sistema de navegao permite criar personagens que podem intelligently mover no mundo do jogo. Os usos do sistema de navegao
navegao malhas para raciocinar sobre o meio ambiente. a navegao
malhas so criados automaticamente de sua Cena Geometry .
sistema Unity NavMesh consiste das seguintes peas:
Figura 21 - Componentes NavMesh
1. NavMesh : uma estrutura de dados que descreve o tranquilas
superfcies do mundo do jogo e permite encontrar o caminho de
um local de percorrer para outro no mundo do jogo. este
estrutura de dados construdo, de forma automtica a partir do nvel de geomeexperimentar.
2. Agente NavMesh : um componente ajudando-o a criar characters que evitam uns aos outros enquanto se move para a sua
pgina 72
Unity 3D - Jogo de Programao Intro
58
objetivo. Agentes razo sobre o mundo do jogo usando o
NavMesh e eles sabem como evitar um ao outro, bem como
obstculos em movimento.
3. Off-Mesh Ligao : um componente que lhe permite incorporar
atalhos de navegao, que no podem ser representados usando um
superfcie tranquilas. Por exemplo, saltando sobre uma vala ou um
cerca, ou abrir uma porta antes de caminhar atravs dele.
4. NavMesh obstculo : um componente que lhe permite deescriba mover obstculos o agente deve evitar ao
navegar no mundo. Um barril ou uma grade controlado pelo
sistema de fsica um bom exemplo de um obstculo.
Off-Mesh Ligaes
As conexes entre os polgonos NavMesh so descritos USing ligaes dentro do sistema pathfinding. s vezes necessrio deixar
o agente de navegar atravs de locais que no so de percorrer, por exemplo,
salta sobre uma cerca, ou atravessando atravs de uma porta fechada. estes casos
precisa saber o local da ao. Estas aces podem ser anotada
usando Off-Mesh links, que contam a pathfinder que existe uma rota
atravs do link especificado. Este link pode ser acessado quando mais tarde acompanhamento
ing o caminho, ea ao especial pode ser executado.
Probe reflexo
Uma sonda de reflexo como uma cmera que captura uma vista esfrica
de seus arredores em todas as direes. A imagem capturada ento armazenado
num Cubemap
7
que pode ser utilizado por objectos com materiais reflectores.
sondas de reflexo sevral pode ser utilizado num determinado local e objectos podem
ser configurado para usar o Cubemap produzido pela sonda mais prxima.
filmes e animaes CG comumente apresentam reflexo altamente realista
es, que so importantes para dar um senso de conexo entre
os objetos na cena. A preciso dessas reflexes vem com

um alto custo em tempo de processador. Este um problema, uma vez que limita severamente a
O uso de objetos reflexivos em jogos em tempo real. Tradicionalmente, os jogos tm
7
A Cubemap uma coleo de seis texturas quadrados que representam as reflexes sobre uma
meio Ambiente.
pgina 73
Vah Karamian
59
usaram uma tcnica chamada mapeamento de reflexo para simular os reflexos de
objetos, mantendo a carga de processamento a um nvel aceitvel.
Unidade melhora no mapeamento bsico reflexo atravs do uso de ReSondas de flexo, que permitem que o meio ambiente visual para ser em amostras
pontos estratgicos na cena. Geralmente, voc deve coloc-los em todos os
ponto em que o aparecimento de um objecto reflector mudaria perceptvel
habilmente. Quando um objecto reflector passa perto de uma sonda, a reflexo
amostras pela sonda pode ser usado para mapa de reflexo do objecto. Quando
vrias sondas esto nas proximidades, Unidade pode interpolar entre eles para permitir
por mudanas graduais na reflexo. Como voc observar, h muitos
detalhes tcnicos e complexidades para cobrir neste livro, portanto,
encorajados que o leitor estudar os temas sobre a sua prpria, pesquisando
os detalhes adiante.
Prefabs - Conceitos e Uso
Como voc projetar e desenvolver o seu jogo, voc estar criando muitos
GameObjects com vrios componentes e propriedades. Alguns dos
GameObjects que voc estar criando vo ser bastante complexo.
Ao mesmo tempo, pode haver momentos em que voc vai querer duplicar
ou replicar o mesmo GameObject exata dentro da mesma cena ou em um
cena diferente.
Figura 22 - Conceito Prefab
pgina 74
Unity 3D - Jogo de Programao Intro
60
A Prefab um poderoso recurso no prazo de unidade que lhe permite
fazer uma cpia do seu GameObject e armazen-lo para uso posterior. o Prefab
age como um modelo a partir do qual voc pode criar novas instncias de objetos em
a cena. Outro poderoso recurso fornecido pelo Prefab a capacidade para editar e modificar o Prefab e automaticamente todas as instncias ativas
do Prefab ser refletido pelas ltimas atualizaes. Voc tambm pode quebrar
uma ligao entre uma instncia de uma casa pr-fabricada e do Prefab para substituir o
propriedades ou fazer alteraes especiais para que in- no-relacionada particular,
posio. Voc vai ter uma melhor caiu do que Prefabs so e por que eles so
to til em captulos posteriores.
Pai-filho do relacionamento
Unidade usa um conceito chamado de Parenting . Parentalidade um dos mais
conceitos importantes para entender quando se usa Unidade. Quando um GameObjeto um pai para outro GameObject, a Criana GameObject vai
mover, girar e dimensionar exatamente como seu pai faz. Voc pode pensar em
parentalidade como sendo a relao entre os seus braos e seu
corpo; sempre que o seu corpo se move, os braos tambm se movem junto com ele.
objetos filho tambm pode ter seus prprios filhos e etc

8
...
Para fazer qualquer GameObject o filho de outro, arraste o desejado
criana para o pai desejado na hierarquia . A criana vai herdar o
movimento e rotao de seu pai. Voc pode usar bicicleta dobrvel de um objeto pai
a seta para mostrar ou ocultar as suas crianas, se necessrio. O pai-filho
relacionamento de um GameObject representado visualmente na Hierarquia
Janela. A GameObject pode ter um pai-filho muito complexa estrutura.
8
Qualquer objeto pode ter vrios filhos, mas apenas um dos pais.
pgina 75
Vah Karamian
61
Captulo 4 - Regras e Mecnica de jogo
Conceitos bsicos de Mecnica de jogo
A atividade subjacente em jogos jogar. O jogo pode ser encontrado em todos
culturas humanas. Play oferece ensino e aprendizagem oportunidades.
As crianas pequenas vo jogar para ajud-los na prtica de habilidades para a vida. A chave
elemento em jogo a natureza de causa e efeito que refora certa
comportamentos. Para a prtica a tentativa de obter melhor em algum conjunto de habilidades.
Quando o jogo torna-se estruturas e metas, regras e aes so aprodobraram eles se transformam em jogos. No playground, simples jogo envolvendo
perseguir outras crianas se transforma em um jogo de Tag quando uma criana BE
vem "it" e o objetivo guia outra criana, a fim de fazer
ele ou ela "isso".
Essas aes fundamentais do comportamento humano encontrados no jogo
e jogos de crianas so encontrados no centro de jogos de computador
e tornar-se o conjunto de mecnica de jogo cdigo.
Procurando
A pesquisa um processo cognitivo humano bsico que envolve a percepo
o e digitalizao de um ambiente. Em jogos de computador, essa capacidade
aproveitados para fazer o olhar do leitor para uma parte especfica de informao,
item, localizao, ou personagem em um ambiente. O objectivo da
Pesquisa do jogador pode ser a de encontrar um item necessrio para avanar no jogo,
por exemplo, uma chave para abrir uma porta, ou para percorrer um labirinto para ir de
um lugar para outro.
correspondente
Matching uma atividade que faz parte do processo de pesquisa. Para o
crebro humano, identificando um objeto como sendo semelhante a outra uma simcoisa ple. Para estar procura de alguma coisa ser capaz de identificar quando
a imagem mental que voc tem da coisa que voc est procurando a mesma
coisa que voc est olhando; ou seja, eles combinam. Muitas atividades do dia-a-dia
pgina 76
Unity 3D - Jogo de Programao Intro
62
envolvem correspondentes, tais como encontrar um par de meias de marcar para a direita
PIN em um caixa eletrnico.
Em um jogo, a correspondncia usado para obter os jogadores para colocar um ou mais coisas
juntos, porque eles so pequenos pedaos de um todo, ou so os mesmos

cor ou forma ou tm outras caractersticas semelhantes. Esta ac- comum


o pode encontrar jogadores que une pea de uma mquina para torn-lo
funcionam como um todo, ou colocando as mesmas peas de cor prximas umas das outras
sobre uma grelha.
classificando
A tentativa de colocar ordem no caos um tamento humano comum
eu ou. Pessoas com casos muito extremos de exigir que tudo seja em sua
lugar pode sofrer de transtorno obsessivo compulsivo. No entanto, em
muitos casos, quando as coisas esto ordenados, a vida muito mais fcil. Quando as coisas so
em ordem e podemos contar com eles estar em ordem, ele levanta algumas das
carga cognitiva fora de fazer outras tarefas.
Jogos usam esse desejo de classificao para motivar os jogadores para organizar dois ou
mais itens de acordo com suas caractersticas, como tamanho, cor, especies, idade ou nome. Triagem pode tambm ser empregue em actividades em que
executar tarefas em ordem necessrio para completar um desafio.
chancing
dispositivos chance como morrer e o desenho de palhas para fins
de triagem, seleo e diviso so comuns entre muitas culturas,
ea prtica referenciado na literatura grega clssica como o cavalo de Tria
guerras e de antemo em artefatos egpcios.
Usando chance na tomada de deciso referido como de risco. Pesquisa
demonstrou que os tipos de riscos as pessoas tomam-tronco hoje de volta situao
es encontradas pelos nossos antepassados, incluindo a concorrncia com outros
indivduos, a concorrncia com as culturas dos outros, acasalamento, recurso alocao
o, e meio ambiente.
Nos jogos, a chance usado para determinar a probabilidade de futura sada
vem. Esta uma das aes mais antigas usadas em jogos que envolvem a
pgina 77
Vah Karamian
63
uso de dados: rolamento ou lanamentos de moeda para determinar um resultado com base em
chance. Sem algum elemento de probabilidade em que os jogadores sabiam
que o resultado de suas aes seria antes que eles fizeram eles, h
no haveria qualquer necessidade de assumir um risco. A pesquisa mostrou a maior
o risco, maior a recompensa neuroqumica.
misturando
Misturando aes envolve a combinao de objetos ou aes para produzir um resultado inatingvel de outra forma. No dia-a-dia, as pessoas
misturar os ingredientes para fazer pigmentos de alimentos, tintas para fazer novas cores, e
aes multi-tarefa para obter as tarefas concludas mais rapidamente.
Em jogos de computador, as aes podem ser combinados para permitir caracteres
para executar tarefas que no poderiam fazer com aes individuais, por exemplo,
saltar durante a execuo de saltar atravs de uma fenda no mundo do jogo ou
combinando vrias combinaes de teclas para executar movimentos especiais.
Combinando objetos do jogo para produzir outros objetos do jogo tambm um
exemplo de mistura.
Cronometragem
A sociedade humana executado por vez. Mesmo antes do advento da mechandispositivos de medio do tempo iCal, revoluo da Terra em torno do sol significava
os seres humanos eram constantemente em um horrio.
O uso de tempo num jogo de computador pode ser aplicado como um jogo

mecnico. Pode envolver a realizao de uma tarefa dentro de um certo tempo,


cronometrando uma ao, ou espera de algum evento para ocorrer. este mecanismo
usado para instigar a urgncia em situaes como corridas, seja
contra o relgio ou um oponente ou para gerar expectativa quando esperaring algo para ocorrer ou forar a pacincia em cima de um jogador que tem
que esperar para o ambiente do jogo para mudar.
O tempo pode ser usado para adicionar respeito ao longo processo de formao
um personagem com novas habilidades, adquirir novo conjunto de habilidades e assim por diante.
s vezes, isso tende a levar muitas horas e s vezes dias. Em um
jogo on-line, isso pode continuar enquanto o jogador est longe da
pgina 78
Unity 3D - Jogo de Programao Intro
64
avatar. Esta outra boa maneira de manter o jogador se envolver e trazer
-los de volta para o jogo ao longo do tempo para o progresso ainda mais.
progredindo
A vida sobre a progredir, se estar a crescer a partir de um beb a um
adulto, recebendo um diploma universitrio, ou obter uma promoo no trabalho. Humanos,
em geral, a experincia estgios em suas vidas que se correlacionam com a sua idade
e realizaes.
Jogos empregar esquema de progresso em que o jogador comea como
um noob e progride para o nvel do perito na extremidade. Ao longo desta Journey, esquemas de progresso so colocadas no lugar que dar aos jogadores uma sensao
a atingir por seus esforos.
capturar
Para capturar tomar algo que pertence a outra pessoa
atravs da fora ou de seus prprios esforos. Ao longo da histria, h uma longa
lista de tribos capturar membros de outras tribos, os exrcitos capturar cidades,
e os piratas tomando navios.
Alguns jogos incorporar este mecnico como o objectivo primordial do
jogo. A maioria dos jogos de estratgia em tempo real exigem que os jogadores capturar e prender
recursos e bases, enquanto a acumular suas foras armadas e da economia para
atacar e capturar ou destruir o adversrio. Ou pode ser to simples como
jogar capture a bandeira.
conquistando
Na mesma linha de captura a ao de conquista. enquanto que
captura mais ligada ao roubo, a conquista de cerca de suplantar ou
destruir a concorrncia. Como a captura, raas humanas tm uma longa
histria da conquista.
Suplantar um adversrio uma meta clssico jogo. No xadrez, o
objetivo obter o seu oponente em xeque-mate, tendo peas ao longo
o caminho para faz-los render.
pgina 79
Vah Karamian
65
anulao
Uma chave para a sobrevivncia humana a preveno de no gostou e inofensivo
coisas ful. Isto no inclui comer substncias venenosas, no jogando
com fogo, e olhando antes de atravessar a rua.
Alguns jogos incorporar tais mecnica, onde o jogador tem para o

evitar certas situaes e ou objetos no jogo. Por exemplo, uma veculo deve evitar bater pedestres ao descer a rua. UMA
tanque militar deve evitar as minas terrestres, enquanto em seu caminho para o dado
destino.
Em vez de dizer os jogadores que eles podem fazer, a evaso tudo sobre
mostrando-lhes o que eles no podem fazer. Isto pode ser implementado por penalidades
nalizar o jogador quando eles realizam uma ao em um ambiente de jogo
onde deveriam ter evitado.
Evitar coloca restries sobre as aes dos jogadores de tal forma que
eles devem manter em mente o que eles no podem fazer ao tentar progredir
em todo o ambiente do jogo.
Coletando
Coleta outro comportamento humano natural. No extremo,
algum que no pode controlar a coleta e deixando de lado sua recolhido
itens pode ser chamado de um coletor de lixo.
Em um ambiente de jogo, os itens esto l para ser recolhidos para UM FIM
representar ou um objectivo. Alguns itens podem ser recolhidos e colocados em um
inventrio para ser usado em um momento posterior. A mecnica de coleta muitas vezes
usado com a pesquisa.
Por exemplo, alguns jogos podem pedir ao jogador para recolher o maior nmero
moedas de ouro quanto possvel em um determinado perodo de tempo.
De um modo geral, todos os jogos de usar uma combinao de toda a base
mecnica de jogo que temos discutido. A maioria dos jogos de RPG
implementar todas as mecnicas de jogo para fazer o jogo jogar muito
mais interessante e envolvente. Obviamente, isso leva a mais complexa
pgina 80
Unity 3D - Jogo de Programao Intro
66
design de jogo e esforo sobre os game designers e desenvolvedores para implementao.
Exemplos simples da Mecnica
Nesta seo, vamos olhar para o uso e implementao da
mecnica que foram discutidos anteriormente. Os exemplos que se ir combinar um
ou mais de a mecnica para ilustrar alguns conceitos bsicos do jogo do jogo.
O jogo Batalha Naval iremos desenvolver no Captulo 6 - Criando BATtleship e Captulo 7 - Delving o Cdigo usar algum do jogo
mecnica que temos listados e descritos na seo anterior.
Os seguintes mecanismos so fceis de detectar no jogo: pesquisa,
calhante, e conquistando.
O jogador precisa procurar navio do adversrio para ser destroyed. O jogador est tendo uma chance, colocando seus navios para
o tabuleiro de jogo, da mesma forma, o jogador est tendo uma chance sempre que ele ou
ela est escolhendo um alvo a atingir. Finalmente, o objetivo do jogo
conquistar o oponente por destruir totalmente todas as suas peas do jogo.
Vamos colocar rapidamente em conjunto um novo projeto para construir e demonstrar
a implementao dos diferentes mecanismos.
Nvel 1: pesquisa; coleta; correspondncia e classificao.
Nvel 2: Chancing; mistura e temporizao
Nvel 3: progredindo; evaso; capturando e conquistar
Desenvolvimento de Nvel 1
O objetivo deste nvel para ajudar a entender e implementar o

quatro mecanismos de busca, coleta, correspondncia e classificao. Deixe-nos


comear por abordar a pesquisa e coleta de primeira. O objetivo inicial
do jogador ser para pesquisar o mundo do jogo e recolher um conjunto de obprojectos que sero ento usados para combinar e triagem.
Objectivo 1: Pesquisar e recolher objetos X, Y e Z
Objectivo 2: Organizar os objetos coletados por seu tamanho.
pgina 81
Vah Karamian
67
Acabamos de definir o nosso objectivo baseado na mecnica de jogo
descrito. Agora hora de colocar realmente em conjunto um exemplo simples para
ilustrar o conceito.
Supondo que voc tenha iniciado um novo cenrio para efeitos do presente
prtica, vamos ir em frente e criar o nosso primeiro objeto jogo, um terreno.
Para criar um terreno, voc ter de escolher:
GameObject-> 3D Objeto-> Terrain
A partir do menu principal. O tamanho padro do terreno ser muito
grande, para os fins da presente prtica, ser necessrio reduzi-lo a cerca de
50 x 50. Isso bom o suficiente para a demonstrao. Alm disso, no se esquea
que, esta o equivalente de 2,500 metros quadrados de rea! No um fcil
tarefa para preencher!
Figura 23 - Simples Terreno 50x50
Seu terreno deve ser semelhante t o Figura 23 . O cubo foi colocado
apenas para uma pista visual no tamanho do terreno. Usando o construdo em terreno
pgina 82
Unity 3D - Jogo de Programao Intro
68
ferramenta, que pode dar algumas agradveis contornos da superfcie do terreno a fim de
torn-lo mais agradvel.
Figura 24 - Snap Shot of Terrain
Ferramenta
Isto pode ser alcanado dentro do
IDE da unidade atravs da Inspeco
tor janela:
1. Levante / Baixa Terrain
2. Pintura Altura
3. suave Altura
Textura 4. pintura
5. Coloque rvores
6. Os detalhes de pintura
7. Configuraes de terreno
A finalidade de cada numerada
cone foi listado acima.
Figura 25 - Terreno projeto
pgina 83
Vah Karamian
69
Voc pode usar recursos de um a sete para modificar e moldar o
terreno. V em frente e jogar com as opes e chegar a um terreno

modelo que voc est consentimento com.


Olhando para a Figura 25 y oc pode ver que muito fcil criar interrenos ressantes com as ferramentas fornecidas para prototipagem rpida. eu sou
feliz com o mapa do terreno, agora o prximo passo seria aplicar algum
texturas e outros objetos ambientais, tais como rvores e pedras. Para
adicionar textura ao terreno, selecione Texture Dor do Inspector WinDow e aplicar a textura desejada para o terreno.
Figura 26 - Terreno com textura aplicada
Nada mau para um programador se voc me perguntar. Ento, agora ns definimos
nosso terreno, e temos de colocar alguns objetos do jogo a ser procurado
e recolhidos. Para manter os grficos simples, usaremos esfera e cubo
com a finalidade de demonstrar os conceitos. Nosso jogador ser represenressentido como uma esfera, e os nossos objetos do jogo pode ser representado por qualquer
um dos tipos de primitivas.
pgina 84
Unity 3D - Jogo de Programao Intro
70
Para a busca de objeto e coleo, podemos utilizar trs tamanhos diferentes
de cubos. Para a pesquisa, o jogador ter que encontrar todos os trs
cubos, e para a classificao, o jogador ter de empilh-los em cima de um
outro que tenha o maior cubo como a base. Isto ir lidar com o nosso Obserjectivos um e dois como listado.
Figura 27 - Busca e recolher objetos do jogo
NOTA: Existem melhores opes e ferramentas projetadas especificamente para o edifcio
terrenos e ambientes naturais complexos. Em um cenrio de vida real, voc ser mais
provvel usar uma ferramenta externa para criar o seu terreno e, em seguida, import-lo para a
Unidade de
programao.
Podemos posicionar aleatoriamente os trs cubos de diferentes tamanhos na
terreno como indicado i n Figura 2 7. No jogo que seria necessrio para ser capaz
para identificar estes objectos a partir de um certo tipo. Isto ir permitir-nos
trat-los adequadamente internamente atravs do cdigo.
pgina 85
Vah Karamian
71
Ento, aqui esto alguns requisitos que precisamos definir para atender a nossa
primeiros objetivos no jogo:
O jogador pode recolher o objeto, passando por eles ou por
clicando sobre o objeto quando esto no intervalo.
jogador ter de mover os objetos para a rea designada de modo
empilhamento.
Jogador precisa identificar os objetos a serem recolhidos.
jogador precisa recuperar dados de objeto do recolhida obprojectos para processamento posterior.
Antes de continuar com o nosso exemplo, eu gostaria de aproveitar a
tempo e introduzir alguns temas e conceitos muito importantes para que ns
ter um bom entendimento e de fundo a respeito de como Unity HanDLES a interao entre diferentes GameObjects.
Fsica para Jogos
Um motor de fsica um software de computador que fornece uma aproximao

simulao companheiro de certos sistemas fsicos, tais como corpo rgido


dinmica, deteco de coliso, dinmica de corpo macio, e dinmica de fluidos.
H geralmente dois tipos de motores de fsica, em tempo real e de alta
preciso .
Alta preciso
motores de fsica de alta preciso exigem mais poder de processamento para
calcular a fsica muito precisa e so normalmente utilizados por cientistas e
engenheiros para simulaes complexas.
Tempo real
motores de fsica em tempo real so usados em jogos de vdeo e outras formas
de computao interactiva. Eles usam clculos simplificados e dea preciso aumentou para calcular a tempo para o jogo de responder a um
taxa adequada para o jogo.
motores de jogo
Na maioria dos jogos de computador, a velocidade dos processadores e jogabilidade
so mais importantes do que a preciso da simulao. Isto conduz aos desenhadores
pgina 86
Unity 3D - Jogo de Programao Intro
72
para motores de fsica que produzem resultados em tempo real, mas que replica
fsica do mundo real apenas para casos simples e tipicamente com algum APaproxi-.
Objetos em jogos interagem com o jogador, o ambiente, e
entre si. Normalmente, a maioria dos objetos 3D em jogos so representados por dois
malhas ou formas separadas. Um destes o malhas altamente complexo
e forma detalhada visvel para o jogador no jogo, e um segundo simplified malha invisvel usado para representar o objeto para a fsica
motor, de modo que o motor de fsica pode interagir com ele.
Digite o Componente Collider
Aceleradores so usados para definir a forma de um objecto para o objectivo
de colises fsicas. O colisor no precisa necessariamente ser o
mesma forma de malha do objeto jogo. Normalmente, uma estimativa aproximada dedez mais eficiente e indistinguveis na jogabilidade.
Os aceleradores mais simples, que so tambm o menos processador de inteno
sive, so os tipos colisor primitivos: Box Collider , Sphere Collider ,
eo Collider Capsule . Ao combinar um posicionamento desses aceleradores
voc pode muito bem criar um colisor composto que mais ir satisfazer
qualquer objeto jogo para deteco de coliso.
Aceleradores podem ser adicionados a um objecto, sem uma compo- corpo rgido
nente para criar pisos, paredes e outros elementos imveis de uma cena.
Estes so referidos como esttico
9
colisores.
Gatilhos
O sistema de scripting pode detectar quando ocorrem colises e iniciar
aes usando o OnCollisionEnter () funo. No entanto, tambm podemos
usar o motor de fsica simples para detectar quando um colisor entra no
espao de outra sem a criao de uma coliso. Um colisor configurado como
um gatilho, usando o IsTrigger propriedade, no se comporta como um ob- slida
jeto e simplesmente permitir que outros aceleradores para passar. Quando um
9

colliders estticos pode interagir com aceleradores dinmicos, mas desde que eles no tm corpo
rgido,
eles no se move em resposta s colises.
pgina 87
Vah Karamian
73
colisor entra no seu espao, um gatilho ir chamar o OnTriggerEnter () funo
o em scripts do objeto gatilho.
Aes de script em Collision
Quando ocorrem colises, o motor de fsica chama funes com espenomes espe- sobre quaisquer scripts anexados aos objetos envolvidos. Voc ir
preciso implementar a lgica de cdigo nessas funes para responder
caso de coliso.
No primeiro actualizao fsica em que a coliso detectada, o OnCollisionEnter () funo chamada. Durante as atualizaes onde o contato
mantida, OnCollisionStay () funo chamada e, finalmente, OnCollisionExit () funo chamada indicando que o contato tenha sido quebrado.
Da mesma forma, aceleradores de gatilho chamar o anlogo OnTriggerEnter () funo
o, OnTriggerStay () funo ea OnTriggerExit () funes.
Interaes collider
Aceleradores de interagir umas com as outras de maneira diferente dependendo de quo
seus componentes corpo rgido foram configurados.
esttica Collider
Esta uma GameObject que tem um colisor mas nenhum corpo rgido. Esttico
aceleradores so usados para a geometria nvel que permanece sempre no mesmo
lugar e nunca se move ao redor. objetos corpo rgido de entrada ir colidir
com o colisor esttico, mas no vai mov-lo.
corpo rgido Collider
Este um GameObject com um colisor e A, no-normal de cinemtica
Corpo rgido em anexo. colliders corpo rgido so totalmente simulada pelo
motor de fsica e pode reagir a colises e foras aplicadas a partir de um
script. Eles podem colidir com outros objetos, incluindo aceleradores estticos,
e so a configurao colisor mais vulgarmente utilizado nos jogos que
usar a fsica.
Cinemtica corpo rgido Collider
Esta uma GameObject com um colisor e de um corpo rgido cinemtica
anexado, o IsKinematic propriedade do corpo rgido est habilitado. Voc
pode mover um objeto corpo rgido cinemtica de um script, modificando a sua
pgina 88
Unity 3D - Jogo de Programao Intro
74
Transformar componente, mas no vai responder a coliso e foras
como um corpo rgido no-cinemtica. rigidbodies cinemtica deve ser utilizada
para aceleradores que podem ser movidos ou com deficincia / habilitado ocasionalmente, mas
que deveria de outra forma se comportam como aceleradores estticos. O melhor exemplo para
ilustrar este conceito seria uma porta de correr. A porta deve normalmente actuar como um obstculo fsico bens, mas pode ser aberta quando
necessrio. Ao contrrio de um colisor esttico, um corpo rgido cinemtica em movimento vai
aplicar frico para outros objetos e vai "acordar" outros rigidbodies
quando fazem contato.

Corpo rgido
Um corpo rgido o principal componente que permite um comportamento fsico
para um objeto. Com um corpo rgido em anexo, o objeto ser imediatamente
responder gravidade. Se um ou mais componentes Collider tambm so adicionados,
em seguida, o objecto ser movido por colises de entrada.
Rigidbodies permitir que seus GameObjects de agir sob o controle do
motor de fsica. Isso abre a porta de entrada para colises realistas, variada
tipos de juntas, e outros comportamentos muito legal. manipulando o seu
GameObject pela adio de foras para o corpo rgido cria uma muito diferente
comportamento do que ajustar o Transform componente diretamente. Como um bom
regra geral, voc no deve manipular o corpo rgido ea Transforma da mesma GameObject, apenas um ou o outro.
articulaes
Voc pode anexar um corpo rgido para outro ou para um ponto fixo no espao
usando um componente comum. Geralmente, voc quer uma articulao para permitir que pelo
menos
alguma liberdade de movimento. Unity fornece o seguinte Junte-nente
nentes que impem restries diferentes: Dobradia conjuntas e Primavera conjuntas .
Dobradia conjunta permite a rotao em torno de um ponto e eixo especfico, enquanto
Primavera Comum mantm o objeto distante, mas permite que a distncia entre eles
esticar ligeiramente. As articulaes tambm tem outras opes que podem ser habilitados para
efeitos especficos.
pgina 89
Vah Karamian
75
dobradia Joint
Os grupos dobradia Joint dois Rigidbodies juntos, restringindo
-os a mover-se como eles so ligados por uma charneira. Melhor exemplo seria
ser uma porta, mas tambm pode ser aplicado e utilizado para modelar as cadeias, e etc ..
Uma nica dobradia Misto deve ser aplicado a uma GameObject. o
dobradia ir girar no ponto especificado pela Anchor propriedade, que se deslocam
em torno do especificado Eixo propriedade.
primavera conjunta
O Conjunto Primavera junta duas corpo rgido juntos, mas permite que o distncia entre eles para alterar como se estivessem conectados por um
Primavera.
Os mola actua como um pedao de elstico que tenta puxar os dois anchor aponta juntos para exatamente a mesma posio. A fora do puxo
proporcional distncia existente entre os pontos com a fora
por unidade de distncia determinada pelo Primavera propriedade. Para evitar que a mola
de oscilao infinitamente voc pode definir o Damper valor que reduz
a fora da mola em proporo com a velocidade relativa entre os dois objectos. Quanto mais alto o valor, mais rapidamente a oscilao vai morrer
baixa.
Figura 28 - Cube Prefab com Cube Collider
pgina 90
Unity 3D - Jogo de Programao Intro
76
Agora que temos uma melhor compreenso de como o sistema funciona,
podemos continuar com a implementao do nosso nvel 1. Observe que

para cada uma das primitivas de cubo que criamos, uma caixa Collider tem
foi automaticamente anexada ao objeto jogo. Isto mostrado na Figura
28.
Figura 29 - Janela Inspector
mostrando Box Collider
Dando uma olhada no Inspetor
Janela, na F igura 29 f ou a secionado cubo, temos de ver o
detalhes dos componentes ATtached ao objeto jogo do cubo.
Eu gostaria de transformar sua ateno
o ao Box Collider
componente ligado ao jogo
objeto. Observe que, por padro,
exactamente o mesmo tamanho e
forma como o prprio cubo, e
centrado na origem local.
Estes so valores ajustveis e
voc pode ir em frente e modificar
-los no editor e visualmente
ver o resultado.
A outra caracterstica principal a
IsTrigger propriedade indicada atravs de
a flecha. Por padro, esta visualizada
abled, ns estamos indo para ir em frente
e habilitar o prop- IsTrigger
erty para que possamos usar o
OnTriggerEnter function () a partir de
o script para lidar com coliso.
A prxima propriedade que eu gostaria que voc prestar ateno o
Tag propriedade. Observe que, por padro, todos os objetos do jogo que voc
criar na cena vai ser no identificado. Ns vamos fazer uma
pgina 91
Vah Karamian
77
nova tag e associar o nosso jogo objetos com a marca recm-criada. este
propriedade, em seguida, pode ser usado dentro do script para identificar o objeto que
esto interagindo com.
Para criar uma nova tag, basta usar o menu drop-down e selecione
Adicionar Tag ... para exibir a interface do usurio para introduzir um novo elemento tag
na lista. Se uma marca j est na lista, ento voc pode simplesmente selecion-lo
sem ter de o adicionar lista. Vou usar MyCollectable como um novo
elemento tag. Suas prefabs cubo deve ter a seguinte configurao
es:
Cube 1
Cube 2
Cube 3
ID: C1
ID: C2
ID: C3
Tag: MyCollectable

Tag: MyCollectable
Tag: MyCollectable
Escala: <0.25,0.25,0.25>
Escala: <0.50,0.50,0.50>
Escala: <0.75,0.75,0.75>
Eu no estou listando a posio e orientao que ser diferente
para voc com base na formao de seu terreno e posicionamento do
cubos. Temos configurado nossos objetos de pesquisa e recolha,
agora precisamos trabalhar no roteiro. V em frente e criar um novo script
chamados MyCollectable.cs . No momento em que gostaria de implementar
a deteco de coliso.
classe pblica MyCollectable: MonoBehaviour {
// Use isso para inicializao
vazio Iniciar () {
}
// Update chamado uma vez por quadro
vazio Update () {}
// FUNO para detectar se h uma coliso
// Com este objeto especfico
vazio OnTriggerEnter (Collider c)
{
Debug.log ( "Voc esbarrou em mim !!!" );
}
}
Cdigo Bloco 16 - MyCollectable.cs lista
V em frente e anexar o script para todos os objetos de cubo que so
vai ser recolhidos. No momento, no vamos ir mais longe. O cdigo
vai imprimir no console uma mensagem indicando que temos
colidiu com o objeto. Antes de continuarmos, vamos em frente e trabalhar
pgina 92
Unity 3D - Jogo de Programao Intro
78
em nosso personagem do jogador. Isto ir permitir-nos realmente navegar no
mundo e testar o nosso cdigo e ter uma idia de como ele vai funcionar.
Mecnica de caracteres
Entrada do jogador
Em algum ponto no tempo, voc vai precisar para comear a receber a entrada do
jogador e ser capaz de traduzir a entrada em algum tipo de uma ao.
Dependendo do jogo e do design, este elemento por si s poderia ser
muito complexo. Para efeitos de demonstrao, vamos manter
coisas simples e direto ao ponto.
Ento, como discutido anteriormente, usaremos uma esfera primitiva para representar
nosso jogador. Para esta esfera que ser necessrio anexar algum tipo de um script
para lidar com o movimento. Vamos chamar-lhe PlayerInput.cs . este script
vai lidar com o movimento inicial do nosso personagem no mundo.
usando UnityEngine;
usando System.Collections;
classe pblica PlayerInput : MonoBehaviour {
// Use isso para inicializao
vazio Iniciar () {
}

// Update chamado uma vez por quadro


vazio Update () {
// Cdigo para o movimento do jogador (CP) para a frente
se ( Input .GetKey ( KeyCode .UpArrow))
{
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) para trs
se ( Input .GetKey ( KeyCode .DownArrow))
{
este .transform.Translate ( Vector3 .Contra * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) esquerda
se ( Input .GetKey ( KeyCode .LeftArrow))
{
este (.transform.Rotate Vector3 .At, -5);
}
// Cdigo para o movimento do jogador (CP) direita
se ( Input .GetKey ( KeyCode .RightArrow))
{
este (.transform.Rotate Vector3 .At, 5);
pgina 93
Vah Karamian
79
}
}
}
Cdigo Bloco 17 - PlayerInput () verso inicial
V em frente e anexar o script para a esfera
10
, E use a seta
chaves para se deslocar no terreno. Observe como o motor internacional de fsica
age com o corpo rgido do jogador. Isto especialmente visvel quando
voc est tentando subir um morro ou montanha. Voc vai notar que a
esfera que suposto representar o personagem do jogador vai rolar
para baixo e ficar afectado pelas foras aplicadas a ele por meio da interaco
da coliso das malhas entre si eo terreno pela physmotor ics.
Para resolver esse problema, voc ter que colocar algumas restries sobre a
Corpo rgido componentes e a forma como ela vai reagir ao motor de fsica.
As limitaes seriam para desactivar a rotao sobre o X , Y e Z
Axis para este objeto jogo particular.
Figura 30 - corpo rgido Congelar Rotao
Quando voc executa o jogo agora, voc vai notar que o jogador charO Acter no entrar em um modo catico de rotao quando colidir com
10
O objeto do jogo primitiva representando seu personagem jogador precisa tambm ter um
componente de corpo rgido ligado a ele. Leia a seo Fsica para obter uma melhor compreenso
do
como aceleradores de trabalho.

pgina 94
Unity 3D - Jogo de Programao Intro
80
a malha de terreno. Isto est mais prximo do comportamento que deseja simular, em
Neste ponto, para efeitos de demonstrao.
Configurao da cmara
Mais uma melhoria eu gostaria de fazer o posicionamento da
objeto de cmera. Gostaria que a cmera para acompanhar o personagem do jogador
por trs, e um pouco elevado, como uma espcie de cmera em terceira pessoa
configurao. realmente muito fcil de configurar essa configurao. Aqui est o
passos:
Figura 31 - Terceira Pessoa Configurao da Cmara
1. No designer cena, orientar a vista de modo a que voc est atrs
o personagem do jogador e um pouco acima dela.
2. Selecione a cmera principal objeto jogo e do
Menu de GameObject selecionar GameObject-> Alinhar Com Vista
opo
11
.
11
Isto ir mover o objeto do jogo Cmera principal e coloc-lo e orientar a vista de exactly o que voc v no designer cena.
pgina 95
Vah Karamian
81
3. Tornar o jogo Cmera principal objeto um filho do jogador
carter, arrastando-a com o jogo personagem do jogador
objeto
12
.
4. Agora voc pode usar transformar o local de portagens disponveis para o
Cmera principal para afinar os ngulos e vista para o porto.
No final das etapas, voc deve ter uma relao entre o
personagem do jogador ea cmera semelhante ao o f Figura 31 . V em frente
e executar o jogo, e voc ver que ns temos algo que muito
mais agradvel. V em frente e veja se voc pode recolher o cubo temos
configurao no nvel. Voc vai notar que voc colidir com eles, mas comunicao nada
ing acontece. Nossa declarao de depurao no mesmo mostrando-se, isto ,
porque nunca permitiu que a IsTrigger propriedade para verdadeiro no cubo de
objeto jogo. V em frente e p-los a verdade, e executar mais uma vez.
Figura 32 - Collider Interao aps IsTrigger Ativado
Note-se que a interao de aceleradores do objeto dois jogos so
tratadas de forma diferente pelo motor de fsica uma vez, vamos definir o IsTrigger
propriedade sobre os objetos colecionveis para true. Agora, voc vai notar tambm
que o console est nos dando a sada esperada:
12
Isto ir criar uma relao pai / filho entre os dois objetos do jogo.
pgina 96
Unity 3D - Jogo de Programao Intro
82

Figura 33 - sada do console para deteco de coliso


Agora podemos comear a parte divertida, a magia da programao atravs
script que nos permitir manter o controle dos itens coletados. Ns
seria necessrio para expandir nossos scripts um pouco mais para lidar com a coleta de
nossos objetos do jogo, que tambm pode ter de introduzir um novo roteiro para o
n de dados. Vamos comear pela expanso do MyCollectable.cs script.
usando UnityEngine;
usando System.Collections;
classe pblica MyCollectable : MonoBehaviour {
public int ID;
public float size;
// Use isso para inicializao
vazio Iniciar () {
este .transform.localScale = new Vector3 (tamanho, tamanho, tamanho);
}
// Update chamado uma vez por quadro
vazio Update () {
}
}
Cdigo Bloco 18 - MyCollectable.cs ver 2
Eu adicionei dois membros pblicos que representam o ID eo tamanho
do objeto colecionveis. O Start () funo ir usar a propriedade de tamanho
para dimensionar o objeto jogo colecionveis quando o jogo comea. Notar que
no temos mais o OnTriggerEnter () funo listada. Vamos Handle a deteco de coliso na PlayerInput.cs script.
Enquanto isso, tivemos que introduzir um novo script que usado para
unicamente armazenar dados que sero utilizados durante o jogo. Este novo roteiro
chamados MyCollectableData.cs . Aqui est a lista para ele:
pgina 97
Vah Karamian
83
usando UnityEngine;
usando System.Collections;
classe pblica MyCollectableData {
public int ID;
public float size;
pblica MyCollectableData () {}
}
Cdigo Bloco 19 - MyCollectableData.cs
Esta uma classe simples que ser usado para armazenar e recuperar apenas a
dois atributos ID e tamanho . A principal script que ir lidar com a coliso
eo registro do objeto pick-up implementado no PlayerInput.cs script.
usando UnityEngine;
utilizando System.Collections.Generic;
classe pblica PlayerInput : MonoBehaviour {
pblica Lista < MyCollectableData > myCollection = nova Lista < MyCollectableData > ();
anular Awake ()
{
// Certifique-se que comece a limpo

este .myCollection.Clear ();


}
// Use isso para inicializao
vazio Iniciar () {
}
// Update chamado uma vez por quadro
vazio Update () {
// Cdigo para o movimento do jogador (CP) para a frente
se ( Input .GetKey ( KeyCode .UpArrow))
{
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) para trs
se ( Input .GetKey ( KeyCode .DownArrow))
{
este .transform.Translate ( Vector3 .Contra * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) esquerda
se ( Input .GetKey ( KeyCode .LeftArrow))
{
este (.transform.Rotate Vector3 .At, -5);
}
pgina 98
Unity 3D - Jogo de Programao Intro
84
// Cdigo para o movimento do jogador (CP) direita
se ( Input .GetKey ( KeyCode .RightArrow))
{
este (.transform.Rotate Vector3 .At, 5);
}
se ( Input .GetKeyUp ( KeyCode .Z))
{
foreach ( var d neste .myCollection)
{
Debug log (d.ID);
}
}
}
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "MyCollectable" ))
{
var recolher = c.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
este .myCollection.Add (dados);
Destroy (c.gameObject);
}
}
}

Cdigo Bloco 20 - PlayerInput.cs Ver. 2


Voc vai notar algumas mudanas de verso 1 do script. Primeiro,
notar que temos uma lista de coleo do tipo MyCollectionData . este
o conjunto que vai ser utilizado para armazenar os itens coleccionveis.
A segunda adio o OnTriggerEnter () funo. Gostaramos
gostaria de lidar com a coliso neste script particular, porque ele vai fazer
mais fcil para ns para lidar com os dados para este cenrio particular. No
funo, estamos verificando para ver quem temos colidiu com. Isto
feito atravs da verificao da Tag propriedade do jogo objetar que o colisor
pertence a. Se o objeto marcado como MyCollectable , ento extrair o
Componente MyCollectable do Object Game. Este componente
basicamente o MyCollectable.cs script que est ligado ao pr-fabricada cubo.
pgina 99
Vah Karamian
85
Uma vez, os componentes so recuperados, criamos um MyCollectableData
opor-se a copiar o ID eo tamanho recuperado do MyCollectable
Componente. Este objeto, ento armazenado em nossa lista coleo chamada
myCollection . Uma vez que tenhamos recuperado com segurana os dados, que chamamos de Destroy () funo que ir destruir o objeto jogo de cena.
O que temos feito muito simples, mas muito poderoso, uma vez que
perceber como aplic-la para projetos maiores e casos de uso. No estamos concluir sua
ished ainda, precisamos ser capazes de recuperar os itens e recri-las em
o mundo em outro local. Precisamos agora de conceber e implementar
a mecnica para lidar com o prximo cenrio.
Descarregamento Nossa coleo
Precisamos identificar um local para o nosso descarregamento da recolhido
objeto. Usando um cilindro primitivo , podemos marcar uma rea onde aps a
jogador tenha coletado todos os itens colecionveis pode descarregar. Assim, na cria- desenhador
comeu um novo objeto de jogo do tipo cilindro e coloc-lo em algum lugar que
ser acessvel para o jogador. Meu projeto semelhante ao seguinte:
Figura 34 - Plataforma Drop-Off
Ento, ns introduzimos um novo objeto jogo que uma representao
de uma plataforma para ser usado para a devoluo dos itens coleccionveis. Ns
pgina 100
Unity 3D - Jogo de Programao Intro
86
tambm precisa lidar com a deteco de coliso para este objeto. Desde que ns
esto manipulando o evento colisor na PlayerInput.cs roteiro, podemos exPAND na funo para lidar com tambm o novo objeto jogo. Isso seria
faz sentido, uma vez que os dados que precisam acessar para os cubos tambm
armazenado na mesma classe.
Portanto, tudo o que precisamos fazer tecnicamente criar um nico Tag para o
identificao da plataforma, e implementar o cdigo para lidar com o
de coliso e a criao dos cubos no local apropriado. eu estou indo
para chamar a tag DropOffZone .
Vamos ir em frente e juntar tudo e ver como ele vai
trabalho. O que se segue uma lista de PlayerInput.cs modificado para atender a nossa
novos critrios.
usando UnityEngine;

utilizando System.Collections.Generic;
classe pblica PlayerInput : MonoBehaviour {
pblica Lista < MyCollectableData > myCollection = nova Lista < MyCollectableData > ();
pblica de materiais CubeMaterial;
anular Awake ()
{
// Certifique-se que comece a limpo
este .myCollection.Clear ();
}
// Use isso para inicializao
vazio Iniciar () {
}
// Update chamado uma vez por quadro
vazio Update () {
// Cdigo para o movimento do jogador (CP) para a frente
se ( Input .GetKey ( KeyCode .UpArrow))
{
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) para trs
se ( Input .GetKey ( KeyCode .DownArrow))
{
este .transform.Translate ( Vector3 .Contra * Tempo .deltaTime);
}
// Cdigo para o movimento do jogador (CP) esquerda
pgina 101
Vah Karamian
87
se ( Input .GetKey ( KeyCode .LeftArrow))
{
este (.transform.Rotate Vector3 .At, -5);
}
// Cdigo para o movimento do jogador (CP) direita
se ( Input .GetKey ( KeyCode .RightArrow))
{
este (.transform.Rotate Vector3 .At, 5);
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "MyCollectable" ))
{
var recolher = c.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
este .myCollection.Add (dados);
Destroy (c.gameObject);
}

Se (c.tag.Equals ( "DropOffZone" ))
{
Se ( este .myCollection.Count> 2)
{
Vector3 centro = c.transform.position;
int index = 1;
foreach ( var d neste .myCollection)
{
Vector3 pos = CirclePath (centro, 1.0f, index);
ndice ++;
Quaternion rot = Quaternion .FromToRotation ( Vector3 .forward,
Centro - pos);
GameObject tmp = GameObject .Instantiate ( GameObject .CreatePrimitive ( PrimitiveType .Cube),
pos, rot) como GameObject ;
tmp.transform.localScale = new Vector3 (d.size, d.size,
d.size);
tmp.GetComponent < Renderer > () Material =. presente .CubeMaterial;
}
}
}
}
pgina 102
Unity 3D - Jogo de Programao Intro
88
// Funo para colocar a posio calcule do prximo item de torno
// Um caminho circular.
Vector3 CirclePath ( Vector3 center, flutuador raio, int id)
{
flutuador ang = 90 * id; //Random.value * 360;
Vector3 pos;
pos.x = center.x + raio * Mathf .Sin (ang * Mathf .Deg2Rad);
pos.z = center.z + raio * Mathf .Cos (ang * Mathf .Deg2Rad);
pos.y = center.y + 1;
voltar pos;
}
}
Cdigo Bloco 21 - PlayerInput.cs Ver. 3
No OnTriggerEnter () funo, ns adicionamos uma nova condio
para o DropOffZone plataforma. Se estamos na plataforma, o cdigo
verifica para ver se temos recolhido todos os itens colecionveis. Uma vez o
condio for verdadeira, ento comeamos o processo de descarregamento / re-criao
os GameObjects na ordem de cobrana em um caminho circular em torno do
centro da plataforma. A funo CirclePath () usada para calcular
a posio da prxima colecionvel para descarga.
Figura 35 - Drop Off Zona em ao
pgina 103
Vah Karamian
89
Note-se que no foreach circuito, calcula-se a posio do

objecto a ser colocado atravs do CirclePath () funo, seguido pela


rotao do objecto. Uma vez que o cubo primitiva instanciado usando o
dados de posio e rotao, usamos o tamanho valor armazenado nas MyCollectableData objeto.
Ordenao e Matching
Ns completamos a implementao de busca e collecting do objeto jogo e, portanto, de ter sido dada uma simples
exemplo dos dois mecnicos. O prximo passo a concepo de correspondncia e
encomenda. Manter as coisas simples para fins de demonstrao, podemos
pedir ao jogador para clicar sobre o objeto do jogo do menor para o maior,
isso vai entrar em ressonncia com o ato de ordenao sem torn-lo muito complex. Podemos usar uma estrutura de dados Stack
13
para implementar este recurso.
A razo pela qual ns estamos usando uma pilha para a estrutura de dados, porque
ele se encaixa o efeito.
Figura 36 - Representao visual de uma pilha
Ns s pode inserir a partir do topo, e antes de inserir a prxima
valor, podemos espreitar a pilha e ver se o valor superior atualmente no
pilha maior do que ou menor do que o valor a ser inserido. Baseado em
o resultado ento podemos decidir o que fazer a seguir. Isso far com que mais
sentido quando olhamos para o cdigo.
13
Uma pilha uma estrutura de dados bsica que pode ser logicamente pensado como estrutura
representam linear
tada por uma pilha fsica real ou pilha, uma estrutura onde a insero e excluso de itens leva
colocar em uma extremidade chamado topo da pilha.
pgina 104
Unity 3D - Jogo de Programao Intro
90
As primeiras coisas a fazer criar uma classe pilha. O cdigo a seguir
uma lista de nossa classe:
usando UnityEngine;
usando System.Collections;
classe pblica MyStack {
private int index;
private ArrayList pilha;
pblica MyStack ()
{
este .STACK = new ArrayList ();
index = -1;
}
int pblica COUNT
{
obter { return este .stack.Count; }
}
public void push ( objeto de dados)
{
este .stack.Add (dados);
este .index ++;
}

objeto pblico pop ()


{
objeto o = este .STACK [ndice];
este .stack.RemoveAt (index);
este .index--;
devolver o;
}
public void clear ()
{
este .stack.Clear ();
este .index = -1;
}
objeto pblica espiada ()
{
devolver este .STACK [ este .index];
}
}
Cdigo Bloco 22 - Estrutura de dados Stack
pgina 105
Vah Karamian
91
Como voc pode ver, a implementao de uma estrutura de dados Stack
bastante simples e direto.
Agora podemos ir em frente e realmente implementar a lgica do jogo de
lidar com a correspondncia e encomendas. Aqui est a lista para PlayerInput.cs
com as novas atualizaes:
usando UnityEngine;
utilizando System.Collections.Generic;
classe pblica PlayerInput : MonoBehaviour {
pblica Lista < MyCollectableData > myCollection = nova Lista < MyCollectableData > ();
pblica de materiais CubeMaterial;
pblica MyStack pilha = new MyStack ();
bool privada MATCH = false ;
anular Awake ()
{
este .match = false ;
// Certifique-se que comece a limpo
este .myCollection.Clear ();
}
// Use isso para inicializao
vazio Iniciar () {
}
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .match)
{
// Cdigo para o movimento do jogador (CP) para a frente
se ( Input .GetKey ( KeyCode .UpArrow))
{

este .transform.Translate ( Vector3 .forward * Tempo .deltaTime * 10);


}
// Cdigo para o movimento do jogador (CP) para trs
se ( Input .GetKey ( KeyCode .DownArrow))
{
este .transform.Translate ( Vector3 .Contra * Tempo .deltaTime * 10);
}
// Cdigo para o movimento do jogador (CP) esquerda
se ( Input .GetKey ( KeyCode .LeftArrow))
{
este (.transform.Rotate Vector3 .At, -5);
}
pgina 106
Unity 3D - Jogo de Programao Intro
92
// Cdigo para o movimento do jogador (CP) direita
se ( Input .GetKey ( KeyCode .RightArrow))
{
este (.transform.Rotate Vector3 .At, 5);
}
}
Se ( este .match)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
//Debug.Log("START JOGO >>> ");
RaycastHit selectedCollectable;
// Capturar a posio do mouse e lana um raio para ver o objeto
ns batemos
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora selectedCollectable, 200))
{
//Debug.Log("TAG="+selectedCollectable.transform.tag);
se (selectedCollectable.transform.tag.Equals ( "MyCollectcapazes " ))
{
var recolher = selectedCollectable.transform.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
MyCollectableData sd = NULL ;
// Pilha de seleo
Se (stack.COUNT> 0)
{
sd = ( MyCollectableData ) stack.peek ();
Se (sd.size <data.size)
{
stack.push (dados);
}

outro
{
Debug log ( "Desculpe Try Again ...!" );
stack.clear ();
}
}
outro
{
stack.push (dados);
}
}
pgina 107
Vah Karamian
93
}
}
Se (stack.COUNT> = 3)
{
para ( int i = 0; i <= stack.COUNT + 1; i ++)
{
MyCollectableData d = ( MyCollectableData ) stack.pop ();
Debug log ( cadeia .format ( "Pop: {0}" , d.size));
}
Debug log ( "GRANDE TRABALHO !!! Objectivo Concludo!" );
este .match = false ;
}
#endregion
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "MyCollectable" ))
{
var recolher = c.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
este .myCollection.Add (dados);
Destroy (c.gameObject);
}
Se (c.tag.Equals ( "DropOffZone" ))
{
Se ( este .myCollection.Count> 2)
{
Vector3 centro = c.transform.position;
int index = 1;
foreach ( var d neste .myCollection)
{
Vector3 pos = CirclePath (centro, 1.0f, index);
ndice ++;

Quaternion rot = Quaternion .FromToRotation ( Vector3 .forward,


Centro - pos);
GameObject tmp = GameObject .CreatePrimitive ( PrimitiveTipo .Cube);
tmp.transform.position = pos;
tmp.transform.rotation = podrido;
tmp.transform.tag = "MyCollectable" ;
page 108
Unity 3D - Jogo de Programao Intro
94
tmp.transform.localScale = new Vector3 (d.size, d.size,
d.size);
tmp.GetComponent < Renderer > () Material =. presente .CubeMaterial;
// Anexar componente coleccionvel, aplicam-se os dados
tmp.gameObject.AddComponent < MyCollectable > ();
tmp.gameObject.GetComponent < MyCollectable .> () ID = d.ID;
tmp.gameObject.GetComponent < MyCollectable > () size = d.size.;
}
// Tudo foi processado, comear combinando
este .match = verdadeiro ;
}
}
}
// Funo para colocar a posio calcule do prximo item de torno
// Um caminho circular.
Vector3 CirclePath ( Vector3 center, flutuador raio, int id)
{
flutuador ang = 90 * id; //Random.value * 360;
Vector3 pos;
pos.x = center.x + raio * Mathf .Sin (ang * Mathf .Deg2Rad);
pos.z = center.z + raio * Mathf .Cos (ang * Mathf .Deg2Rad);
pos.y = center.y + 1;
voltar pos;
}
}
Cdigo Bloco 23 - PlayerInput.cs Ver. 4
Voc pode notar algumas mudanas no cdigo como eu listados n Cdigo
Bloco 23 - PlayerInput.cs Ver. 4. Primeiro aviso de que na DropOffZone
deteco de coliso, estamos fazendo vrias tarefas novas e importantes.
1. Ns percorrer nossa lista de colecionveis.
2. Para cada coleco que est sendo processado, calculamos o posio e rotao com a ajuda de CirclePath () funo.
3. Uma vez que a posio, a rotao ea escala foram aplicadas,
que comear a construir os prximos propriedades, ou seja, Tag .
4. Uma vez que este um GameObject recm-criado que precisa represenressentir-se da coleco original, precisamos tambm adicionar o
MyCollectable componentes a ele.
5. Depois de anexar o componente, preciso definir o va- dados
UEs que em seguida vai ser utilizados numa fase posterior.
6. Finalmente, definir um valor bandeira this.MATCH para true.

pgina 109
Vah Karamian
95
A prxima grande mudana est no Update () funo. Precisamos de uma maneira de
detectar se tivermos descarregado com sucesso nossos objetos colecionveis para o
DropOffZone . Isso feito por um booleano nomes bandeira JOGO .
Se o sinalizador definido como verdadeiro, o programa vai para a segunda fase do
o jogo, a correspondncia e encomendas. O objetivo aqui para que o usurio
marque as caixas de colecionveis descarregadas na ordem do menor para o
O maior.
Usamos Camera.main.ScreenToRay () funo para converter o
coordena mouse de um espao 2D para um espao 3D Ray objeto. o Ray
objeto ento usado pelo motor de fsica para lanar um raio usando o
Raycase () funo. Esta funo retorna informaes sobre o primeiro
objetar que o raio colide com. Este armazenado na selectedCollectable
varivel. Se estamos a bater com sucesso o objeto jogo desejado, ento ns
comear a receber os dados usando o getComponent () funo para acessar o
MyCollectable , e armazen-lo em um novo MyCollectableData objeto.
Quando temos toda a informao que est procurando, ns utilizamos
Pilha a estrutura de dados para iniciar a insero nossos pontos de dados para ele. Obviously h alguns controlos e verificaes que precisam ser feitas
antes de determinar se a coleco seleccionada vai ser empurrado
para a pilha, ou se vamos ter que comear o processo de seleo
denovo. Se voc seguiu as instrues, at agora, voc
deve ter tudo funcionando corretamente. Ns no implementar qualquer
interface do usurio neste momento. A razo principal que estamos trabalhando no
lgica de cdigo e ns estamos usando a janela do console para a sada dos resultados
para o gabarito.
Figura 37 - Console janela mostrando Pilha Ouput aps a ordem de sucesso
pgina 110
Unity 3D - Jogo de Programao Intro
96
Neste ponto, ns completamos os objetivos que estabelecemos para
-nos para o nvel 1. Vamos comear a pensar sobre o Nvel 2.
Desenvolvimento de Nvel 2
No nvel 2, vamos implementar a mecnica de tempo , arriscando ,
misturando e progredindo . Ns podemos criar um nvel que ir ser composta
por vrias salas.
Figura 38 - apenas um conceito para o Nvel 2
A ideia bsica subjacente nvel 2 ser para o jogador deve ser capaz de
completar os objetivos com base em alguns critrios. Por exemplo, o jogador
ter de ser capaz de visitar todos os trs quartos dentro do nvel para completar
o principal objetivo do nvel. No entanto, ele / ela no pode diretamente o acesso
pgina 111
Vah Karamian
97
os quartos. Eles primeiro tem que interagir com um gerador aleatrio que ser
ditar a sala que eles precisam para atender.
Os trs quartos vo ser identificados por suas cores exclusivas:
Vermelho, Verde e Azul. Quando o jogador interage com o dispositivo de seleco aleatria,

o randomizer ir exibir uma cor especfica, quando a cor tem sido


selecionado, em seguida, o usurio ter que encontrar o quarto em uma determinada quantidade de
Tempo. Cada quarto ter uma porta de correr que se abre somente se o concondies sejam atendidas.
Figura 39 - Nvel 2 design
Para fazer com que o nosso novo trabalho de nvel, precisamos implementar algumas novas
Unid. O primeiro seria um modelo 3D que representa o nosso quarto. eu tenho
SketchUp usado para modelar o meu quarto, pois um programa muito fcil para nodesigner para pick-up e trabalhar. O modelo apresentado na Figura
40, um quarto muito simples, com as seguintes dimenses Largura e
Comprimento de 4 metros, por uma altura de 3 metros. A abertura para o quarto
de 2 metros de largura. As dimenses so importantes quando voc est projetando
pgina 112
Unity 3D - Jogo de Programao Intro
98
seus modelos 3D, porque eles iro refletir em Unity 3D baseado na unidade
de medio
14
.
Figura 40 - Modelo 3D quarto
Observe, que eu no tenha aplicado quaisquer texturas para o modelo. eu mantive
coisas muito simples, como o propsito deste exemplo no a modelagem 3D
ing mas a programao. Uma vez que importar o modelo em Unity, voc
precisa ter certeza de que o Gerar Colliders opo for marcada na
modelo. Isto importante para a deteco de coliso.
Figura 41 - Modelo 3D na cena Unity
14
Unity 3D usa o sistema mtrico, por isso melhor para fazer seus modelos 3D na mtrica
sistema. Isso vai ajudar a importao e dimensionamento de seus modelos dentro da unidade muito
mais fcil.
pgina 113
Vah Karamian
99
Figura 42 - Hierarquia de quarto
No modo de design, voc
pode ir em frente e adicionar um
nova luz do ponto como um
criana com o modelo, cennaipes-lo na sala. Cada
sala ter um
Ponto de Luz com um
cor nica de vermelho,
verde ou azul.
Voc vai precisar adicionar
outra GameObject , um
cubo que ir representar
a porta de correr.
Voc vai precisar para jogar
com o colisor de
torn-lo um pouco maior

do que a porta real.


Vamos ser tambm a adio de dois novos scripts para lidar com o randomization e seleco da sala, e o deslizamento da porta para
a sala. Os dois scripts so chamados RoomSelection.cs e SlidingDoor.cs . O RoomSelection script est anexado ao GameObject
representando o randomizer na cena.
Aqui est a lista para RoomSelection.cs :
usando UnityEngine;
usando System.Collections;
classe pblica RoomSelection : MonoBehaviour
{
pblica GameObject playerCharacter = NULL ;
// Use isso para inicializao
anular Iniciar ()
{
// Se o characte jogador no est definido em tempo de design
// Atribui-lo durante o tempo de execuo antes do jogo comear
Se ( esse .playerCharacter == nulo )
page 114
Unity 3D - Jogo de Programao Intro
100
{
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" )
como GameObject ;
}
}
// Update chamado uma vez por quadro
anular Update ()
{
este .transform.Rotate ( novo Vector3 (1, 1, 1), 1.0f);
// Distncia de seleo entre este objeto e o personagem do jogador
flutuador distncia = Vector3 .distance ( este .transform.position, este .playerCharacter.transform.position);
Se (distncia <2.0F)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
int color = Aleatrio .Range (0, 3);
interruptor (cor)
{
caso 0:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .blue;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 0;
break;
}
case 1:
{

este .transform.GetComponent < Renderer > (). material.color


= Cor .Red;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 1;
break;
}
Caso 2:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .Green;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 2;
break;
}
}
}
#endregion
}
}
}
Cdigo Bloco 24 - Sala de Seleo Listagem de cdigo
pgina 115
Vah Karamian
101
Este script basicamente transforma o GameObject que ele est ligado a em
a seleco aleatria. No nosso exemplo, ela est ligada a um cubo. Ele ir girar
o cubo em todos os trs eixos. Ele tambm verificado para ver se o personagem do jogador
est dentro de uma determinada distncia de si mesmo. O limite definido como <2.0m.
Se a condio for satisfeita, ento o jogador est autorizado a clicar no cubo. Cada
vez que o usurio clica no GameObject, um novo nmero aleatrio geciado entre 0 e 3.
0: representa o quarto azul.
1: representa o quarto vermelho.
2: representa o quarto verde.
A instruo switch usado para mudar a cor do material do
GameObject respectiva cor para pista visual. Em seguida, ele acessa um
nova varivel que foi definida na PlayerInput.cs script chamado
ROOM_SELECTION .
O prximo script que vamos olhar SlidingDoor.cs :
usando UnityEngine;
usando System.Collections;
classe pblica SlidingDoor : MonoBehaviour
{
int pblica ROOM_NUMBER;
pblica Transform doorTransform;
public float raiseHeight = 3F;
public float velocidade = 3F;
privada Vector3 _closedPosition;
// Use isso para inicializao
anular Iniciar ()
{

_closedPosition = transform.position;
}
vazio OnCollisionEnter ( Collision c)
{
se (c.transform.tag.Equals ( "Player" ))
{
se (! este .IsDoorOpen && (c.transform.GetComponent < PlayerIncolocar > (). ROOM_SELECTION == este .ROOM_NUMBER))
{
StopCoroutine ( "MoveDoor" );
Vector3 endpos = _closedPosition + nova Vector3 (0f, raiseHeight,
0f);
pgina 116
Unity 3D - Jogo de Programao Intro
102
StartCoroutine ( "MoveDoor" , endpos);
}
}
}
bool privada IsDoorOpen = false ;
IEnumerator MoveDoor ( Vector3 endPos)
{
flutuar t = 0f;
Vector3 startPos = doorTransform.position;
enquanto (t <1F)
{
t + = Tempo .deltaTime * velocidade;
doorTransform.position = Vector3 .Slerp (startPos, endPos, t);
deu return null ;
}
este .IsDoorOpen = verdadeiro ;
}
}
Cdigo Bloco 25 - Porta de Correr Listagem de cdigo
Este cdigo responsvel pela abertura da porta com base em dois
condies:
1. O objeto jogo que colide com ele o caracter do Jogador
ter.
2. O personagem do jogador ROOM_SELECTION idntico ao
o ROOM_NUMBER .
Isso tratado pelo OnCollisionEnter () funo. Ns estamos usando
esta funo, porque ns queremos realmente o que representa GameObject
a porta ser slida, ou seja, o jogador no pode passar atravs dele. em outra
palavras, o IsTrigger recurso no Component Collider falso!
Observe que tambm estamos usando um co-rotina que realmente faz o
transformao na porta. Co-rotinas no so os mesmos como multiThreading. Atualizaes normais co-rotina so executados aps o Update () funo
retornos . A co-rotina uma funo que pode suspender a sua execuo
( Rendimento ) at que os dados de instruo Rendimento acabamentos. Aqui est uma lista:
rendimento , a co-rotina vai continuar depois de tudo Update () funo
es foram chamados no prximo quadro.

pgina 117
Vah Karamian
103
WaitForSeconds rendimento , continuar aps um tempo especificado
atraso, afinal Update () funes foram chamados para o
quadro.
rendimento WaitForFixedUpdate , continuar depois de tudo
FixedUpdate () foi chamado em todos os scripts.
rendimento WWW , continuar aps um download WWW tem comtaram.
StartCoroutine rendimento , as cadeias da co-rotina, e vontade
esperar para a co-rotina MyFunc para completar em primeiro lugar.
Neste ponto, ns estabelecemos a nossa estrutura principal para o nvel 2.
Agora precisamos implementar os detalhes da mecnica do jogo. O primeiro
dos quais ser um temporizador. O temporizador ser definido quando o jogador clica
no dispositivo de seleco aleatria. Aqui esto os passos:
1. O temporizador ser definido quando o jogador seleciona o randomizer
eo gerador aleatrio seleciona uma sala / cor.
2. Contagem regressiva do temporizador comear imediatamente aps a
seleo.
3. Se o jogador no capaz de encontrar a sala durante o dado
tempo, o jogo vai ser longo.
4. Se o fizerem encontrar o quarto, o temporizador ser reposto, e eles
ter de encontrar a prxima sala, indo de volta para o randomizer.
Isto pode ser conseguido muito facilmente pela adio de algumas variveis de
manter o controle do tempo no RoomSelection.cs scrip e tambm atualizar
o PlayerInput.cs roteiro com seu prprio conjunto de variveis para determinar se
o jogador no conseguiu passar o nvel, bem como o SlidingDoor.cs roteiro
para repor o temporizador quando o jogador encontra com xito o quarto seleccionado
no prazo determinado.
usando UnityEngine;
usando System.Collections;
classe pblica RoomSelection : MonoBehaviour
{
pblica GameObject playerCharacter = NULL ;
// Use isso para inicializao
anular Iniciar ()
pgina 118
Unity 3D - Jogo de Programao Intro
104
{
// Se o characte jogador no est definido em tempo de design
// Atribui-lo durante o tempo de execuo antes do jogo comear
Se ( esse .playerCharacter == nulo )
{
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" )
como GameObject ;
}
}

// MYtime ser usada para dar a quantidade de tempo em segundos


// Para o jogador para encontrar o quarto !!!
public float Mytime = 33.0f;
private float endTime = 0.0f;
// Update chamado uma vez por quadro
anular Update ()
{
este .transform.Rotate ( novo Vector3 (1, 1, 1), 1.0f);
Se ( esse .endTime> Tempo .time)
{
Debug log ( "Temporizador iniciado !!!" + Mathf .CeilToInt ( este .endTime Tempo .time) .ToString ());
}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
Debug log ( "Time Ended !!!" );
este .playerCharacter.GetComponent < PlayerInput .> () game_over = verdadeiro ;
}
// Distncia de seleo entre este objeto e o personagem do jogador
flutuador distncia = Vector3 .distance ( este .transform.position, este .playerCharacter.transform.position);
Se (distncia <2.0F)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
int color = Aleatrio .Range (0, 3);
interruptor (cor)
{
caso 0:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .blue;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 0;
break;
}
case 1:
pgina 119
Vah Karamian
105
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .Red;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 1;
break;

}
Caso 2:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .Green;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 2;
break;
}
}
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
}
#endregion
}
}
public void ResetTimer ()
{
este .endTime = 0.0f;
}
}
Cdigo Bloco 26 - RoomSelection script de atualizao para incluir Temporizador
Observe que ns introduzimos duas variveis no script, endTime e
MyTime . A varivel MYtime usado como a quantidade de tempo em segundos
o jogador tem de executar uma tarefas especficas. A varivel endTime est definido
como uma combinao do tempo de execuo do jogo, feita a partir de time.time
15
adicionada com o Mytime valor. Esta definida, quando o usurio seleciona o randomizer.
No Update () funo, h um bloco condicional verificando para
ver se a varivel endTime maior do que time.time . Se essa condio
satisfeitas, ento ainda estamos dentro do prazo e que o jogador pode fazer o que ele
ou ela agrada no nvel. Uma vez que a condio j no vlida, ento
usamos o PlayerCharacter objeto para extrair o PlayerInput objeto
e definir o game_over varivel para true. Isto indica que o jogador
15
Este o tempo em segundos desde o incio do jogo.
pgina 120
Unity 3D - Jogo de Programao Intro
106
no foi capaz de completar sua tarefa corretamente. O que se segue uma snipestimao do modificaes / modificao feita ao PlayerInput.cs script:
usando UnityEngine;
utilizando System.Collections.Generic;
classe pblica PlayerInput : MonoBehaviour {
pblica Lista < MyCollectableData > myCollection = nova Lista < MyCollectableData > ();
pblica de materiais CubeMaterial;
pblica MyStack pilha = new MyStack ();
bool privada MATCH = false ;
#region variveis para o nvel 2

int pblica ROOM_SELECTION;


bool pblica game_over;
#endregion
anular Awake ()
{
este .ROOM_SELECTION = -1;
este .GAME_OVER = false ;
este .match = false ;
// Certifique-se que comece a limpo
este .myCollection.Clear ();
}
// Use isso para inicializao
vazio Iniciar () {
}
private float VELOCIDADE = 2.0F;
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .GAME_OVER)
{
se (! este .match)
{
...
}
Se ( este .match)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
pgina 121
Vah Karamian
107
//Debug.Log("START JOGO >>> ");
RaycastHit selectedCollectable;
...
Se (stack.COUNT> = 3)
{
para ( int i = 0; i <= stack.COUNT + 1; i ++)
{
MyCollectableData d = ( MyCollectableData ) stack.pop ();
Debug log ( cadeia .format ( "Pop: {0}" , d.size));
}
Debug log ( "GRANDE TRABALHO !!! Objectivo Concludo!" );
este .match = false ;
}
#endregion
}
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)

{
Se (c.tag.Equals ( "MyCollectable" ))
{
...
}
}
// Funo para colocar a posio calcule do prximo item de torno
// Um caminho circular.
Vector3 CirclePath ( Vector3 center, flutuador raio, int id)
{
flutuador ang = 90 * id; //Random.value * 360;
Vector3 pos;
pos.x = center.x + raio * Mathf .Sin (ang * Mathf .Deg2Rad);
pos.z = center.z + raio * Mathf .Cos (ang * Mathf .Deg2Rad);
pos.y = center.y + 1;
voltar pos;
}
}
Cdigo Bloco 27 - PlayerInput.cs Atualizao para incluir Temporizador Estado
Eu no fornecer toda a listagem do script como j temos
feito nas sees anteriores do livro. As atualizaes de chave / modifictions que fizemos para o script foi negrito enfrentou. Duas variveis,
ROOM_SELECTION e game_over . claro que eles so usados
para. ROOM_SELECTION usado para guardar quais o quarto das necessidades de jogador
de encontrar, e game_over determina se o jogador foi atingido e
portanto, perdeu o jogo.
pgina 122
Unity 3D - Jogo de Programao Intro
108
O prximo script que deve dar uma olhada o SlidingDoor.cs
script. Este script realmente usado para repor o temporizador se o jogador encontra
a resposta correta e entra nele. Como listando o cdigo anterior, eu vou
s fazem listagem parcial do cdigo para demonstrar as modificaes.
usando UnityEngine;
usando System.Collections;
classe pblica SlidingDoor : MonoBehaviour
{
int pblica ROOM_NUMBER;
pblica Transform doorTransform;
public float raiseHeight = 3F;
public float velocidade = 3F;
privada Vector3 _closedPosition;
pblica GameObject roomSelection;
// Use isso para inicializao
anular Iniciar ()
{
Se ( esse .roomSelection == nulo )
{
este .roomSelection = GameObject .Find ( "RoomSelection" ) como GameObjecto ;
}

_closedPosition = transform.position;
}
vazio OnCollisionEnter ( Collision c)
{
se (c.transform.tag.Equals ( "Player" ))
{
...
// Reiniciar o temporizador uma vez que o jogador est no quarto
este .roomSelection.GetComponent < RoomSelection > () ResetTimer ().;
Debug log ( "O temporizador foi reposto!" );
}
}
}
bool privada IsDoorOpen = false ;
IEnumerator MoveDoor ( Vector3 endPos)
{
...
}
}
Cdigo Bloco 28 - atualizao SlidingDoor.cs Script para a funo Temporizador
pgina 123
Vah Karamian
109
H duas novas tarefas que esto sendo executadas no atualizada
roteiro, o primeiro na Iniciar () funo. Ns identificar e localizar o
GameObject com o nome ou ID do RoomSelection , e armazenar uma rncia
rncia GameObject para us-lo em um momento posterior. A segunda adio
neste script o chamado do ResetTimer () funo atravs da
RoomSelection GameObject RoomSelection objeto no OnCollisionEnter () funo.
Neste ponto temos implementado os fundamentos, mas precisamos
para manter alguma forma pontuao para o jogador. Em outras palavras, precisamos de uma
maneira
para identificar quais quartos o jogador tenha visitado, e quando todos os quartos
foram visitados pelo jogador, que teria completado o nvel.
Ns podemos utilizar nossa estrutura de dados Pilha de superar este obstculo. Ns
pode empurrar cada quarto para a pilha quando o jogador os visita e
quando todos os trs quartos foram visitadas, em seguida, o jogador ganha o nvel.
Este cenrio e atualiza dados seria tratado pela SlidingDoor.cs script eo PlayerInput.cs script. O SlidingDoor classe ir
chamar o mtodo definido no PlayerInput classe para empurrar os dados dos quartos
na pilha.
O segmento de cdigo que precisa ser mudado em SlidingDoor.cs
listado abaixo:
vazio OnCollisionEnter ( Collision c)
{
se (c.transform.tag.Equals ( "Player" ))
{
se (! este .IsDoorOpen && (c.transform.GetComponent < PlayerIncolocar > (). ROOM_SELECTION == este .ROOM_NUMBER))
{

...
// Reiniciar o temporizador uma vez que o jogador est no quarto
este .roomSelection.GetComponent < RoomSelection > () ResetTimer ().;
// Enviar os dados dos quartos para a pilha
c.gameObject.GetComponent < PlayerInput > () RoomVisited (. presente );
Debug log ( "O temporizador foi reposto!" );
}
}
}
Cdigo Bloco 29 - Quarto Visitou alm de roteiro SlidingDorr.cs
pgina 124
Unity 3D - Jogo de Programao Intro
110
As mudanas que precisamos fazer no PlayerInput.cs roteiro esto listados
abaixo:
public void RoomVisited ( SlidingDoor quarto)
{
se (quarto! = NULL )
{
este .stack.push (quarto);
cadeia msg = cadeia .format ( "Room # {0} inserido, a contagem de pilha = {1}" ,
room.ROOM_NUMBER, este .stack.COUNT);
Debug log (msg);
Se ( este .stack.COUNT> = 3)
{
Debug log ( "VOC GANHA !!!" );
este .GAME_OVER = verdadeiro ;
}
}
}
Cdigo Block 30 - Adio de PlayerInput.cs script para lidar com salas visitadas
Portanto, agora temos visto alguns tipos diferentes de mecnica de jogo implementations. Embora os exemplos fornecidos so muito simplista, na
finalidade, eles fazem demonstrar os principais conceitos e ideias da indicao
mecnica viduais.
Desenvolvimento de Nvel 3
No nvel 3, ns estamos indo para ilustrar a progredir, capturando / conquering e avanando mecnica de jogo. Ns tambm provavelmente
combinar algumas das outras mecnicas de jogo que temos visto at agora em
combinao para criar um nvel que um pouco mais sofisticado e invidos.
Um dos meus gneros jogo favorito o Real Time Strategy. Dois dos meus
favoritos foram Age of Empires I, II, III, e Command and Conquer .
Uma das principais razes que eu amo jogos RTS o fato de que voc realmente
tem que pensar e usar um monte de logstica para planejar sua estratgia e ser
capaz de derrotar o adversrio. Eu sempre desenhar uma linha entre o jogo de
Xadrez e RTS, a diferena que em um jogo de xadrez os jogadores
se revezam para fazer os seus movimentos, para que eles tenham tempo para pensar no futuro
alguns
passos. Em um RTS, seu adversrio pode atacar a qualquer momento e de
qualquer direo e, com armas e recursos superiores !!!

pgina 125
Vah Karamian
111
Em uma porca shell, cada um desses jogos, o jogador obrigado a recolher
recursos, construir um exrcito, construir a sua base e as estruturas necessrias, proCongresso atravs das diferentes fases de modernizao das suas estruturas e
unidades, e, ao mesmo tempo que mantm a sua base. Em cima dessas aces, existe um elemento de tempo para a recolha e a criao de
recursos e unidades. Como voc pode dizer por agora, o design do jogo e mecnica so bastante envolvidos e precisam ser planejadas muito bem.
No temos o tempo nem os recursos para realizar tal tarefa
para o nvel 3. Portanto, vamos fazer uma verso simplificada de um
RTS tipo de jogo. Para realizar nossos objetivos, podemos desenhar um esboo de
as tarefas que o usurio precisar preencher no nvel 3.
Aqui est um breve resumo:
1. O jogador ir comear com uma quantidade definida de recursos quando
o jogo comea.
2. O jogador ter que construir uma instalao de recolha.
3. O jogador ter de criar uma unidade de coletor.
4. O jogador ter de identificar a localizao de recursos para
ser recolhidos.
5. O jogador ter de atribuir o coletor para o recurso
a recolher.
6. Enquanto a unidade (s) colector esto coletando, o jogador ir
precisa para explorar o terreno para identificar o inimigo e mat-lo.
7. O jogador ter de evitar ser morto pelo inimigo
e ou outros objetos prejudiciais ao jogador.
Para manter as coisas simples, tanto o jogador como o inimigo vai comear
com a mesma quantidade de recursos. Neste caso particular, haver
dois tipos de recursos, um deles seria minerao de ouro, ea
outro seria balas. No entanto, o problema aqui que, para que o
player / inimigo acumular balas, eles tero de continuamente colouro lect.
A recolha do ouro tambm ir basear-se num tempo especfico.
Isto ir forar o jogador a ser mais cauteloso sobre como utilizar os recursos
pgina 126
Unity 3D - Jogo de Programao Intro
112
balas, muitos tiros sem sucesso ir colocar o jogador em risco de ser
mortos pelo inimigo.
Para que ns para fazer isso, seria preciso criar algum
novos scripts. Precisaramos de um roteiro para representar a unidade de armazenamento, ns
seria necessrio um roteiro para representar a unidade de coletor, o que nos obrigaria
um script para representar a unidade de recurso. Ns tambm precisamos criar dois simples
prefabs para representar a nossa Unidade de Armazenamento e Unidade Collector .
Figura 43 - Projeto de amostra de unidades de armazenamento e colecionador
No vou entrar em detalhes de como criar o armazenamento e Collector Unidades, como deveriam ser muito elementar para voc at agora.
Da mesma forma, o jogador personagem e objeto do jogo do recurso. A chave a
conexo entre os GameObjects e sua interao atravs do

scripts.
Vamos comear a olhar para a unidade de armazenamento em primeiro lugar. A funo de um
armazenamento
unidade de idade armazenar recursos para os fins do jogo. Poderia ser
usada para armazenar qualquer tipo de recurso, no entanto, geralmente, no so diferentes
pgina 127
Vah Karamian
113
tipos de unidades de armazenamento de diferentes tipos de recursos. No nosso caso, ns
so manter as coisas muito simples, portanto, a unidade de armazenamento ser armazenamento
ing apenas um tipo de recurso, uma vez que s temos um tipo de recurso
para armazenar, para comear!
Em segundo lugar, a unidade de armazenamento ser automaticamente criar o primeiro ColUnidade lector uma vez que tenha sido colocado dentro do mundo 3D. Portanto, o
Unidade de armazenamento responsvel por manter o controle da Unidade de coletor bem
como ter certeza que a Unidade de coletor sabe que a Unidade de Armazenamento ele pertence
para! Finalmente, a Unidade de Armazenamento tambm precisar ter uma referncia para o
personagem do jogador para que ele possa atualizar as estatsticas sobre o jogador.
O cdigo que nos ajuda a alcanar esses resultados listado abaixo:
usando UnityEngine;
usando System.Collections;
classe pblica MyStorage : MonoBehaviour
{
pblica GameObject myCollector;
privada GameObject collectorObj;
privada GameObject playerCharacter;
// variveis para temporizador
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .collectorObj = GameObject .Instantiate ( este .myCollector, pos,
este .transform.rotation) como GameObject ;
este .collectorObj.GetComponent < MyCollector > (). MyStorage = este .gameObjecto;
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" ) como
GameObject ;
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .endTime> Tempo .time)
{
// Vamos colocar algum cdigo aqui para visualmente carregamento de exibio
}
pgina 128
Unity 3D - Jogo de Programao Intro

114
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
este .collectorObj.GetComponent < MyCollector .> () GOTO_RESOURCE = verdadeiro ;
// Adiciona bala personagem do jogador
este .playerCharacter.GetComponent < PlayerInput > () NUM_BULLETS + = 1.;
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnCollisionEnter ( Collision c)
{
Se (c.transform.tag.Equals ( "CollectorUnit" ))
{
c.transform.GetComponent < MyCollector .> () GOTO_STORAGE = false ;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
}
}
}
Cdigo Bloco 31 - MyStorage.cs verso inicial
Quando voc l o cdigo, voc vai notar que nesse Iniciar () funo
o que instanciar um CollectorUnit objeto e atribuir o StorageUnit
objeto como uma referncia para que ele sabe para onde voltar depois ele tem
recolheu os recursos. A prxima coisa que fazer ter uma referncia para o
personagem do jogador.
O Update () funo definida no MyStorage classe s utilizada
quando a Unidade de coletor retorna de volta para ele. desencadeada pelos OnCollissionEnter () funo onde o timer para descarregar os recursos chegar
conjunto. O temporizador ento verificado no Update () funo para o descarregamento
ing e reencaminhamento da Unidade de coletor de volta para a localizao de recursos.
Isso nos faz dar uma olhada no prximo item de interesse, o ColUnidade lector. A Unidade Collector neste cenrio apenas preocupado com
saber onde o recurso est localizado para que ele possa ir e recolher o
recursos, e que unidade de armazenamento a que pertence, para que ele pode seguramente
page 129
Vah Karamian
115
voltar e descarregar os recursos. Ele tambm precisa saber quanto refontes que tenha recolhido, esta varivel est definida, mas no usado neste
ponto. Alm disso, existem dois sinalizadores crticos que definem o estado do collector, qualquer um que vai para a localizao de recursos para o carregamento, ou
ir para a unidade de armazenamento para a descarga.
A listagem para os MyCollector.cs est abaixo:
usando UnityEngine;
usando System.Collections;
classe pblica MyCollector : MonoBehaviour

{
pblica GameObject myResource;
pblicas GameObject MyStorage;
bool pblica GOTO_RESOURCE;
bool pblica GOTO_STORAGE;
int pblica UNINTS_COLLECTED;
// Use isso para inicializao
anular Iniciar ()
{
este .myResource = GameObject .FindGameObjectWithTag ( "ResourcePlayer" )
como GameObject ;
este .GOTO_RESOURCE = verdadeiro ;
este .GOTO_STORAGE = false ;
este .UNINTS_COLLECTED = 0;
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( este .GOTO_RESOURCE)
{
// Goto a localizao dos recursos para a coleta
Vector3 refillHeading = este .myResource.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 * Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
Se ( este .GOTO_STORAGE)
pgina 130
Unity 3D - Jogo de Programao Intro
116
{
Vector3 refillHeading = este .myStorage.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
}
}
Cdigo Bloco 32 - MyCollector.cs verso 1
Observando o cdigo, voc vai notar que a Unidade Collector encontra
onde o recurso para o jogador , ele armazena e que, na sua memria. Desde
que acaba de ser inicializada pela unidade de armazenamento, o seu estado inicial seria

para ir e recolher recursos. Isto definido na Iniciar () funo.


O Update () funo apenas responsvel por certificar-se de que a collector est correctamente orientada, quer a localizao de recursos, ou para o armazenamento
unidade. Muito simples e muito para a frente. A chave aqui notar
que o estado do colector alterada por foras externas!
A prxima pea do quebra-cabea para completar o ciclo o recurso.
Como foi concebido, o objeto de recurso fixo e no pode ser movida
ou realocados. Tambm no criar qualquer coisa a partir de dentro, embora isto
pode ser algo que voc pode querer fazer em um momento posterior. Assim, as principais tarefas
do objeto de recurso para saber quando o coletor chegou para collect, e como alterar o estado do colector quando o tempo tem
vm para retornar base!
Aqui est uma lista para MyResource.cs script:
usando UnityEngine;
usando System.Collections;
classe pblica MyResource : MonoBehaviour
{
pblica GameObject collectorUnit;
// variveis para temporizador
page 131
Vah Karamian
117
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .endTime> Tempo .time)
{
// Vamos colocar algum cdigo aqui para visualmente carregamento de exibio
}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
este .collectorUnit.GetComponent < MyCollector .> () GOTO_STORAGE = verdadeiro ;
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "CollectorUnit" ))
{
c.GetComponent < MyCollector .> () GOTO_RESOURCE = false ;

este .collectorUnit = c.gameObject;


// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
}
}
}
Cdigo Bloco 33 - MyResource.cs verso 1
O cdigo que eu tenho mostrado at agora muito simples e direta paraenfermaria. Mas o conceito muito poderoso se voc comear a construir em cima dela
e criar sistemas maiores. Mais uma vez, uma das chaves desse livro
demonstrar-lhe algumas noes bsicas ideias e para aqueles que segur-lo, eles podem
construir cenrios e ambiente muito mais interessantes e complexas ou
simulaes.
pgina 132
Unity 3D - Jogo de Programao Intro
118
Agora hora de construir os componentes para o adversrio. Vamos comear
descrevendo os itens que seria necessrio para definir adequadamente a op- simples
Ponent para fins de demonstrao.
Aqui est um breve resumo:
1. O inimigo vai comear com uma quantidade definida de recursos quando
o jogo comea.
2. O inimigo vai precisar para construir uma instalao de recolha.
3. O inimigo ter de criar uma unidade de coletor.
4. O inimigo ter de identificar a localizao de recursos
a recolher.
5. O inimigo vai precisar atribuir o coletor para o recurso
a recolher.
6. Enquanto a unidade (s) colector esto coletando, o inimigo
precisa para explorar o terreno para identificar o jogador e mat-lo.
7. O inimigo ter de evitar ser morto pelo jogador
e ou outros objetos prejudiciais ao inimigo.
Praticamente exactamente a mesma que a do jogador. Mas isso
vale a pena mencionar novamente para nos dar uma ideia concreta. Voc pode querer
usar os mesmos scripts para lidar com a lgica do jogador e do inimigo
lgica, mas como o tempo passa e seu cdigo se torna mais complexa voc
vai ver que esta estratgia no sustentvel. Na verdade, ele pode tornar-se
tedioso para manter e expandir a longo prazo. Portanto, seria
ser melhor para criar classes separadas para lidar com a lgica e as unidades do jogador
da do inimigo.
Assim como o jogador que seria necessrio para criar trs scripts para Handle Unidade do inimigo Armazenamento, Unidade Collector, e da Unidade de Recursos. Estes
scripts so vai ser exatamente idntico ao roteiro do jogador, com o
ressalva de que eles vo ser abordados objetos do inimigo.
A principal novidade para nossos scripts vai ser, o script que
ir conduzir nosso inimigo. Vamos chamar-lhe MyEnemy.cs . Ser responsvel dar ao inimigo alguma inteligncia, embora no muito, apenas para o
causa da demonstrao deste nvel. O objectivo do script
pgina 133
Vah Karamian

119
seria permitir que o inimigo para nos arredores do terreno e ser capaz de
colocar a sua unidade de armazenamento para a coleta de recursos, e tambm ser capaz de defender
sua base e atacar o jogador, se necessrio.
O script ir comear por colocar uma unidade de armazenamento em um lo- aleatrio
cao com base no movimento do inimigo e um intervalo de tempo. Uma vez
A unidade de armazenamento colocado, a Unidade de Armazenamento vai comear a automatizar
a sua
mecanismo de unidade de coletor e isso vai continuar at que o jogo acabou. Dentro
Entretanto, a lgica para a enemycharacter entrar em modo de olheiro
at que tenha suficientes munies / recursos de ser capaz de atacar o
jogador. Durante este tempo, ele ir percorrer um conjunto de ponto especificado
no mundo at que esteja pronto para atacar. Quando ele est pronto para atacar, ele
ir localizar a posio do jogador e v direto para o jogador
para matar.
Aqui est a lista inicial de MyEnemy.cs script:
usando UnityEngine;
usando System.Collections;
classe pblica MyEnemy : MonoBehaviour
{
pblicas GameObject MyBase;
pblicas GameObject MyStorage;
privada GameObject myStorageObj;
pblica GameObject MyEnemy;
public int NUM_BULLETS;
// variveis para temporizador
public float Mytime = 5.0f;
private float endTime = 0.0f;
bool pblica ATAQUE;
bool pblica SCOUT;
pblica Transform [] scoutPoints;
private int nextPointIndex;
// Use isso para inicializao
anular Iniciar ()
{
este .NUM_BULLETS = 1;
este .ATTACK = verdadeiro ;
pgina 134
Unity 3D - Jogo de Programao Intro
120
este .myEnemy = GameObject .FindGameObjectWithTag ( "Player" ) como GameObjecto ;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
este .nextPointIndex = 0;
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .myStorageObj == nulo )
{

Se ( esse .endTime < Tempo .time)


{
// Soltar o armazenamento
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .myStorageObj = GameObject .Instantiate ( este .myStorage, pos,
este .myStorage.transform.rotation) como GameObject ;
este .endTime = 0.0f;
}
}
Se ( este .NUM_BULLETS> 1)
{
este .ATTACK = verdadeiro ;
}
outro
{
este .ATTACK = false ;
}
// Procurar o jogador para atacar
Se ( este .ATTACK)
{
Vector3 refillHeading = este .myEnemy.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
}
outro
{
Se ( este .scoutPoints.Length> 0)
{
pgina 135
Vah Karamian
121
Vector3 refillHeading = esta .scoutPoints [nextPointIndex] .posio - este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
Se ( Vector3 .distance ( este .transform.position, este .scoutPontos [nextPointIndex] .position) <0.25f)
{
este .nextPointIndex + = 1;

Se ( esse .nextPointIndex> = este .scoutPoints.Length)


{
este .nextPointIndex = 0;
}
}
}
}
}
}
Cdigo Bloco 34 - MyEnemy.cs verso 1
Colocar os pedaos juntos e executar o programa, voc v como
o meio ambiente vem vida. Os grficos que usamos e 3D
modelos que usamos so muito primitivo, mas esta livros no para 3D
Modelagem, para a programao. Ento, usamos espao reservado primitivo que
pode muito facilmente ser substitudos quando chegarmos melhores modelos!
O nico aspecto que ainda no implementaram, a capacidade
atacar. Este o caso tanto para o jogador eo inimigo. Ns podemos
comear por primeira implementao recurso ataque do jogador e, em seguida, ns podemos
implementar o recurso ataque do inimigo.
Para implementar o recurso de ataque seria preciso ajustar alguns
Unid. Em primeiro lugar, seria necessrio ter uma representao fsica de como
e onde a iniciao ataque vai ocorrer. A prxima tarefa identificar o quo poderoso o ataque real ser. Finalmente, precisamos
determinar o que o intervalo para o ataque .
A ltima condio mais para o personagem do jogador inimigo, em vez
do que o jogador efectivo. O jogador pode atacar a qualquer momento e em qualquer lugar que ele
pgina 136
Unity 3D - Jogo de Programao Intro
122
ou ela deseja, desde que haja recursos disponveis! O mesmo pio
cpio aplica-se ao inimigo, mas, seria sem sentido para projetar um inimigo
para atacar por qualquer razo, como seria o mesmo para o jogador para atacar
sem rumo e perder seus recursos, sem qualquer efeito real.
Aqui est a nova lista para o PlayerInput.cs script:
usando UnityEngine;
utilizando System.Collections.Generic;
classe pblica PlayerInput : MonoBehaviour {
pblica Lista < MyCollectableData > myCollection = nova Lista < MyCollectableData > ();
pblica de materiais CubeMaterial;
pblica MyStack pilha = new MyStack ();
bool privada MATCH = false ;
#region variveis para o nvel 2
int pblica ROOM_SELECTION;
bool pblica game_over;
#endregion
#region variveis para o nvel 3
pblica GameObject myStorageUnit;
pblica GameObject myBullet;
pblica GameObject myGun;
public int NUM_BULLETS;

pblica GameObject MyEnemy;


#endregion
anular Awake ()
{
este .stack.clear ();
este .ROOM_SELECTION = -1;
este .GAME_OVER = false ;
este .match = false ;
este .NUM_BULLETS = 1;
// Certifique-se que comece a limpo
este .myCollection.Clear ();
}
// Use isso para inicializao
vazio Iniciar () {
pgina 137
Vah Karamian
123
Se ( esse .myEnemy == nulo )
{
este .myEnemy = GameObject .FindGameObjectWithTag ( "Inimigo" ) como GameObjecto ;
}
}
private float VELOCIDADE = 2.0F;
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .GAME_OVER)
{
se (! este .match)
{
// Cdigo para o movimento do jogador (CP) para a frente
se ( Input .GetKey ( KeyCode .UpArrow))
{
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime *
este .SPEED);
}
// Cdigo para o movimento do jogador (CP) para trs
se ( Input .GetKey ( KeyCode .DownArrow))
{
este .transform.Translate ( Vector3 .Contra * Tempo .deltaTime *
este .SPEED);
}
// Cdigo para o movimento do jogador (CP) esquerda
se ( Input .GetKey ( KeyCode .LeftArrow))
{
este (.transform.Rotate Vector3 .At, -5);
}
// Cdigo para o movimento do jogador (CP) direita
se ( Input .GetKey ( KeyCode .RightArrow))
{

este (.transform.Rotate Vector3 .At, 5);


}
// Ir em frente e colocar a nossa estrutura de armazenamento na posio
onde o jogador a
se ( Input .GetKeyUp ( KeyCode .space))
{
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
GameObject storageObj = GameObject .Instantiate ( este .myStorageUnit, pos, este .transform.rotation) como GameObject ;
storageObj.name = cadeia .format ( "StorageUnit {0}" , Tempo .time);
}
// fogo
se ( Input .GetKeyUp ( KeyCode .F))
{
Se ( este .NUM_BULLETS> 0)
{
GameObject bala = GameObject .Instantiate ( este .myBullet,
pgina 138
Unity 3D - Jogo de Programao Intro
124
este .myGun.transform.position, este .myGun.transform.roo) como GameObject ;
bullet.GetComponent < corpo rgido > (). velocidade = transform.TransformDirection ( novo Vector3 (0, 0, 10.0f));
GameObject .Destroy (bala, 3.0f);
este .NUM_BULLETS--;
}
}
}
Se ( este .match)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
RaycastHit selectedCollectable;
// Capturar a posio do mouse e lana um raio para ver o que obJECT ns batemos
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora selectedCollectable, 200))
{
se (selectedCollectable.transform.tag.Equals ( "MyCollectcapazes " ))
{
var recolher = selectedCollectable.transform.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
MyCollectableData sd = NULL ;
// Pilha de seleo

Se (stack.COUNT> 0)
{
sd = ( MyCollectableData ) stack.peek ();
Se (sd.size <data.size)
{
stack.push (dados);
}
outro
{
Debug log ( "Desculpe Try Again ...!" );
stack.clear ();
}
}
outro
pgina 139
Vah Karamian
125
{
stack.push (dados);
}
}
}
}
Se (stack.COUNT> = 3)
{
para ( int i = 0; i <= stack.COUNT + 1; i ++)
{
MyCollectableData d = ( MyCollectableData ) stack.pop ();
Debug log ( cadeia .format ( "Pop: {0}" , d.size));
}
Debug log ( "GRANDE TRABALHO !!! Objectivo Concludo!" );
este .match = false ;
}
#endregion
}
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "MyCollectable" ))
{
var recolher = c.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
este .myCollection.Add (dados);
Destroy (c.gameObject);
}
Se (c.tag.Equals ( "DropOffZone" ))
{

Se ( este .myCollection.Count> 2)
{
Vector3 centro = c.transform.position;
int index = 1;
foreach ( var d neste .myCollection)
{
Vector3 pos = CirclePath (centro, 1.0f, index);
ndice ++;
Quaternion rot = Quaternion .FromToRotation ( Vector3 .forward,
Centro - pos);
GameObject tmp = GameObject .CreatePrimitive ( PrimitiveTipo .Cube);
pgina 140
Unity 3D - Jogo de Programao Intro
126
tmp.transform.position = pos;
tmp.transform.rotation = podrido;
tmp.transform.tag = "MyCollectable" ;
tmp.transform.localScale = new Vector3 (d.size, d.size,
d.size);
tmp.GetComponent < Renderer > () Material =. presente .CubeMaterial;
// Anexar componente coleccionvel, aplicam-se os dados
tmp.gameObject.AddComponent < MyCollectable > ();
tmp.gameObject.GetComponent < MyCollectable .> () ID = d.ID;
tmp.gameObject.GetComponent < MyCollectable > () size = d.size.;
}
// Tudo foi processado, comear combinando
este .match = verdadeiro ;
}
}
}
// Funo para colocar a posio calcule do prximo item de torno
// Um caminho circular.
Vector3 CirclePath ( Vector3 center, flutuador raio, int id)
{
flutuador ang = 90 * id; //Random.value * 360;
Vector3 pos;
pos.x = center.x + raio * Mathf .Sin (ang * Mathf .Deg2Rad);
pos.z = center.z + raio * Mathf .Cos (ang * Mathf .Deg2Rad);
pos.y = center.y + 1;
voltar pos;
}
public void RoomVisited ( SlidingDoor quarto)
{
se (quarto! = NULL )
{
este .stack.push (quarto);
cadeia msg = cadeia .format ( "Room # {0} inserido, a contagem de pilha = {1}" ,
room.ROOM_NUMBER, este .stack.COUNT);
Debug log (msg);
Se ( este .stack.COUNT> = 3)

{
Debug log ( "VOC GANHA !!!" );
este .GAME_OVER = verdadeiro ;
}
}
}
}
Cdigo Bloco 35 - PlayerInput.cs com funo ataque inimigo
pgina 141
Vah Karamian
127
Olhando para o cdigo que usamos a tecla 'F' na
teclado para comear a disparar as balas no inimigo.
Isto feito atravs da verificao e certificando-se de que h balas no
o inventrio. Uma vez que a bala inicializado, ele dada uma velocidade que
vai usar o motor de fsica para a sua trajetria. Finalmente, auto destruir
o objeto do jogo depois de um certo perodo de tempo, que passa a ser 3 segundos.
Agora podemos dar uma olhada no script inimigo e estudar a estrutura
do cdigo. Aqui est a lista para MyEnemy.cs com o recurso de ataque
implementadas:
usando UnityEngine;
usando System.Collections;
classe pblica MyEnemy : MonoBehaviour
{
pblicas GameObject MyBase;
pblicas GameObject MyStorage;
privada GameObject myStorageObj;
pblica GameObject MyEnemy;
pblica GameObject myBullet;
pblica GameObject myGun;
public int NUM_BULLETS;
// variveis para temporizador
public float Mytime = 5.0f;
private float endTime = 0.0f;
bool pblica ATAQUE;
bool pblica SCOUT;
pblica Transform [] scoutPoints;
private int nextPointIndex;
// Use isso para inicializao
anular Iniciar ()
{
este .NUM_BULLETS = 1;
este .ATTACK = verdadeiro ;
este .myEnemy = GameObject .FindGameObjectWithTag ( "Player" ) como GameObjecto ;
// Inicia temporizador
pgina 142
Unity 3D - Jogo de Programao Intro
128

este .endTime = este .myTime + Tempo .time;


este .nextPointIndex = 0;
}
private float VELOCIDADE = 2.0F;
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .myStorageObj == nulo )
{
Se ( esse .endTime < Tempo .time)
{
// Soltar o armazenamento
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .myStorageObj = GameObject .Instantiate ( este .myStorage, pos,
este .myStorage.transform.rotation) como GameObject ;
este .endTime = 0.0f;
}
}
Se ( este .NUM_BULLETS> 1)
{
este .ATTACK = verdadeiro ;
}
outro
{
este .ATTACK = false ;
}
// Procurar o jogador para atacar
Se ( este .ATTACK)
{
Vector3 refillHeading = este .myEnemy.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime *
este .SPEED);
Se ( Vector3 .distance ( este .myEnemy.transform.position, este .transform.position) <5.0f)
{
Se ( este .NUM_BULLETS> 0)
{
Se ( esse .endTime < Tempo .time)
pgina 143
Vah Karamian
129
{
GameObject bala = GameObject .Instantiate ( este .myBullet,

este .myGun.transform.position, este .myGun.transform.roo) como GameObject ;


bullet.GetComponent < corpo rgido > (). velocidade = transform.TransformDirection ( novo Vector3 (0, 0, 10.0f));
GameObject .Destroy (bala, 3.0f);
// Inventrio diminuio
este .NUM_BULLETS--;
// Definir o temporizador antes da prxima tacada
este .endTime = este .myTime + Tempo .time;
}
}
}
}
outro
{
Se ( este .scoutPoints.Length> 0)
{
Vector3 refillHeading = esta .scoutPoints [nextPointIndex] .posio - este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
Se ( Vector3 .distance ( este .transform.position, este .scoutPontos [nextPointIndex] .position) <0.25f)
{
este .nextPointIndex + = 1;
Se ( esse .nextPointIndex> = este .scoutPoints.Length)
{
este .nextPointIndex = 0;
}
}
}
}
}
}
Cdigo Bloco 36 - MyEnemy.cs com funo de Ataque
Se voc observar a modificao para o recurso de ataque semelhante forma como
temos implementado para o jogador, mas h uma grande diferena, ns
integraram um temporizador na lgica para que o computador no dispara
pgina 144
Unity 3D - Jogo de Programao Intro
130
continuamente. O temporizador ir permitir que o jogador a fazer um movimento e tambm
para o inimigo em si no para drenar todos os seus recursos em um curto espao de
Tempo.
A lgica temos implementado no muito sofisticado e pode
ser melhorado um pouco. Nesse ponto, eu quero que voc tome a oportunidade

e veja como voc pode melhorar a lgica um passo adiante. eu vou te dar
uma dica, se voc jogar o nvel e prestar ateno aos detalhes que voc vai notar
que o inimigo vai atirar se o jogador est dentro de dois metros dele, mesmo
embora o inimigo no est voltada para o jogador. Este um inconveniente que a
lgica atual no leva em considerao, portanto, uma melhoria
seria para se certificar de que o inimigo est sempre de frente para o jogador antes de
incndios. Isso algo que pode ser facilmente implementado e eu faria
que voc faa essa parte em seu prprio pas.
pgina 145
Vah Karamian
131
Captulo 5 - Criando a interface do usurio
User Interface (UI) um aspecto muito importante de qualquer softsistema ware. Afinal, esta a forma como os usurios esto indo para ser capaz de
interagir com seus aplicativos, jogos e ambientes. Neste tulo
ter, vamos dar uma olhada na nova arquitetura UI disponvel com
Unidade 5. Se voc tiver feito qualquer desenvolvimento em verses antigas do Unity,
voc vai apreciar o novo reforo, que so feitas no novo relocao de Unity 5.
Design de interface de usurio e desenvolvimento uma arte por si s. Assim como
qualquer outra coisa, leva anos de prtica e experincia na rea de realiado a ajustar seus projetos de interface do usurio. No h cincia na concepo de uma interface
de usurio
per-se, no entanto, bons designers de interface do usurio tocar em outras cincias humanas e
cincias da arte para trazer algo nico.
Figura 44 - Interface de usurio Amostra 1
Uma vez que cada UI vai ser exclusivo para o ambiente que voc est
projetando para, ser muito importante para o designer UI Compreenso
suportar o sistema dentro e por fora. Eu no estou falando sobre a tcnica
detalhes de como as coisas podem funcionar internamente, mas, voc deve estar ciente
de todas as especificaes para as entradas e as sadas do sistema.
pgina 146
Unity 3D - Jogo de Programao Intro
132
Isto levar a uma melhor tomada de deciso quando voc est projetando o
layout de sua interface do usurio e as caractersticas e funes disponveis em um determinado
Tempo.
Figura 45 - Interface de usurio Amostra 2
Interfaces de usurio vm em muitas formas e formas. Como mencionado BE
tona, ele realmente se resume a que tipo de informao que voc deseja
compartilhar com o jogador, e que tipo de funcionalidade, se for o caso, voc teria
gostaria de fornecer para o jogador.
Os princpios de design de interface na unidade 5
Se voc tem experincia com a criao de interfaces de usurio com o anterior
verses de Unidade, voc sabe que ele foi extremamente entediante e limitado.
Com a introduo da Unidade 5, o motor de UI de base tem sido
melhorou dez vezes.
os Canvas
Um pouco de fundo e diverso. O que um Canvas?
"Canvas um tecido-plain extremamente durvel usado para MAK

ing velas, tendas, toldos, mochilas e outros itens para os quais


resistncia necessria. Ele tambm popularmente usado por artistas como uma pintura
superfcie, normalmente esticado atravs de uma moldura de madeira ".
pgina 147
Vah Karamian
133
Na cincia da computao e visualizao, a tela um recipiente que
detm vrios elementos de desenho (linhas, formas, texto, quadros que contm
outros elementos, etc.). Ela leva o seu nome a partir da tela usado no Visual
artes. s vezes chamado um grafo de cena, porque organiza a lgica
representao de uma interface de usurio ou cena grfica. alguns aplicataes tambm definem a representao espacial e permitir que o usurio
interagir com os elementos por meio de uma interface de utilizador grfica.
Em Unity 3D, a tela a rea que todos os elementos de interface do usurio deve ser
dentro. um GameObject com um componente de tela a ela ligada, e
todos os elementos de interface do usurio deve ser filhos de tal Canvas.
Ordem de desenho e Modos de Desenho:
elementos da interface na tela so desenhados na mesma ordem em que aparecem
na hierarquia. O primeiro filho desenhada em primeiro lugar, o segundo filho seguinte,
e etc ... Se dois elementos de interface do usurio se sobrepem, o que mais tarde ir aparecer no
topo
do um anterior.
Modos de Desenho:
H trs modos de renderizao disponveis para a lona:
Espao Tela - Overlay: Este modo de renderizao coloca elemento UI
mentos na tela processado no topo da cena. Se o
tela redimensionada ou resoluo de mudanas, os Canvas vai aumaticamente alterar o tamanho para coincidir com ele.
Espao Screen - Cmara: semelhante tela Space - Overleigos, mas neste modo de renderizao, a lona colocado um determinado
distncia na frente de uma cmera especificada. Os elementos de interface do usurio
so prestados pela Cmara, o que indica que o Camconfiguraes era ir ter um efeito sobre a aparncia da IU
elementos.
Space World: Neste modo de renderizao, os Canvas ir se comportar
como qualquer outro objeto na cena. O tamanho da tela pode
ser ajustado manualmente usando seu Rect Transform, e os elementos de interface do usurio
pgina 148
Unity 3D - Jogo de Programao Intro
134
retribuir na frente ou atrs de outros objetos na cena
com base no posicionamento 3D. Isto til para interfaces de usurio que so
destina-se a ser uma parte do mundo. Isto tambm conhecido como um
"Interface diegtico".
Esquema Bsico
Cada elemento da interface do usurio representada como um retngulo para fins de layout.
Esse retngulo pode ser manipulado na Scene View usando o Rect
Ferramenta na barra de ferramentas. A ferramenta Rect usada tanto para recursos 2D do Unity
e para IU, e na verdade pode ser usado at mesmo para objetos em 3D tambm.
Figura 46 - Rect da barra de ferramentas Ferramenta Botes

A ferramenta Rect pode ser usado para mover, redimensionar e girar elementos de interface do
usurio.
Depois de ter seleccionado um elemento de interface do usurio, voc pode mov-lo clicando anywhere dentro do retngulo e arrastando. Voc pode redimension-la clicando
nas bordas ou cantos e arrastando.
O elemento pode ser girado passando o cursor um pouco longe
a partir dos cantos at que o cursor do mouse se parece com um smbolo de rotao.
Em seguida, voc pode clicar e arrastar em qualquer direo para girar.
Assim como as outras ferramentas, a ferramenta Rect usa o modo de giro atual
e espao, situado na barra de ferramentas. Ao trabalhar com UI geralmente uma boa
idia para manter os estabelecidos para Pivot e Local.
Rect Transformao:
A Rect Transform um novo componente transformar que usado para
todos os elementos de interface do usurio, em vez de regular Transform componente.
Rect transformaes tm posio, rotao e escala apenas como regulares
Transforma, mas tambm tem uma largura e uma altura, utilizado para especificar o dimenses do retngulo.
pgina 149
Vah Karamian
135
Figura 47 - Rect Transform Component
Piv:
Rotaes, tamanho, e modificaes escala ocorrer em torno do piv assim
a posio do piv afecta o resultado de uma rotao, redimensionamento, ou
escalonamento. Quando o boto da barra de ferramentas Pivot est no modo de piv, o piv
de um Rect Transform pode ser movido na Scene View.
Figura 48 - Pivot interface
ncoras e Presets ncora:
Rect transformaes incluem um conceito de layout chamado ncoras. ncoras
so mostrados como quatro pequenas alas triangulares na Scene View e aninformaes Chor tambm mostrado no Inspector. Se o pai de um Rect
Transformar tambm um Rect transformar, a criana Rect Transform pode ser
pgina 150
Unity 3D - Jogo de Programao Intro
136
ancorado matriz Ret Transformada de vrias maneiras. Por exemplo,
a criana pode ser ancorada ao centro da matriz, ou a um dos
cantos.
Figura 49 - Anchor UI Elements
A ancoragem tambm permite que a criana para esticar juntamente com o
largura ou a altura do pai. Cada canto do retngulo tem um fixo
offset para sua ncora correspondente, ou seja, o canto superior esquerdo da rectangle tem um deslocamento fixo para o incio ncora esquerda, etc. Desta forma, o diferente
cantos do rectngulo pode ser ancorado a diferentes pontos na matriz
retngulo.
No Inspector, o boto Anchor predefinidos podem ser encontrados no upper canto esquerdo do Rect Transform componente. Ao clicar no boto
traz no menu suspenso ncora Presets. A partir daqui voc pode rapidamente
selecionar a partir de algumas das opes de ancoragem mais comuns. Voc pode anchor o elemento UI para os lados ou no meio do pai, ou estiramento

em conjunto com o tamanho de pai. A ancoragem horizontal e vertical


independente.
pgina 151
Vah Karamian
137
Figura 50 - Pr-selecionar Anchor Component
Os Anchor Presets botes mostra a predefinio actualmente seleccionada
opo se houver um. Se as ncoras de ambos a horizontal ou vertical
eixo esto definidos para diferentes posies do que qualquer uma das predefinies, o costume
opes mostrado.
Unidade componentes de interface do utilizador 5
Existem dois tipos de componentes de interface do usurio na unidade. H Visual
Componentes e componentes interativos . Vamos comear por olhar para
o Visual Components primeiro, e depois os Componentes Interactive.
Componentes Visuais:
Estes so os UIElements que so usados para displayinformation volta
para o utilizador. Vou dar-lhe apenas a viso geral e se voc cavar
mais profunda para eles em seu prprio pas.
texto: a componente de texto, que tambm conhecido como um rtulo,
tem uma rea de texto para introduzir o texto que ser exibido.
possvel definir a fonte, estilo da fonte, tamanho da fonte e se
pgina 152
Unity 3D - Jogo de Programao Intro
138
ou no o texto tem capacidade de texto rico. H opes para
definir o alinhamento do texto, as definies para horizontal e verestouro ticos que controlar o que acontece se o texto
maior do que a largura ou altura do rectngulo, e uma melhor
opo de ajuste que faa o texto redimensionar para se ajustar ao disponveis
espao.
Image: Uma imagem tem um Rect Transform componente e um
componente de imagem. Um sprite pode ser aplicada imagem
componente sob o campo Target Graphic, e sua cor
pode ser definido no campo Cor. Um material tambm pode ser aplicado
ao componente de imagem. Os define campo Tipo de Imagem
como o sprite aplicada aparecer, as opes so:
o simples
o em fatias
o Azulejo
o Filled
As imagens podem ser importadas como sprites UI selecionando Sprite (
2D / UI) a partir das definies do 'tipo de textura ". Sprites tm exconfiguraes tra importao em comparao com os antigos sprites GUI, o
maior diferena a adio do editor de sprites. o
editor de sprites fornece a opo de 9-cortar a imagem, este
divide a imagem em 9 reas de modo que se o sprite redimensionada
os cantos no so esticados ou distorcidos.
Imagem Raw: O componente de imagem leva um sprite, mas Raw
Imagem tem uma textura (sem fronteiras etc). Imagem crus devem
s pode ser usado se for necessrio outro modo Imagem ser adequado

na maioria dos casos.


Mask: A mscara no um controle UI visvel, mas sim uma maneira
para modificar a aparncia dos elementos filho de um controle. o
restringe mscara (ou seja, "mscaras") A criana elementos para a forma
do pai. Assim, se a criana maior do que o pai ento
pgina 153
Vah Karamian
139
apenas a parte da criana que se encaixa dentro do pai ser
visvel.
Efeitos: componentes visuais tambm podem ter vrias simples
efeitos aplicados, como uma sombra simples ou esquema.
Componentes interativos:
Cada UI precisa ter algum tipo de um elemento intratvel a ele.
Esse o usurio precisa ser capaz de selecionar alguma coisa. Estes so elemento UI
mentos que o utilizador pode interagir com, como um:
Boto: O boto projetado para iniciar uma ao quando
o usurio clica e libera-lo. Se o mouse movido para fora da
controle de boto antes do clique liberado, a ao faz
no ter lugar. O boto tem um nico evento chamado On
Clique que responde quando o usurio conclui um clique.
Alternar: O controle de alternncia permite que o usurio alternar uma
opo ligado ou desligado. Voc tambm pode combinar vrios alterna em
um grupo de alternncia nos casos em que apenas um de um conjunto de opes
deve ser ao mesmo tempo. A alternncia tem um nico evento chamado
Em valor alterado que responde quando as alteraes do usurio
o valor atual. O novo valor passado para o evento
funo como um parmetro booleano.
Grupo de alternncia: O Grupo de alternncia est configurado, arrastando o
Grupo de alternncia objeto para a propriedade Grupo de cada um dos
Alterna no grupo. Alternar Grupos so teis em qualquer lugar
o usurio deve fazer uma escolha entre um conjunto mutuamente exclusivos
de opes. Exemplos comuns incluem jogador de seleo
tipos de caracteres, configuraes de velocidade (lento, mdio, rpido, etc),
cores predefinidas e dias da semana. Voc pode ter mais de
Um grupo de alternncia objeto na cena de cada vez, para que voc possa
criar vrios grupos separados, se necessrio.
deslizante: O valor de um deslizante determinada pela posio
da pega ao longo do seu comprimento. O valor aumenta a partir da
pgina 154
Unity 3D - Jogo de Programao Intro
140
Min Valor at o valor mximo em proporo com o distncia a ala arrastado. O comportamento padro para o
deslizante para aumentar a partir da esquerda para a direita, mas tambm possvel
reverter esse comportamento usando a propriedade Direction.
Voc tambm pode definir o controle deslizante para aumentar verticalmente selecionveis
ing baixo para cima ou de cima para baixo para o Direction
propriedade. O controle deslizante tem um nico evento chamado sobre o valor
Mudou isso responde como o usurio arrasta a ala. o

valor numrico corrente do cursor passado para a funo


como um parmetro flutuante.
Barra de rolagem: O valor de uma barra de rolagem determinada pela
posio da pega ao longo do seu comprimento com o valor sendo
relatado como uma fraco entre as extremidades extremas. Para a provaplo, o padro da esquerda para a direita bar tem um valor de 0.0 na esquerda
fim, 1,0 na extremidade direita e 0,5 indica o ponto no meio do caminho.
A barra de rolagem pode ser orientada verticalmente, escolhendo Top de
Baixo ou de baixo para cima para o jogador a propriedade Direction.
Uma diferena significativa entre a barra de rolagem eo simcontrole de Ilar Slider que o cabo da barra de rolagem pode mudar
em tamanho para representar a distncia de deslocamento disponvel; quando
a viso pode rolar apenas um pouco mais, a ala vai encher-se
a maior parte do bar e onlyallow uma ligeira mudana qualquer direo.
A barra de rolagem tem um nico evento chamado On valor alterado
que responde como o usurio arrasta a ala. O atual
valor passado para a funo mesmo como um parmetro flutuante.
suspensa: a lista suspensa
16
pode ser usado para permitir que o usurio
escolher uma nica opo de uma lista de opes. O controle
mostra a opo atualmente escolhido. Uma vez clicado, abre-se
a lista de opes para uma nova opo pode ser escolhida. sobre
a escolha de uma nova opo, a lista de fechada novamente, eo concontrole mostra a nova opo selecionada. A lista tambm est fechado
16
Olhe para a documentao on-line para todas as opes e configuraes disponveis.
pgina 155
Vah Karamian
141
Se o usurio clica no controle propriamente dito, ou em qualquer outro lugar inlado a lona.
O campo de entrada: Um campo de entrada uma maneira de tornar o texto de uma
Controle de texto editvel. Como os outros controles de interao,
no um elemento de interface do usurio visvel em si mesmo e deve ser combinada
com um ou mais elementos de interface visual, a fim de ser visvel.
O script Campo de entrada pode ser adicionado a qualquer texto existente
objeto de controle a partir do menu (Componente> UI> Input
Campo). Tendo feito isso, voc tambm deve arrastar o objeto para
propriedade de texto do campo de entrada para permitir a edio.
O texto de propriedade do controle de texto em si vai mudar medida
os tipos de usurios e o valor pode ser recuperado a partir de um roteiro
aps a edio. Note-se que Rich Text intencionalmente no apoiar
portado para controles de texto editvel; o campo ser aplicada qualquer
marcao Rich Text instantaneamente quando digitado, mas a marcao escialmente "desaparece" e no h nenhuma maneira para subsequente
alterar ou remover o styling.
Scroll Rect: Um Scroll Rect pode ser usado quando o contedo que
toma-se uma grande quantidade de espao necessrio para ser exibida numa pequena rea.
O Scroll Rect fornece a funcionalidade para se deslocar ao longo deste
contedo. Normalmente, um Scroll Rect combinado com uma mscara em

Para criar uma exibio de rolagem, onde apenas o con- rolagem


tenda dentro do Scroll Rect visvel. Ele pode tambm adicionalmente
ser combinada com uma ou duas barras de deslocamento que pode ser
arrastado para rolar horizontalmente ou verticalmente.
Criao de interface primeiro usurio
Agora que voc tem uma compreenso da tela e as difeOs elementos da interface do utilizador ent disponveis para voc, ns podemos ir em frente e obter
mos em prtica atravs da criao de nossa primeira UI.
Usaremos os nveis que desenvolvemos no captulo anterior
para demonstrar os conceitos e tambm dar uma viso geral do sistema de UI
na Unidade 5. Ns criamos nveis de rvore para a demonstrao da
pgina 156
Unity 3D - Jogo de Programao Intro
142
mecnica de jogo conceitos. Vamos em frente e inclu-los aqui, e tambm
os objectivos para cada um. Isto importante, porque voc precisa de Compreenso
ficar os objectivos do nvel para ser capaz de projetar seu UI para apoiar
seu ambiente de jogo.
Se voc se lembrar estes eram os nveis que discutimos:
Nvel 1: pesquisa; coleta; correspondncia e classificao.
Nvel 2: Chancing; mistura e temporizao
Nvel 3: progredindo; evaso; capturando e conquistar
Para projetar a interface do usurio para o nvel 1, que seria necessrio para exibir algumas informaes para o usurio sobre o estado do jogo. No anterior
captulo usamos debug.log () como uma forma de testar e depurar a nossa lgica. Em um
forma a dar-nos uma atualizao sobre o estado do ambiente. Isso, entretanto,
no visvel para o jogador e que seria necessrio para criar algo que
ser mais atraente para eles.
Nvel 1 - UI design
Para comear a criar o nosso UI, precisamos introduzir uma tela de jogo, ObserJECT em nossa cena. A maneira mais fcil de fazer isso clicando com o boto direito na
Janela Hierarquia e do menu de contexto , selecione ( UI-> Canvas ).
Isto ir colocar um jogo de objeto em tela em sua cena. Queremos definir
o modo de renderizao de tela Space - Overlay
17
Se este no o conjunto de valores
j.
Existem dois principais informaes que precisa para se comunicar com o
jogador: (1) quantos colecionveis itens existem na cena, (2) como
muitos itens o jogador tenha coletado. Podemos combinar dois elementos de interface do usurio
para exibir esta informao para o jogador:
Painel
Texto
17
Este modo de renderizao coloca elementos de interface do usurio na tela prestados no topo da
cena.
pgina 157
Vah Karamian
143

Para adicionar um elemento de interface do usurio do painel, voc deve clicar com o boto direito
na Hierarquia
Janela sobre o Jogo lona objeto, e selecione ( Painel UI-> ). Isso vai
adicionar um elemento Panel como um filho para o jogo lona objeto. Por padro,
o Painel ir preencher toda a tela.
Figura 51 - Canvas com painel Anexado
Observe como a Janela de jogo mudou com a tela sobreleigos do jogo lona objeto. Queremos ter certeza de que o Painel
elemento UI no ocupam todo o espao. Selecionando a interface do usurio do painel
elemento, podemos usar a janela Inspetor para ajustar as propriedades.
A primeira coisa que gostaria de fazer mudar as ncoras do
Painel. Podemos usar a configurao predefinida para ancorar o controle para a
canto superior esquerdo da tela. Quando voc fazer a mudana, observe que
o Rect Transform atualizados seus valores posX / Posy e largura / altura.
Ns estaremos ajustando esses valores para a nossa ligao. Eu tenho feito em frente e
atualizados meus valores para o seguinte:
Pos X: 50
Pos Y: -25
Largura: 100
Altura: 50
pgina 158
Unity 3D - Jogo de Programao Intro
144
A largura ea altura, definir a largura real ea altura
o painel em pixels, e os valores de posio so deslocamento relativo a
o ponto de ancoragem.
Vamos em frente e adicionar a elementos de interface do usurio texto, para fazer isso, voc vai
clique novamente com o boto direito na janela de hierarquia no elemento Panel, e
select ( UI-> Texto ). Esta aco ir criar um elemento de texto e torn-lo um
filho do Painel. Note tambm que na janela Inspetor, bydefault,
o elemento de texto est ancorada no centro, com a largura padro e
altura.
Existem algumas propriedades que eu tenho
mudou no elemento de texto.
No Rect Transform , eu atualizei
Largura e Altura para ser 80 e
40, respectivamente.
No texto componente Script, tenho
mudou o alinhamento a ser horizontalmente
tally centrado e verticalmente tambm
centrado.
Por ltimo, tenho verificado o melhor ajuste
caixa de verificao para auto-corrigir o texto no
rea fornecida.
Observe, que voc tambm pode alterar o
fonte e o tamanho da fonte, bem como a
cor do texto, ou at mesmo aplicar Material a ser utilizado para o processamento.
Temos agora comps uma interface simples que pode ser usado para dar alguma
feedback para o jogador. Quanto ao design de interface est em causa, estamos
feito neste ponto. Mas, preciso ser capaz de atualizar o elemento de texto

pgina 159
Vah Karamian
145
de alguma forma, de dentro do nosso jogo! A fim de sermos capazes de alcanar
isso, seria preciso fazer alguma codificao menor.
Figura 52 - Painel de UI e texto Elemento
Precisamos ser capazes de referenciar o UIElement texto de nosso cdigo,
e uma vez que temos uma referncia, podemos atualizar o texto de propriedade do
Texto elemento de interface do usurio.
Desde o PlayerInput.cs roteiro responsvel por manter o controle do
estatuto para o jogo, vamos criar uma nova varivel pblica do tipo Texto
que ser usada para se referir ao elemento de interface de texto.
Gostaramos de atualizar a classe adicionando as duas variveis seguintes:
pblicas texto lblCollectables;
private int colecionveis = 0;
E gostaramos de mudar a nossa Iniciar () funo de ser algo como o
Segue:
anular Iniciar ()
{
Se ( esse .myEnemy == nulo )
{
este .myEnemy = GameObject .FindGameObjectWithTag ( "Inimigo" ) como GameObjecto ;
}
pgina 160
Unity 3D - Jogo de Programao Intro
146
Se ( esse .lblCollectables! = NULL )
{
GameObject [] colecionveis = GameObject .FindGameObjectsWithTag ( "MyCollectable " );
este .Colecionveis = collectables.Length;
este .lblCollectables.text = cadeia .format ( "{0} / {1}" , este .myCollection.Count, este .Colecionveis);
}
}
Finalmente, seria preciso atualizar as informaes durante o jogo
tempo, por conseguinte, que ir tambm incluir o seguinte segmento no Update () funo.
Se ( esse .lblCollectables! = NULL )
{
este .lblCollectables.text = cadeia .format ( "{0} / {1}" , este .myCollection.Count, este .Colecionveis);
}
A interface resultante seria algo como isto:
Figura 53 - Collectables UI Implementado
Ento ns criamos um aspecto do nosso UI, mas temos mais trabalho
faam. Uma vez que recolher todas as nossas colees, temos de encontrar o drop
Zona e ser capaz de igualar os colecionveis com base em seu tamanho. Ns

pgina 161
Vah Karamian
147
seria necessrio para implementar uma interface que pode identificar corretamente este
processo para o jogador de uma forma agradvel.
Uma vez que, estamos usando uma estrutura de dados Stack para manter a ordem de
seleo realizada pelo jogador, podemos criar a nossa UI para esta tarefa em
de forma semelhante. Alm disso, gostaramos de displaythis UIportion especfica
uma vez que o usurio tenha coletado todos os itens colecionveis e est no drop
Zona . Por isso, quando que desencadeia, vamos tambm apresentar o especfica UI
para correspondncia. Para que isso funcione corretamente, seria preciso criar um novo
Objeto de lona. Lembre-se, que podemos ter objeto Canvas mltipla
a cena, e cada tela pode ser usada para uma finalidade diferente dentro
a cena e ativada ou desativada, conforme necessrio.
Para criar uma segunda tela, voc vai clicar com o boto direito na Hierarquia
Janela e, no menu de contexto, selecione ( UI-> Canvas ). Voc poderia
quiser adicionar um novo elemento do painel e tambm objetos de elemento de trs botes
ao Painel. O processo o mesmo para adicionar qualquer elemento de interface do usurio, por isso
estamos
No indo para listar que qualquer mais.
Figura 54 - UI adicional para Matching
pgina 162
Unity 3D - Jogo de Programao Intro
148
Uma vez que voc projetou a interface do usurio na Scene View, precisaramos
para criar o cdigo para acessar e control-lo. No mnimo, precisamos
ser capaz de ativar e desativar o objeto da lona com base em alguns critrios.
Tambm precisamos atualizar a legenda dos elementos de boto com base no
seleo do usurio na Gota-Zone .
pblica Canvas canvasMatching;
pblica Texto lblStackTop;
pblica Texto lblStackMiddle;
pblica Texto lblStackBottom;
Cdigo Bloco 37 - Nvel 1 Variveis de lona Jogo
Ns podemos facilmente configurar algumas variveis para fazer referncia a interface necessria
obJECT como mostrado i n Cdigo Bloco 37. Mas olhe para o cdigo temos
escrito anteriormente, no estamos realmente lidando com isso corretamente. Para fazer o
processo ea interface do usurio um pouco mais intuitivo, que provavelmente deve adicionar dois
mais botes na interface do usurio, dando ao jogador a capacidade quer redefinir o
jogo inteiro, ou no caso de correspondncia, ser capaz de experimentar o desafio
mais uma vez. Levando isso dois nova adio em considerao, o nosso UI ser
atualizados para se parecer com o seguinte:
Figura 55 - Elementos de interface do usurio adicionais para Nvel 1
Desde ento, temos melhorado a nossa UI, precisamos rever nossa lgica para
o matchmaking e tambm atualiz-lo corretamente para refletir as novas alteraes.
A primeira tarefa que devemos fazer criar as funes boto de gatilho, em
pgina 163
Vah Karamian
149

menos o espao reservado. Ns iria introduzir duas novas funes para lidar com
os eventos CLICK durante os botes recm-criados: butRestartClick ()
e butTryAgainClick () .
public void butRestartClick ()
{
Aplicao .LoadLevel ( "CH6_LEVEL_1" );
}
public void butTryAgainClick ()
{
// Manipular o evento tente novamente
}
Cdigo Bloco 38 - Boto dispara para o Nvel 1
As funes listadas acima ir lidar com o OnClick evento para cada
boto respectivamente. Ns ainda precisamos de ligar essas funes com as OnClique evento. A fim de fazer isso, voc precisar selecionar o desejado
boto a partir da janela de hierarquia , e da janela Inspector ,
voc precisar adicionar um novo evento na OnClick () propriedade.
Figura 56 - Boto OnClick evento
Assim, desde o Inspector Window , voc ir para o boto
Componente Script e adicione um
manipulador de eventos clicando no
(+) Boto. Isto ir criar um
slot de soltar vazio para voc.
Voc vai precisar de arrastar e soltar
o GameObject que o Evento
Handler est conectado, em nossa
caso o GameObject CP.
Uma vez que colocado no
slot vazio, voc vai usar o
lista suspensa para selecionar o
Script-> Funo (), que ir
manipular o evento OnClick.
Isto acontece por ser PlayerInput.butRestartClick () para o nosso cdigo.
isso! Voc acabou de criar seu manipulador de eventos primeiro boto. No
pgina 164
Unity 3D - Jogo de Programao Intro
150
altura desta escrita, a funo Unidade de evento s pode receber um tro
eter, da, se houver uma necessidade de passar vrios parmetros, uma maneira
contornar essa limitao, criar mltiplas funes e mltipla
manipulador de eventos e anex-las apenas como ns fizemos. Neste ponto cada vez
o boto clicado em tempo de execuo, que so re-carregar todo o nvel.
Aqui esto os trechos de cdigo para as adies e tambm de modificao
que tenham sido aplicadas PlayerInput.cs script:
public void butRestartClick ()
{
Aplicao .LoadLevel ( "CH6_LEVEL_1" );
}
public void butTryAgainClick ()
{

// Manipular o evento tente novamente


este .stack.clear ();
este .lblStackBottom.text = "0" ;
este .lblStackMiddle.text = "0" ;
este .lblStackTop.text = "0" ;
}
As duas funes que lidam com o boto OnClick evento para o
Boto reiniciar eo boto Try Again esto listados acima. A Awake ()
funo foi removida, eo Start () funo foi modificada
para chamar uma nova funo para repor todas as variveis chamadas RESETgame () . Aqui
a listagem:
private void RESETgame ()
{
este .stack.clear ();
este .ROOM_SELECTION = -1;
este .GAME_OVER = false ;
este .match = false ;
este .NUM_BULLETS = 1;
// Certifique-se que comece a limpo
este .myCollection.Clear ();
}
// Use isso para inicializao
vazio Iniciar () {
pgina 165
Vah Karamian
151
este .ResetGame ();
Se ( esse .myEnemy == nulo )
{
este .myEnemy = GameObject .FindGameObjectWithTag ( "Inimigo" ) como GameObjecto ;
}
#region cdigo para elementos de interface do usurio - Nvel 1
Se ( esse .lblCollectables! = NULL )
{
GameObject [] colecionveis = GameObject .FindGameObjectsWithTag ( "meuColecionveis " );
este .Colecionveis = collectables.Length;
este .lblCollectables.text = cadeia .format ( "{0} / {1}" , este .myCollection.Count, este .Colecionveis);
}
Se ( esse .canvasMatching! = NULL )
{
este .canvasMatching.enabled = false ;
Se ( esse .lblStackTop! = NULL )
{
este .lblStackTop.text = "0" ;
}
Se ( esse .lblStackMiddle! = NULL )
{
este .lblStackMiddle.text = "0" ;

}
Se ( esse .lblStackBottom! = NULL )
{
este .lblStackBottom.text = "0" ;
}
este .butTryAgain.gameObject.SetActive ( false );
}
#endregion
}
Basicamente, o RESETgame () funo fazer o que a Awake ()
funo usada para fazer, no entanto, uma vez que temos a capacidade de re-iniciar o
jogo durante o jogo, e o recurso de reincio basicamente carrega o nvel
mais uma vez, estamos usando o Start () funo para chamar a RESETgame () funo
o para redefinir todas as variveis no nvel.
O Update () funo tambm foi modificado para acomodar o
as novas alteraes que fizemos atravs da interface do usurio. Voc vai notar que agora,
quando o jogador escolhe trs itens correspondentes, se eles no so ordenados
corretamente, um boto, apresentado para dar-lhes a oportunidade de experimentar novamente.
pgina 166
Unity 3D - Jogo de Programao Intro
152
Aqui est a lista para a nova lgica de lidar com a entrada do mouse na
) Update ( funo:
Se ( este .match)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
//Debug.Log("START JOGO >>> ");
RaycastHit selectedCollectable;
// Capturar a posio do mouse e lana um raio para ver o que obJECT ns batemos
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora selectedCollectable, 200))
{
//Debug.Log("TAG="+selectedCollectable.transform.tag);
se (selectedCollectable.transform.tag.Equals ( "MyCollectcapazes " ))
{
//Debug.Log("YOU Clicado ME >>> ");
var recolher = selectedCollectable.transform.gameObject.GetComponent < MyCollectable > ();
MyCollectableData dados = novas MyCollectableData ();
data.ID = collect.ID;
data.size = collect.size;
MyCollectableData sd = NULL ;
Se ( este .stack.COUNT <3)
este .stack.push (dados);
Debug log ( "PILHA COUNT =" +
stack.COUNT.ToString ());
interruptor (stack.COUNT)

{
case 1:
este .lblStackBottom.text data.size.ToString = ();
break;
Caso 2:
este .lblStackMiddle.text =
data.size.ToString ();
break;
Caso 3:
este .lblStackTop.text data.size.ToString = ();
break;
}
}
}
pgina 167
Vah Karamian
153
}
Se (stack.COUNT> = 3)
{
bool WIN = false ;
ArrayList tmp = new ArrayList ();
para ( int i = 0; i <= stack.COUNT + 1; i ++)
{
MyCollectableData d = ( MyCollectableData ) stack.pop ();
Debug log ( cadeia .format ( "Pop: {0}" , d.size));
tmp.Add (d);
}
se (((( MyCollectableData ) tmp [0]). de tamanho> (( MyCollectableData ) tmp [1]). size) && ((( MyCollectableData ) tmp [1]). size>
(( MyCollectableData ) tmp [2]). Size))
{
Debug log ( "GRANDE TRABALHO !!! Objectivo Concludo!" );
este .match = false ;
}
outro
{
este .butTryAgain.gameObject.SetActive ( verdadeiro );
}
}
#endregion
}
Ns completamos nosso projeto UI inicial para o Nvel 1. Agora vamos
dar uma olhada em como implementar a interface do usurio para o nvel 2.
Nvel 2 - UI design
Para o Nvel 2, o jogador teve que selecionar um gerador aleatrio que
indicam que quarto ele ou ela tinha que visitar. Aps a seleo foi feita,
o jogador foi dado um conjunto especfico de tempo para ser capaz de visitar a sala.
Aps a visita, o temporizador seria de descanso, eo quarto seria marcado
como visitado.
O nosso IU deve ser concebido de forma a capturar o estado do

ambiente a qualquer momento. Ento, precisamos de uma maneira para exibir o


timer. Tambm seria bom para exibir o objetivo para o jogador; aquele
que quarto ele ou ela tem que visitar. E, finalmente, deve haver uma maneira
para indicar se o jogador ganhou o jogo ou no, e como sempre uma maneira
para eles para repetir o jogo, como um reincio.
pgina 168
Unity 3D - Jogo de Programao Intro
154
Uma vez que existem algumas semelhanas entre a interface do usurio para o Nvel 2 e
a interface do usurio para o Nvel 1, podemos facilitar a vida copiando o Canvas
Gamebjects temos definido no Nvel 1 e col-los no Nvel 2.
Obviamente, vamos fazer algum mudou, mas no geral ele vai nos dar uma
boa base para comear.
Figura 57 - Nvel 2 Nvel Concept
Vamos comear por implementar a interface do usurio do temporizador em primeiro lugar.
Queremos basicamente criar um novo elemento de painel com um elemento de texto associado e
ancor-la para o canto superior direito da tela. Se bem se lembram, o script
que manipula o temporizador est ligado ao RoomSelection GameObject
eo prprio script chamado RoomSelection.cs . Para exibir o timer,
teremos de criar uma referncia para o rtulo e, basicamente, certifique-se
que ele est exibindo o valor adequado durante o ciclo de atualizao.
Quando isso acontece, podemos tambm estabeleceu o objectivo de o jogador no
mesmo script. Seria preciso criar uma nova varivel para fazer referncia ao
Texto objectivo e, basicamente, atualizar o contedo com base no leitor de
seleco durante o jogo. Aqui est a lista de cdigos para o novo script:
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica RoomSelection : MonoBehaviour
pgina 169
Vah Karamian
155
{
pblica GameObject playerCharacter = NULL ;
#region Variveis UI
pblica Texto lblTimer;
pblica Texto lblObjective;
#endregion
// Use isso para inicializao
anular Iniciar ()
{
Se ( esse .lblTimer! = NULL )
{
este .lblTimer.text = "0" ;
}
Se ( esse .lblObjective! = NULL )
{
este .lblObjective.text = cadeia .format ( "Select Randomizer!" );
}

// Se o characte jogador no est definido em tempo de design


// Atribui-lo durante o tempo de execuo antes do jogo comear
Se ( esse .playerCharacter == nulo )
{
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" )
como GameObject ;
}
}
// MYtime ser usada para dar a quantidade de tempo em segundos
// Para o jogador para encontrar o quarto !!!
public float Mytime = 33.0f;
private float endTime = 0.0f;
// Update chamado uma vez por quadro
anular Update ()
{
este .transform.Rotate ( novo Vector3 (1, 1, 1), 1.0f);
Se ( esse .endTime> Tempo .time)
{
este .lblTimer.text = Mathf .CeilToInt ( este .endTime Tempo .time) .ToString ();
Debug log ( "Temporizador iniciado !!!" + Mathf .CeilToInt ( este .endTime Tempo .time) .ToString ());
}
else if ( esta .endTime == 0.0f)
{
este .lblTimer.text = "0" ;
; // No fazer nada
}
outro
{
Debug log ( "Time Ended !!!" );
pgina 170
Unity 3D - Jogo de Programao Intro
156
este .playerCharacter.GetComponent < PlayerInput .> () game_over = verdadeiro ;
}
// Distncia de seleo entre este objeto e o personagem do jogador
flutuador distncia = Vector3 .distance ( este .transform.position, este .playerCharacter.transform.position);
Se (distncia <2.0F)
{
#region RATO DE ENTRADA
se ( Input .mousePosition! = nulo && entrada .GetMouseButtonUp (0))
{
int color = Aleatrio .Range (0, 3);
interruptor (cor)
{
caso 0:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .blue;

este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 0;


este .lblObjective.text = cadeia .format ( "Find Azul
Room " );
break;
}
case 1:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .Red;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 1;
este .lblObjective.text = cadeia .format ( "Find Red
Room " );
break;
}
Caso 2:
{
este .transform.GetComponent < Renderer > (). material.color
= Cor .Green;
este .playerCharacter.GetComponent < PlayerIncolocar .> () ROOM_SELECTION = 2;
este .lblObjective.text = cadeia .format ( "Find Verde
Room " );
break;
}
}
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
}
#endregion
}
}
public void ResetTimer ()
pgina 171
Vah Karamian
157
{
este .endTime = 0.0f;
este .lblObjective.text = cadeia .format ( "Select Randomizer" );
}
}
Cdigo Bloco 39 - Nvel 2 Timer e cdigo UI Objectivo
Quando voc executa a cena agora, voc ver uma tela semelhante
Segue:
O prximo elemento UI queremos implementar quando o jogador vis
seu quarto que suposto encontrar. Uma vez que temos trs quartos,
pode reutilizar o nosso Painel de Jogo existente de Nvel 1. Ns apenas teria
para escrever um novo pedao de cdigo para atualizar o subttulo de acordo com o objectivos para o Nvel 2.
Para conseguir isso, vamos ter que atualizar vrios arquivos de script.

Se bem se lembram, temos trs scripts que so especificamente relacionados com


Nvel 2: RoomSelection.cs , SlidingDoor.cs e PlayerInput.cs .
Se voc olhar para os scripts, as principais atualizaes esto realmente acontecendo
na RoomSelection.cs script eo PlayerInput.cs script. SlidingDoor.cs est provocando uma funo no PlayerInput.cs roteiro para indicar
o quarto foi visitada.
pgina 172
Unity 3D - Jogo de Programao Intro
158
No OnCollisionEnter () funo dentro da SlidingDoor.cs
script, se estiverem reunidas as condies adequadas, o RoomVisited () funo
instou a PlayerInput.cs script. Ento seria preciso atualizar essa
Scrip para refletir as informaes corretas no Painel de Estado Objectivo
exibio.
Aqui est a lista para a revista RoomVisited () funo no
PlayerInput.cs roteiros:
public void RoomVisited ( SlidingDoor quarto)
{
se (quarto! = NULL )
{
este .stack.push (quarto);
cadeia msg = cadeia .format ( "Room # {0} inserido, a contagem de pilha = {1}" ,
room.ROOM_NUMBER, este .stack.COUNT);
Debug log (msg);
#region usado para o elemento de interface do usurio
interruptor (room.ROOM_NUMBER)
{
caso 0:
{
este .lblStackTop.text = "Blue" ;
quebrar ;
}
Caso 1:
{
este .lblStackBottom.text = "Red" ;
quebrar ;
}
Caso 2:
{
este .lblStackMiddle.text = "Green" ;
quebrar ;
}
}
#endregion
Se ( este .stack.COUNT> = 3)
{
Debug log ( "VOC GANHA !!!" );
este .lblObjective.text = "Voc ganhou !!!" ;
este .GAME_OVER = verdadeiro ;
este .butTryAgain.gameObject.SetActive ( verdadeiro );
}

}
pgina 173
Vah Karamian
159
}
Cdigo Block 40 - funo Revista RoomVisited () para o Nvel 2
Repare que ns adicionamos uma instruo switch para determinar qual sala
foi visitado e atualizar o boto de legendas no painel de conformidade.
Uma vez que essa funo tambm determina se o jogador tiver completado o nvel
com sucesso, temos tambm incluiu uma linha para permitir que o Try Again mastonelada que vai ser utilizado para repetir o jogo.
Agora ns tambm precisamos fazer algumas alteraes nos RoomSelection.cs
script. Aqui est o trecho para as atualizaes que tnhamos de fazer para que script:
Se ( esse .endTime> Tempo .time)
{
este .lblTimer.text = Mathf .CeilToInt ( este .endTime Tempo .time) .ToString ();
Debug log ( "Temporizador iniciado !!!" + Mathf .CeilToInt ( este .endTime Tempo .time) .ToString ());
}
else if ( esta .endTime == 0.0f)
{
este .lblTimer.text = "0" ;
; // No fazer nada
}
outro
{
Debug log ( "Time Ended !!!" );
pgina 174
Unity 3D - Jogo de Programao Intro
160
este .playerCharacter.GetComponent < PlayerInput .> () game_over = verdadeiro ;
este .lblObjective.text = "VOC PERDER !!!" ;
este .lblTimer.text = "0" ;
este .playerCharacter.GetComponent < PlayerInput > (). butTryAgain.gameObject.SetActive ( verdadeiro );
}
Temos agora concluda a implementao da interface do usurio para Nvel 1 e
Nvel 2 . Vamos dar uma olhada na implementao UI de Nvel 3 .
Nvel 3 - UI design
Para o nvel 3, que seria necessrio para criar um tipo totalmente diferente de um
UI. No nvel 3, o nosso objectivo criar uma instalao de armazenamento que ser
recolher e armazenar recursos para ns. O objectivo do nvel para o
jogador para matar o adversrio e para o adversrio para matar o jogador. Quemsempre faz isso primeiro o vencedor.
Figura 58 - Nvel 3 Concept UI
Nossa UI tero de ser concebidos de forma a dar-nos informaes
sobre o estado dos nossos recursos, a nossa sade e tambm a prxima colrecurso lectable. Seria bom tambm ter um displayrelevant wayto

pgina 175
Vah Karamian
161
mensagens para o jogador. Por exemplo, certificando-se que eles sabem que precisam
para criar uma instalao de armazenamento para recolher recursos.
Ns tambm gostaramos de mostrar a sade do nosso adversrio, mas no
necessariamente os seus recursos. Mesmo que isso bem possvel fazer
se optar por inclu-lo no projeto.
O cdigo de atualizao principal para a sade, o inventrio e as mensagens sero
estar ocorrendo no PlayerInput.cs arquivo script. Aqui est um trecho de cdigo
do cdigo comprovativos necessrios para a configurao inicial dos rtulos em cima
inicializao do nvel:
// Variveis para o nvel 3 UI
pblica Texto lblHealth;
pblicas texto lblResources;
pblicas texto lblMessages;
#endregion
...
private void ResetLevel3UI ()
{
Se ( esse .lblHealth! = NULL )
este .lblHealth.text = cadeia .format ( "{0} / 100" , este .Sade);
se ( este .lblResources! = NULL )
este .lblResources.text = este .NUM_BULLETS.ToString ();
se ( este .lblMessages! = NULL )
este .lblMessages.text = "Use o espao-CHAVE a cair Storage Facility
para comear a recolher recursos ". ;
}
Uma vez que largar a instalao de armazenamento, podemos usar o Painel de Mensagem
para exibir o status do coletor de recursos. A fim de executar este
tarefa, seria preciso executar vrias etapas-chave.
Seria preciso atualizar o painel de mensagem cada vez que um
deste aes acontecem:
1. instalaes de armazenamento ignorado
2. Unidade Collector est viajando para a rea de Recursos
3. Unidade Collector est viajando para instalaes de armazenamento
4. Unidade Collector est a carregar recursos.
5. Unidade Collector est descarregando recursos.
pgina 176
Unity 3D - Jogo de Programao Intro
162
Os scripts que iro lidar com as atualizaes de interface do usurio so: MyStorage.cs , meuCollector.cs , MyResource.cs e, claro, PlayerInput.cs scripts. o
seguinte listagem de cdigo ir exibir o script completo para MyStorage.cs , meuCollector.cs e MyResource.cs roteiros:
usando UnityEngine;
usando System.Collections;
classe pblica MyStorage : MonoBehaviour
{
pblica GameObject myCollector;
privada GameObject collectorObj;

privada GameObject playerCharacter;


// variveis para temporizador
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .collectorObj = GameObject .Instantiate ( este .myCollector, pos,
este .transform.rotation) como GameObject ;
este .collectorObj.GetComponent < MyCollector > (). MyStorage = este .gameObjecto;
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" ) como
GameObject ;
este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
"Storage Facility Criado!" ;
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .endTime> Tempo .time)
{
cadeia msg = cordas .format ( "Descarregar Recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorObj.GetComponent < MyCollector > () UpdateMessage (msg).;
}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
pgina 177
Vah Karamian
163
este .collectorObj.GetComponent < MyCollector .> () GOTO_RESOURCE = verdadeiro ;
int collectedResources = este .collectorObj.GetComponent < MyCollector > () UNINTS_COLLECTED.;
// Adiciona bala personagem do jogador
este .playerCharacter.GetComponent < PlayerInput > (). = + NUM_BULLETS
collectedResources;
este .playerCharacter.GetComponent < PlayerInput > () UpdateResources ().;
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnCollisionEnter ( Collision c)
{
Se (c.transform.tag.Equals ( "CollectorUnit" ))
{

c.transform.GetComponent < MyCollector .> () GOTO_STORAGE = false ;


// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
cadeia msg = cordas .format ( "Descarregar Recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
c.transform.GetComponent < MyCollector > () UpdateMessage (msg).;
}
}
}
Cdigo Bloco 41 - Listagem MyStorage.cs para UI design
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica MyCollector : MonoBehaviour
{
pblica GameObject myResource;
pblicas GameObject MyStorage;
bool pblica GOTO_RESOURCE;
bool pblica GOTO_STORAGE;
int pblica UNINTS_COLLECTED;
privada GameObject playerCharacter;
// Use isso para inicializao
anular Iniciar ()
{
este .myResource = GameObject .FindGameObjectWithTag ( "ResourcePlayer" )
como GameObject ;
este .GOTO_RESOURCE = verdadeiro ;
este .GOTO_STORAGE = false ;
pgina 178
Unity 3D - Jogo de Programao Intro
164
este .UNINTS_COLLECTED = 0;
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" ) como
GameObject ;
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( este .GOTO_RESOURCE)
{
// Goto a localizao dos recursos para a coleta
Vector3 refillHeading = este .myResource.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
int distance = Mathf .CeilToInt ( Vector3 .distance ( este .transform.po-

sio, este .myResource.transform.position));


este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
cadeia .format ( "Distncia para o recurso {0}" , a distncia);
}
Se ( este .GOTO_STORAGE)
{
Vector3 refillHeading = este .myStorage.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
int distance = Mathf .CeilToInt ( Vector3 .distance ( este .transform.posio, este .myResource.transform.position));
este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
cadeia .format ( "Distncia para armazenamento {0}" , a distncia);
}
}
public void UpdateMessage ( string de mensagem)
pgina 179
Vah Karamian
165
{
este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
mensagem;
}
}
Cdigo Bloco 42 - Listagem MyCollector.cs para UI design
usando UnityEngine;
usando System.Collections;
classe pblica MyResource : MonoBehaviour
{
pblica GameObject collectorUnit;
// variveis para temporizador
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .endTime> Tempo .time)
{
cadeia msg = cadeia .format ( "cobrana dos recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorUnit.GetComponent < MyCollector > () UpdateMessage (msg).;

}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
este .collectorUnit.GetComponent < MyCollector .> () GOTO_STORAGE = verdadeiro ;
este .collectorUnit.GetComponent < MyCollector > (). = UNINTS_COLLECTED
1;
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "CollectorUnit" ))
{
c.GetComponent < MyCollector .> () GOTO_RESOURCE = false ;
este .collectorUnit = c.gameObject;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
pgina 180
Unity 3D - Jogo de Programao Intro
166
cadeia msg = cadeia .format ( "cobrana dos recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorUnit.GetComponent < MyCollector > () UpdateMessage (msg).;
}
}
}
Cdigo Bloco 43 - Listagem MyResource.cs para UI design
Seria preciso atualizar o rtulo de recursos e o Selo de Sade
cada vez que uma destas aes acontecem:
1. Recurso carregada nas instalaes de armazenamento.
2. O jogador atingido pelo inimigo.
Se voc tem prestado ateno e testar o tempo de cdigo
discuti-lo no livro, voc deve ter notado que h alguns
pequenos bugs no Nvel 3. Em primeiro lugar, ns nunca implementou uma maneira de capturar
A sade do jogador ou o inimigo. Segundo, quando os recursos
foram recolhidos e levados de volta para a instalao de armazenamento, voc pode ter
notado que os incrementos dos recursos no foi realizada cortamente aps a primeira coleo. Isto porque ns nunca repor o
varivel na Unidade de coletor de volta a 0 aps a descarga.
Outra questo aqui que ns no implementaram uma maneira de parar
o jogo! Precisamos ter certeza de que quando o jogador ou o inimigo
morre, paramos todos os objetos em movimento dentro do jogo e exibir o bom
mensagem. As seguintes listagens colocar tudo junto para fazer Nvel
3 concluir tanto do UIside do desenvolvimento e tambm o jogo
lado a mecnica do desenvolvimento.
Lista completa para MyStorage.cs :

usando UnityEngine;
usando System.Collections;
classe pblica MyStorage : MonoBehaviour
{
pblica GameObject myCollector;
privada GameObject collectorObj;
privada GameObject playerCharacter;
pgina 181
Vah Karamian
167
// variveis para temporizador
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .collectorObj = GameObject .Instantiate ( este .myCollector, pos,
este .transform.rotation) como GameObject ;
este .collectorObj.GetComponent < MyCollector > (). MyStorage = este .gameObjecto;
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" ) como
GameObject ;
este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
"Storage Facility Criado!" ;
}
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .playerCharacter.GetComponent < PlayerInput > (). game_over)
{
Se ( esse .endTime> Tempo .time)
{
cadeia msg = cordas .format ( "Descarregar Recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorObj.GetComponent < MyCollector > (). UpdateMessage (msg);
}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
este .collectorObj.GetComponent < MyCollector > (). = GOTO_RESOURCE
verdade ;
int collectedResources = este .collectorObj.GetComponent < MyCollector .> () UNINTS_COLLECTED;
este .collectorObj.GetComponent < MyCollector > (). = UNINTS_COLLECTED

0;
// Adiciona bala personagem do jogador
este .playerCharacter.GetComponent < PlayerInput > (). = + NUM_BULLETS
collectedResources;
este .playerCharacter.GetComponent < PlayerInput > (). UpdateResources ();
}
}
pgina 182
Unity 3D - Jogo de Programao Intro
168
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnCollisionEnter ( Collision c)
{
Se (c.transform.tag.Equals ( "CollectorUnit" ))
{
c.transform.GetComponent < MyCollector .> () GOTO_STORAGE = false ;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
cadeia msg = cordas .format ( "Descarregar Recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
c.transform.GetComponent < MyCollector > () UpdateMessage (msg).;
}
}
}
A listagem completa para MyCollector.cs :
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica MyCollector : MonoBehaviour
{
pblica GameObject myResource;
pblicas GameObject MyStorage;
bool pblica GOTO_RESOURCE;
bool pblica GOTO_STORAGE;
int pblica UNINTS_COLLECTED;
privada GameObject playerCharacter;
// Use isso para inicializao
anular Iniciar ()
{
este .myResource = GameObject .FindGameObjectWithTag ( "ResourcePlayer" )
como GameObject ;
este .GOTO_RESOURCE = verdadeiro ;
este .GOTO_STORAGE = false ;
este .UNINTS_COLLECTED = 0;
este .playerCharacter = GameObject .FindGameObjectWithTag ( "Player" ) como
GameObject ;
}
pgina 183

Vah Karamian
169
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .playerCharacter.GetComponent < PlayerInput > (). game_over)
{
Se ( este .GOTO_RESOURCE)
{
// Goto a localizao dos recursos para a coleta
Vector3 refillHeading = este .myResource.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
int distance = Mathf .CeilToInt ( Vector3 .distance ( este .transform.position, este .myResource.transform.position));
este .playerCharacter.GetComponent < PlayerInput > (). lblMessages.text = cadeia .format ( "Distncia para o recurso {0}" , a distncia);
}
Se ( este .GOTO_STORAGE)
{
Vector3 refillHeading = este .myStorage.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
int distance = Mathf .CeilToInt ( Vector3 .distance ( este .transform.position, este .myResource.transform.position));
este .playerCharacter.GetComponent < PlayerInput > (). lblMessages.text = cadeia .format ( "Distncia para armazenamento {0}" , a distncia);
}
}
}
public void UpdateMessage ( string de mensagem)
{
este .playerCharacter.GetComponent < PlayerInput > (). = lblMessages.text
mensagem;
}
}
pgina 184
Unity 3D - Jogo de Programao Intro
170

Lista completa de MyResource.cs :


usando UnityEngine;
usando System.Collections;
classe pblica MyResource : MonoBehaviour
{
pblica GameObject collectorUnit;
// variveis para temporizador
public float Mytime = 3.0f;
private float endTime = 0.0f;
// Use isso para inicializao
anular Iniciar ()
{
}
// Update chamado uma vez por quadro
anular Update ()
{
Se ( esse .endTime> Tempo .time)
{
cadeia msg = cadeia .format ( "cobrana dos recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorUnit.GetComponent < MyCollector > () UpdateMessage (msg).;
}
else if ( esta .endTime == 0.0f)
{
; // No fazer nada
}
outro
{
este .endTime = 0.0f;
este .collectorUnit.GetComponent < MyCollector .> () GOTO_STORAGE = verdadeiro ;
este .collectorUnit.GetComponent < MyCollector > (). = UNINTS_COLLECTED
1;
}
}
// Essa funo manipula a coliso de aceleradores como um gatilho
vazio OnTriggerEnter ( Collider c)
{
Se (c.tag.Equals ( "CollectorUnit" ))
{
c.GetComponent < MyCollector .> () GOTO_RESOURCE = false ;
este .collectorUnit = c.gameObject;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
cadeia msg = cadeia .format ( "cobrana dos recursos: {0}" ,
Mathf .CeilToInt ( este .endTime - Tempo .time));
este .collectorUnit.GetComponent < MyCollector > () UpdateMessage (msg).;
pgina 185
Vah Karamian
171
}
}

}
Para os scripts inimigas, MyStorageEnemy.cs , MyCollectorEnemy.cs e MyResourceEnemy.cs so todos semelhantes ao jogador do
roteiros, apenas as referncias tm de ser atualizado para apontar para o inimigo
roteiros e ou pr-fabricados.
No entanto, aqui o MyEnemy.cs script que nico:
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica MyEnemy : MonoBehaviour
{
pblicas GameObject MyBase;
pblicas GameObject MyStorage;
privada GameObject myStorageObj;
pblica GameObject MyEnemy;
pblica GameObject myBullet;
pblica GameObject myGun;
public int NUM_BULLETS;
// variveis para temporizador
public float Mytime = 5.0f;
private float endTime = 0.0f;
bool pblica ATAQUE;
bool pblica SCOUT;
pblica Transform [] scoutPoints;
private int nextPointIndex;
bool pblica game_over;
int privada de sade;
pblica Texto lblHealth;
// Use isso para inicializao
anular Iniciar ()
{
este .NUM_BULLETS = 1;
este .ATTACK = verdadeiro ;
pgina 186
Unity 3D - Jogo de Programao Intro
172
este .myEnemy = GameObject .FindGameObjectWithTag ( "Player" ) como GameObjecto ;
// Inicia temporizador
este .endTime = este .myTime + Tempo .time;
este .nextPointIndex = 0;
este .GAME_OVER = false ;
este .Sade = 100;
Se ( esse .lblHealth! = NULL )
este .lblHealth.text = cadeia .format ( "{0} / 100" , este .Sade);
}
private float VELOCIDADE = 2.0F;
// Update chamado uma vez por quadro
anular Update ()
{
se (! este .GAME_OVER)

{
Se ( esse .myStorageObj == nulo )
{
Se ( esse .endTime < Tempo .time)
{
// Soltar o armazenamento
Vetor3 POS = novo vetor3 ( este .transform.position.x + 1, 2,
este .transform.position.z + 1);
este .myStorageObj = GameObject .Instantiate ( este .myStorage,
pos, este .myStorage.transform.rotation) como GameObject ;
este .endTime = 0.0f;
}
}
Se ( este .NUM_BULLETS> 1)
{
este .ATTACK = verdadeiro ;
}
outro
{
este .ATTACK = false ;
}
// Procurar o jogador para atacar
Se ( este .ATTACK)
{
Vector3 refillHeading = este .myEnemy.transform.position este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer transio suave ...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
pgina 187
Vah Karamian
173
Quaternion .LookRotation (refillHeading), 10 *
Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime *
este .SPEED);
Se ( Vector3 .distance ( este .myEnemy.transform.position,
este .transform.position) <5.0f)
{
Se ( este .NUM_BULLETS> 0)
{
Se ( esse .endTime < Tempo .time)
{
GameObject bala = GameObject .Instantiate ( este .myBuldeixei,
este .myGun.transform.position, este .myGun.transform.rotation) como GameObject ;
bullet.GetComponent < corpo rgido > (). velocidade = transform.TransformDirection ( novo Vector3 (0, 0, 10.0f));
GameObject .Destroy (bala, 3.0f);

// Inventrio diminuio
este .NUM_BULLETS--;
// Definir o temporizador antes da prxima tacada
este .endTime = este .myTime + Tempo .time;
}
}
}
}
outro
{
Se ( este .scoutPoints.Length> 0)
{
Vector3 refillHeading = esta .scoutPoints [nextPointIndex] .posio - este .transform.position;
refillHeading.Normalize ();
// Usar a funo Quaternion Slerp para fazer uma transio suave
...
este .transform.rotation =
Quaternion .Slerp (transform.rotation,
Quaternion .LookRotation (refillHeading),
10 * Tempo .deltaTime);
este .transform.Translate ( Vector3 .forward * Tempo .deltaTime);
Se ( Vector3 .distance ( este .transform.position, este .scoutPontos [nextPointIndex] .position) <0.25f)
{
este .nextPointIndex + = 1;
Se ( esse .nextPointIndex> = este .scoutPoints.Length)
{
pgina 188
Unity 3D - Jogo de Programao Intro
174
este .nextPointIndex = 0;
}
}
}
}
}
}
vazio OnCollisionEnter ( Collision c)
{
se (c.transform.tag.Equals ( "bullet" ))
{
Destroy (c.gameObject);
este .Sade - = 25;
este .lblHealth.text = cadeia .format ( "{0} / 100" , este .Sade);
Se ( este .Sade <= 0)
{
este .GAME_OVER = verdadeiro ;
este .myEnemy.GetComponent < PlayerInput > (). = game_over
este .GAME_OVER;
}

}
}
}
Vimos agora a implementao de algumas mecnicas de jogo
temos discutido no captulo Mecnica de jogo e neste captulo
vimos como criar elementos de interface de usurio relacionados que vai
apoiar a mecnica do jogo.
Enquanto voc estava estudando este captulo e passando por cima da UI desinais, voc pode ter pensado para si mesmo sobre a simplicidade deles.
Isso intencional como este livro voltado para programadores de jogos /
desenvolvedores. H mais nfase na codificao e scripting e
menos sobre os grficos. Dito isto, para aqueles que so mais criativos,
voc pode ter o que voc aprendeu neste livro e aplicar sua prpria
toque criativo.
H algumas pequenas melhorias que podemos fazer melhorar o nosso usurio
design de interface mais. Isso abordado na prxima seo.
pgina 189
Vah Karamian
175
Melhorar a interface do usurio
Nesta seo, ter de nvel 3 e fazer algumas adies ao
o design da interface do usurio. O layout principal no ser a mudana, mas o que eu faria
quer demonstrar a facilidade de como usar texturas para melhorar a
olhar e sentir dos elementos de interface do usurio.
Figura 59 - Outra amostra UI
Agora que voc est familiarizado com os conceitos bsicos de design de interface do usurio ea
interface do usurio
Arquitetura em Unity, que pode lev-lo um pouco mais. De um modo geral,
quando voc est projetando e desenvolvendo o seu jogo, voc vai ter um
equipe de pessoas dedicadas apenas para a criao de contedo e modelos grficos
para os fins do projecto. Voc estar trabalhando com eles entregar
mo para incorporar o seu design elegante para o ambiente do jogo.
A maior parte da UI ter altamente polido 2D textura grfica que
pode ser usado para fornecer temas visualmente atraente para o jogador. eu quero
para mostrar-lhe como fcil de incorporar essas texturas na nova interface
Arquitetura em Unity 5.
pgina 190
Unity 3D - Jogo de Programao Intro
176
Considere nosso design de interface do usurio para o nvel 3:
O layout da interface do usurio muito bom para os fins deste demonstrado
strao. O que pode melhorar o aspecto visual da interface do usurio. Um dos
grandes mudanas que podemos aplicar uma textura para o elemento Panel UI. No
momento estamos usando todas as texturas padro que vm com o Unity
e eles trabalham muito bem para prototipagem, o que ns fizemos. Agora, vamos aplicar
algumas texturas mais interessante.
Para esta parte para funcionar corretamente, voc ter que realmente tem um bom
compreenso de como as dimenses de sua interface do usurio e texturas. Isso vai ajudar na
tornando texturas mais finas. No nosso caso, temos trs painis gostaramos
para aplicar uma textura para:

Painel de Status - (333px X 50 pixels)


Painel de Mensagens - (444px X 50 pixels)
Painel de Sade Enemy - (135px X 50 pixels)
As dimenses de cada painel listado ao lado do item. Ns vamos
usar essas dimenses para criar nossas texturas. Como voc j sabe, o meu
pgina 191
Vah Karamian
177
habilidades criativas no vo ser to agradvel como o seu. Tendo dito isto,
aqui esto as texturas eu vim acima com para cada Painel:
Figura 60 - Background Painel de Estado
Figura 61 - Mensagem Fundo do painel
Figura 62 - Fundo do painel Inimigo
Depois de criar sua textura desejada, ser necessrio import-lo
em Unity. Voc pode simplesmente usar o sistema de arquivos em seu Sys operacional
TEM copiar e colar os arquivos para a pasta de ativos dentro do seu
Pasta do projeto. Eu coloquei minhas texturas no seguinte diretrio:
<Pasta do projeto> / Assets / Texturas / CH5 /
Depois de importar suas texturas, voc vai precisar para realizar algumas
configuraes nas texturas. Uma vez que estas vo ser as texturas da IU,
precisamos mudar o tipo de textura de textura de Sprite (2D e
UI) . Depois de selecionar o bom tipo de textura, voc ter que clicar
pgina 192
Unity 3D - Jogo de Programao Intro
178
o Aplicar boto para que as alteraes tenham efeito. Executar esta para todos
sua interface texturas.
NOTA: Voc vai notar que h mais propriedades e opes
disponvel. Vou deixar que voc estud-los em seu prprio pas. Estas propriedades sero
vm em handier em jogos baseados em 2D Sprite.
Agora hora de aplicar a nossa primeira textura. V em frente e selecione
o estado do painel elemento UI da Janela Hierarquia no Nvel 3 .
D uma olhada na janela Inspetor , e voc vai notar que h
uma imagem Componentes e que tem uma propriedade para definir a Imagem
Fonte . Arraste e solte a textura projetado para o Painel de Estado em
esta propriedade. Execute o mesmo para cada um o outro painel temos
definida na cena. Seu UI deve ficar parecido com o seguinte
agora:
Figura 63 - Painel de texturas aplicadas ao nvel 3
Portanto, este parece mais agradvel, em seguida, o padro texturas lisas que tivemos anteamente. A prxima coisa que eu gostaria de fazer fornecer alguns cones para o
imagens que colocamos como espao reservado. Se voc lembrar, as nossas imagens tm uma
dimenso de 40x40 pixels. Ns tecnicamente precisa cones, um ser
pgina 193
Vah Karamian
179
utilizado tanto para a sade do jogador e sade do inimigo, eo outro
ser utilizado para o inventrio do jogador.
O processo para aplicar os cones vo ser semelhantes, primeiro voc

Ser necessrio criar os cones desejados, ento voc ter que import-los
em seu projeto, em seguida, configur-los para ser do tipo Sprite , e
Finalmente, voc precisar selecionar o elemento de interface do usurio, neste caso, a Imagem
elemento de interface do usurio para a sade do jogador e o elemento UI Imagem para a
A sade do inimigo da Janela Hierarquia , e na Imagem Componente , aplicar a textura para a propriedade Image Source. O resultado :
Figura 64 - Nvel 3 UI Enhancement
Como voc pode ver, mesmo um simples aumento na UI ter um
grande impacto sobre a aparncia geral do jogo.
Uma ltima melhoria eu gostaria de ilustrar para a UI a
capacidade de exibir informaes no espao do mundo . Algumas das informaes que voc pode querer considerar para uma exibio Space World seria
Elementos de UI para GameObjects especficos.
pgina 194
Unity 3D - Jogo de Programao Intro
180
Por exemplo, seria bom para mostrar uma barra de sade no leitor
caracteres, o que inclui tanto o jogador e tambm o inimigo. Isto
realmente muito facilmente realizvel na nova arquitectura UI dentro da Unidade.
Vamos dar uma olhada em como podemos implementar esse recurso para o nosso jogador.
Obviamente, precisamos ter um novo conjunto de objeto Canvas. o recmobjeto Canvas criado ser anexado ao nosso personagem do jogador
GameObject, um filho do personagem do jogador (PC). tambm ter a sua
Modo de renderizao definida como Space World . A maneira mais simples para criar este novo
Canvas boto direito do mouse no PC e selecione ( UI-> Canvas ). Uma vez o
tela criado, voc precisar modificar vrias propriedades, o primeiro
o modo de renderizao , v em frente e defini-lo como Space World . O prximo moification ser no Rect Transform Component. Voc quer fazer
Certifique-se a tela relativo ao PC em todos os momentos, ea melhor maneira de fazer
por isso, ter certeza de que ele est posicionado corretamente.
Figura 65 - Propriedades de lona Space World
Em primeiro lugar, mudar as Pos X e Pos Y propriedades para o Rect Transform
a 0 e 0 , respectivamente. Isto ir certificar-se de que voc est alinhado com o
Centro do PC. A prxima propriedade de mudar seria a largura e
a altura da tela. Isso vai depender do que voc est GameObject
anexar a tela para e tambm a finalidade do seu espao Can- Mundial
vas. Neste caso, gostaramos de apresentar apenas uma barra de sade, portanto,
pgina 195
Vah Karamian
181
que no precisa de muito espao. Tambm vamos dar uma olhada na Escala corerty e us-lo para escalar os Canvas sem perder qualidade.
D uma olhada na Figura 65 para ver as propriedades que estabeleci para a minha
projeto. O resultado o seguinte captura de tela:
O resto como antes, precisamos de uma maneira para criar uma barra de sade. o
maneira mais fcil para representar a barra de sade com trs imagens.
Uma das imagens ir representar a fronteira, e os outros dois imas idades vo representar a sade real.
Manter as coisas simples, aqui est como eu quero a minha barra de sade para se parecer com:

pgina 196
Unity 3D - Jogo de Programao Intro
182
Figura 66 - Conceito UI para Bar Sade
A hierarquia para o PC e lona so mostrados na seguinte
figura:
Figura 67 - World Espao Canvas Hierarquia
pgina 197
Vah Karamian
183
O prximo passo criar o cdigo para gerenciar a barra de sade. Ns
seria necessrio uma referncia ao healthBarFG elemento UI Imagem. Ns
seria necessrio modificar o script PlayerInput.cs para atualizar corretamente o
Bar sade. Aqui est o cdigo parcial listando lidar com a atualizao de
o elemento Health Bar UI:
private void ResetLevel3UI ()
{
Se ( esse .lblHealth! = NULL )
este .lblHealth.text = cadeia .format ( "{0} / 100" , este .Sade);
se ( este .lblResources! = NULL )
este .lblResources.text = este .NUM_BULLETS.ToString ();
se ( este .lblMessages! = NULL )
este .lblMessages.text = "Use o espao-CHAVE a cair Storage Facility
para comear a recolher recursos ". ;
Se ( esse .imgHealthBar! = NULL )
{
este .imgHealthBar.fillAmount = ( este .Sade / 100.0f);
}
}
Actualizado () OnCollisionEnter funo:
vazio OnCollisionEnter ( Collision c)
{
se (c.transform.tag.Equals ( "bullet" ))
{
Destroy (c.gameObject);
este .Sade - = 25;
este .lblHealth.text = cadeia .format ( "{0} / 100" , este .Sade);
Se ( esse .imgHealthBar! = NULL )
{
este .imgHealthBar.fillAmount = ( este .Sade / 100.0f);
}
Se ( este .Sade <= 0)
{
este .GAME_OVER = verdadeiro ;
este .myEnemy.GetComponent < MyEnemy > () = game_over. este .GAME_OVER;
Se ( esse .imgHealthBar! = NULL )
{
este .imgHealthBar.fillAmount = 0.0f;
}
}
}

}
pgina 198
Unity 3D - Jogo de Programao Intro
184
Voc j viu uma boa parte de como incorporar UI elementos dentro do seu ambiente de jogo. As ferramentas so bsicos, mas a capacidade
para criar e melhorar sobre os blocos de construo so grandes. Com alguma criatividade e imaginao voc pode obter uma utilizao mais sofisticada
interfaces.
Uma outra modificao que eu faria na barra de sade torn-lo
semitransparente. No momento em que est bloqueando o direito GameObjects
em frente cmara principal, e isso irritante. Para aplicar transparentes
rncia para a barra de sade simplesmente selecione o elemento de interface do usurio e da Cor
Picker reduzir o canal Alpha para todas as imagens para 100. Tambm possvel
aplicar a transparncia antes de importar as imagens em Unity.
Como um desafio ver se voc pode criar uma carga visual e descarregamento
elemento de UI para o coletor.
pgina 199
Vah Karamian
185
Captulo 6 - Criando Battleship
Contexto histrico
O jogo de Battleship pensado para ter suas origens no Francs
jogo L'Attaque jogado durante a Primeira Guerra Mundial I. O jogo dito ter
foi interpretado por oficiais russos antes da Primeira Guerra Mundial O primeiro comercialmente
verso oficial do jogo foi Salvo, publicado em 1931 nos Estados
Unidos pela empresa Starex. Outras verses do jogo foram impressos
na dcada de 1930 e 1940, incluindo combate do Strathmore Empresa:
O Jogo Battleship, de Milton Bradley bordos: A Game of Naval
Estratgia e Combate Guerra Naval de Maurice L. Freedman.
Figura disposio da amostra 68-Grid
Battleship foi um dos primeiros jogos a ser produzido como um computador jogo, com uma verso a ser lanado para o Z80 Compucolor em
1979. Muitas edies do computador do jogo foram produzidos desde ento.
Em Jogos Clubhouse para o Nintendo DS, Battleship conhecido como Grade
Ataque. jogado em uma grade 8 8, e inclui ligeiras variaes, tais
medida que o jogo 4-jogador, vrios tamanhos e formas de navios, bem como a opo para tornar os navios tocam.
pgina 200
Unity 3D - Jogo de Programao Intro
186
game Play
O jogo jogado em quatro redes, dois para cada jogador. as grades
so tipicamente quadrado - geralmente 10 10 - e os quadrados individuais no
grade so identificados pela letra e nmero. Em uma grade os arranjos jogador
navios e grava os tiros bythe oponente. Por outro grade do jogador
registra suas / seus prprios tiros.
Antes do jogo comear, cada jogador secretamente arranja seus navios em
sua rede primria. Cada navio ocupa um nmero de quadrados consecutivos

na grelha, dispostos horizontalmente ou verticalmente. O nmero de


quadrados para cada navio determinada pelo tipo de navio. os navios
no podem se sobrepor (ou seja, apenas um navio pode ocupar qualquer quadrado dado na
grade). Os tipos e o nmero de navios permitidos so as mesmas para cada
jogador. Estas podem variar em funo das regras.
Tipo de navio
Tamanho
Porta-avies
5
Battleship
4
Submarino
3
Destruidor
3
Barco de patrulha
2
Depois que os navios foram posicionados, o jogo continua em uma srie
de rodadas. Em cada rodada, cada jogador d uma guinada para anunciar um alvo
quadrado na grade do adversrio que est a ser alvo de tiros. A an- oponente
nounces se ou no o quadrado ocupada por um navio, e se for um
"Miss", o jogador marca sua rede primria com um pino branco; se um "hit"
eles marcam isso por conta prpria grade primria com um pino vermelho. o atacante
jogador observa o sucesso ou perder em seu prprio grid "tracking" com a APcor propriate peg (vermelho para "hit", branco de "miss"), a fim de construir-se
uma imagem de frota do adversrio.
O jogador que localiza com sucesso todos os navios do oponente primeiro
por bater cada quadrado que ocupam o vencedor como todos os navios tm sido
destrudo.
pgina 201
Vah Karamian
187
Game Plan para a Implementao
Uma vez que temos um bom entendimento do jogo e do jogo
regras, podemos comear a pensar em como implementar nossa verso da
jogo de tabuleiro de batalha.
A primeira coisa que devemos nos concentrar em criar o conselho sobre
que vamos jogar o nosso jogo. Representando a bordo digitalmente
na memria do computador vai ser simples com base nas regras que
temos. H dois itens que precisa pensar sobre (1), representando
a placa visualmente (2) Manter o controle de dados de tabuleiro.
Vamos dar uma olhada e ver como ns estamos indo para representar nosso conselho
visualmente. Sabemos que o conselho vai ser de tamanho N x N. Neste
caso decidimos torn-lo uma placa de 10 x 10. O prximo passo
determinar como ns estamos indo para representar cada unidade nica no tabuleiro.
Para tornar mais fcil, podemos usar um cubo com o vec- escala seguinte
tor: <1,0.1,1> na <x, y, z> coordenadas. Isso nos dar uma unidade agradvel
base para a placa.
Figura 69-Unidade Base Board
pgina 202

Unity 3D - Jogo de Programao Intro


188
A prxima coisa que eu gostaria de fazer, dar a unidade de alguma textura
que se assemelham a um pensionista. Para fazer isso, precisamos criar um novo material e aplicar uma textura que ser semelhante a aparncia desejada. Nas prximas
passo identificar de alguma forma a unidade real pela sua localizao na placa!
Para fazer isso, vamos criar um objeto UI e anex-lo unidade bordo
para exibir a localizao da unidade na placa. A unidade de placa final
algo parecido com isto:
Figura 70-Board Unit com textura e Elementos UI Aplicada
Cada unidade de bordo ser parecido com a Figura 70 . B1 representa o nome
e ID da placa e [00:00] representam a linha e coluna que vai
ser utilizado para identificar a unidade de placa. Uma ltima parte mais que precisamos para
completando a nossa verso inicial da unidade placa um script que ir represenressentir-se os dados internos para a prpria unidade. Isto ir ser chamado
BoardUIVer1.cs e aqui a listagem para ele:
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica BoardUIVer1 : MonoBehaviour {
pgina 203
Vah Karamian
189
pblica Texto lblBoardPosition;
int pblica ROW;
int pblica COL;
bool pblicos ocupados;
// Use isso para inicializao
vazio Iniciar () {
este .OCCUPIED = false ;
}
// Update chamado uma vez por quadro
vazio Update () {
}
}
Cdigo Bloco 44-BoardUIVer1 definio de classe
Uma classe simples que ir armazenar os dados de linha e coluna para a unidade.
Uma referncia para o rtulo de texto interface do usurio para a unidade para que possa ser
atualizado quando
foi instanciado e, finalmente, uma varivel booleano que indica se
a unidade est ocupada ou no.
Os Passos para criar Unidade Board:
1. Criar um cubo primitivo
GameObject, nome-lo
BoardUnit.
2. Alterar a escala a ser
<1,0.1,1> na <x, y, z>
3. Criar um novo tipo de materiais
chamado BoardUnit
4. Atribuir a textura preferida
propriedade Albedo sob

Mapas principais.
5. Atribuir o novo material ao
BoardUnit GameObject
6. Criar um novo script chamado cs
BoardUIVer1.cs
7. Digite o seu cdigo de script e asassinar o script para BoardUnit
GameObject
pgina 204
Unity 3D - Jogo de Programao Intro
190
Uma vez que estamos satisfeitos com a nossa unidade de bordo, gostaramos de criar
o conselho real que consiste em unidades de tabuleiro. Para uma placa com dimenso
ses de 10 x 10, seria preciso usar 100 unidades de tabuleiro!
H duas maneiras de conseguir isso. (1) criar manualmente o
tabuleiro e colocando cem unidades em conjunto, ou (2) Criao de um procedure que vai cuidar dele para voc! Obviamente, a escolha seria
criar um procedimento para lidar com a criao de conselho para ns.
Podemos representar nosso conselho com uma matriz bidimensional. L
so duas coisas que precisam acontecer, seria necessrio para criar a bordo
visualmente e tambm armazenar os dados por unidade de bordo. Podemos usar o nosso favorito
mtodo loop, para ... lao , estrutura para percorrer as nossas linhas e colUMNS.
// Criar um quadro de 10x10 - Conselho 1
int linha = 1;
int col = 1;
para ( int i = 0; i <10; i ++)
{
para ( int j = 0; j <10; j ++)
{
// Instanciar pr-fabricada e coloc-lo corretamente em cena
GameObject tmp = GameObject .Instantiate ( este .BoardUnitPrefab,
nova Vector3 (i, 0, J),
este .BoardUnitPrefab.transform.rotation) como GameObject ;
BoardUIVer1 tmpUI = tmp.GetComponent < BoardUIVer1 > ();
cadeia name = cadeia .format ( "B1: [{00:00}, {01:00}]" , linha, col);
tmpUI.lblBoardPosition.text = nome;
tmpUI.COL = j;
tmpUI.ROW = i;
placa [i, j] = tmp;
tmp.name = nome;
col ++;
}
col = 1;
row ++;
}
Cdigo Bloco 45 Criando o dinamicamente Board
Vamos dar uma olhada e ver o que est acontecendo i n Cdigo Bloco 45 . Ns
ter dois loops um para as linhas do bordo e o segundo para a
pgina 205

Vah Karamian
191
colunas na placa. Desde nosso conselho de 10 x 10, cada um para loop ser
iterao 10 vezes. Dentro do corpo do segundo ciclo, onde a maioria da
a mgica acontece.
Ns primeira instancia nossa Unidade Conselho Prefab GameObject em um espeespe- posio definida pelo objeto Vector3 que representa a posio,
e para rotao, usamos a orientao de rotao padro do Prefab. Aviso prvio
que o objecto Vector3 utiliza a (i, 0, J) para o posicionamento do bordo
unidade. Se bem se lembram, Unidade usa o sistema mtrico e, por padro o bsico
unidade de 1 metro.
Isto torna mais fcil, quando comeamos na posio (0,0,0), e para cada linha
e coluna, incrementamos por 1U. Portanto, temos (0,0,0), (0,0,1), (0,0,2)
... (9,0,9). O resultado final parecido com o seguinte:
Figura 71-A Junta
Uma vez que estamos gerando nosso conselho dinamicamente em tempo de execuo, estamos
vai contar com a UnitBoard Prefab que criou e salvou no pr
etapa rior. A criao bordo real vai ser feito por um script.
Passos para criar o Conselho:
1. Crie um novo arquivo de cs chamado BoardVer1.cs
2. Na funo Start () implementado o cdigo listado i n Cdigo
Bloco 45 Criando o dinamicamente Board
3. Coloque o script recm-criado GameObject Cmara.
pgina 206
Unity 3D - Jogo de Programao Intro
192
4. Agora voc precisar atribuir o pr-fabricada BoardUnit ao
varivel pblica denominada
BoardUnitPrefab.
Quando voc executar o jogo, voc vai notar a placa que tem sido
gerada.
A Figura 72 mostra detalhes por Unidade Board
Se voc olhar de perto, voc vai notar que as informaes para cada placa
unidade est sendo exibido corretamente. H muitas razes que gostaramos
para ver estas informaes. Em primeiro lugar, uma forma visual de pin-point cada placa
unidade, o que leva razo mais importante, a depurao! Ns podemos
rapidamente depurar nossa lgica e identificar os valores que recebemos por trs da cena
com a representao visual real. Voc vai ver o benefcio como ns
progresso.
Como este um jogo de tabuleiro, preciso manter alguma forma o controle do
Estado da placa ao longo de sua vida, e tambm ser capaz de selecionar um partilocalizao ular na placa principal para a colocao de nossos GameObjects e
interagir com elas. Ento, vamos ver como esta parcela seria feito.
Assumindo que vamos usar o nosso ponteiro do mouse para localizar e posio
nossas peas, e tambm enviar o comando de ataque, teremos de captura a posio do mouse e converter a posio do mouse para o nosso 3D
pgina 207
Vah Karamian
193
espao. H duas caractersticas que nos permitam executar essas opera-

es, um o objeto de entrada real que vai nos fornecer a


posio do rato, e o seguinte uma combinao de um objecto e utilizando Ray
o motor de fsica para realizar um Raycast para determinar se ter atingido um
objeto na cena ou no. O bloco de cdigo a seguir ir ilustrar este
operao.
NOTA: O bloco de cdigo listagem parcial da atualizao function ()
18
.
se ( Input .mousePosition! = NULL )
{
// Capturar a posio do mouse e lana um raio para ver o objeto que
acertar
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora tmpHitHighlight, 100))
{
BoardUIVer1 tmpUI = tmpHitHighlight.transform.GetComponente < BoardUIVer1 > ();
se (tmpHitHighlight.transform.tag.Equals ( "Conselho" ) &&
! TmpUI.OCCUPIED)
{
BoardUIVer1 boardData = bordo [tmpUI.ROW,
tmpUI.COL] .transform.GetComponent < BoardUIVer1 > ();
se (tmpHighlight! = NULL )
{
Se (boardData.OCCUPIED)
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .Red;
outro
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .white;
}
Se ( esse .tmpBlockHolder! = NULL )
{
Destroy ( este .tmpBlockHolder);
}
Se ( este .PLACE_BLOCK)
{
este .tmpBlockHolder = new GameObject ();
este .OK_TO_PLACE = verdadeiro ;
se (! este .vertical && (tmpUI.ROW <= 10- este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
18
listagem completa da funo sero fornecidos nas prximas sees.
pgina 208
Unity 3D - Jogo de Programao Intro
194
GameObject visuais = GameObject .Instantiate ( este .CubePrefab,
nova Vec-

TOR3 (tmpUI.ROW + i, este .CubePrefab.transform.position.y, tmpUI.COL),


este .CubePrefab.transform.rotation) como GameObject ;
GameObject bp = bordo [tmpUI.ROW + i, tmpUI.COL];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
//this.OK_TO_PLACE = true;
}
outro
{
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
Se ( esse .vertical && (tmpUI.COL <= 10 - este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab,
nova VecTOR3 (tmpUI.ROW, este .CubePrefab.transform.position.y, tmpUI.COL + i),
este .CubePrefab.transform.rotation) como GameObject ;
GameObject bp = bordo [tmpUI.ROW, tmpUI.COL + i];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
//this.OK_TO_PLACE = true;
}
outro
{
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
pgina 209
Vah Karamian
195

}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
}
tmpHitHighlight.transform.GetComponent < Renderer > (). material.color = Cor .Blue;
tmpHighlight = tmpHitHighlight.transform.gameObject;
}
}
}
Cdigo Bloco 46 Destaque Lines para Mouse Position e ray casting
Vamos discutir apenas a seo do cdigo que lidar com o mouse
posio e fundio Ray. O primeiro caso de verificao declarao para ver se temos
a posio do mouse. Se o fizermos, converter essa posio do mouse a um Ray
objeto usando o construdo em funo fornecida pela classe Camera. Uma vez
temos um objeto ray, usamos a funo Raycast do motor de fsica para
lanou um raio e um dos parmetros para a funo raycast um fora
varivel chamada tmpHitHighlight que ir retornar uma GameObject se
no bater em nada dentro da viso da cmera ativa.
Lembre-se, tmpHitHighlight um GameObject que representa a nossa
unidade de bordo. A unidade de placa pr-fabricada tem um script anexado a ele chamada
BoardUIVer1.cs que usado para atualizar o visual da unidade de bordo
, bem como armazenar o estado dessa unidade placa particular. Portanto base
em nosso projeto ns sabemos que, neste momento, o nico objeto que pudermos
tecnicamente atingido atravs da raycast a unidade de bordo. Ento, o que ns somos
fazendo est ficando os componentes ligados unidade de placa utilizando a
GetComponent <> () funo e armazenamos o objeto retornado em um VaR
iable chamado tmpUI .
O prximo passo detectar se estamos realmente atingindo uma placa
GameObject. Isto detectada verificando a etiqueta na GameObject
ns apenas atingido pela raycast. A idia aqui que, se ns somos um tipo de placa
objeto e a unidade de placa atualmente estamos apontando para no estiver ocupado,
executamos o bloco lgico seguinte. Em primeiro lugar, obter os dados da placa do nosso
array bidimensional, fornecendo a linha e coluna do hit
pgina 210
Unity 3D - Jogo de Programao Intro
196
unidade de bordo, recuperar e armazenar o elemento de dados em uma varivel do tipo
BoardUIVer1 chamado boardData .
As duas ltimas linhas no bloco de cdigo 46 mudar a cor do material do
a unidade de bordo que esto a apontar para de branco para azul como um indicador.
Reunindo tudo - Jogo Objectos
Seria preciso criar vrias GameObjects que sero utilizados para
fazer o nosso jogo. Alguns dos GameObjects so visuais, e alguns so
funcional. Alguns so ambos! Aqui est uma lista:
prefabs:
BoardUnit
BoardUnitAttack
BoardUnitEnemy

BoardUnityPlayer
CubePrefab
CubeWreck
Objetos de cena:
_Msica de fundo
Cmera principal
EventSystem
luz direcional
Lona
Scripts:
BoardUIVer1
BoardVer1
Vamos passar por cada um dos GameObjects e ver o que eles
ser utilizado para. Comeando com BoardUnit, o GameObject foi criado
como uma base para demonstrar vrios conceitos e ideias na anterior
seco, e ser a base para os outros componentes que sero
utilizado no jogo real.
BoardUnitPlayer, este GameObject usado para representar o
O conselho do jogador. Tem a seguinte estrutura:
Figura 73 - Estrutura BoardUnitPlayer
pgina 211
Vah Karamian
197
Note-se que o GameObject composto por vrios outros
GameObjects. Uma uma lona que usado para indicar a etiqueta
do BoardUnit. AttackPosition um GameObject vazio usado internallyfor renderizao de grficos. CubeWreck outro GameObject aninhada
que representa o aspecto visual de um hit na BoardUnit. Voc ver
como esses itens esto sendo construdos e utilizados quando comear a olhar
o cdigo-fonte.
BoardUnitEnemy uma duplicata de BoardUnityPlayer, a estrutura
exactamente o mesmo. A nica diferena entre os dois o Tag e
alguns outros elementos de configurao. Tambm vamos dar uma olhada neles
quando se discute o cdigo-fonte.
CubeWreck o pr-fabricada que representa a representao visual
de uma batida a uma unidade de placa que ocupado por um navio. a combinao
de duas primitivas cubo em ngulos especficos para nos dar alguma visual agradvel
efeito.
Figura 74 - CubeWreck Prefab
Os Prefabs que acabamos de descrever no esto presentes na cena ao vivo duing tempo de design. Eles vo ser instanciado durante o jogo. Agora
vamos dar uma olhada nas GameObjects que vo estar presentes no deassinar tempo na cena.
_BackgroundMusic um GameObject vazio que exclusivamente utilizado para
armazenar e gerenciar uma fonte de udio. Basicamente, desempenha o fundo
msica para o nvel.
Cmera principal a GameObject representando a cmera na
cena. Por padro, quando voc criar uma cena, um GameObject Cmara
pgina 212
Unity 3D - Jogo de Programao Intro

198
criado para voc. H um monte de configurao e as propriedades de
a cmera, vamos olhar para alguns deles no exemplo dado.
Direcional Luz a GameObject representando o elemento de iluminao
mento na cena. Como a cmera, por padro, uma luz direcional
GameObject criado sempre que voc iniciar uma nova cena. Ele tambm tem uma grande
quantidade
de propriedades que podem ser configuradas para efeitos de iluminao, vamos dar uma
olhar para alguns deles durante nossos exemplos.
Lona e eventos do sistema, a lona GameObject usado para o
Graphical User Interface (GUI) design. a nova forma de conceber
e implementar a GUI para a Unidade. Ele tem caractersticas poderosas para
construo de interfaces atraentes. O sistema de eventos GameObject revel para os eventos gerados dentro do GUI.
BoardUIVer1 o script c-sharp que usado para lidar com o Conselho
Unidade de elementos de interface do usurio. tambm responsvel na gesto da
estado da determinada unidade de bordo. Isto , se ele estiver ocupado, bater e etc ...
tambm gerencia os aspectos visuais da unidade de bordo com base no estado.
BoardVer1 o principal roteiro para a lgica do jogo. Ele contm toda a
elementos de dados necessrios e lgica para o jogo para funcionar corretamente. isto
cola tudo juntos. responsvel para a inicializao do
unidades de tabuleiro, responsvel por manter o controle da pontuao, e tambm
responsvel pelo processo de pensamento do adversrio do computador para fazer
o prximo passo.
pgina 213
Vah Karamian
199
Jogo Fluxo + Logic
O diagrama a seguir uma representao visual do nvel elevado
fluxo do jogo. Como uma boa regra de ouro, antes de iniciar qualquer projeto,
uma boa idia para esboar e capturar alguma representao elevado nvel de
como o programa ir fluir.
Figura 75 - Jogo de Fluxo de Alto Nvel
Para resumir rapidamente o diagrama, quando o jogo comea, inicialmente,
o jogador convidado a colocar seus / suas peas no tabuleiro designado
19
.
Quando o jogador tiver completado colocando as suas peas, em seguida, o computador
comear a colocar as suas peas. Uma vez que o jogador e o computador tem
colocado todas as peas necessrias, o jogo comea!
19
Note-se, que ns no ter capturado os detalhes da verificao da placa para a colocao adequada
das peas, nem ns capturar a mudana de orientao ao colocar as peas na
borda.
pgina 214
Unity 3D - Jogo de Programao Intro
200
Quando o jogo comea, o gerente jogo decide qual jogador do
transform-la , uma vez que determinado, se a vez do jogador, ele esperar
at que o jogador escolhe uma unidade de bordo, o gerente jogo vai lidar com a

detalhes de um sucesso e perder nos bastidores. Se for um sucesso, em seguida, alguns accontagem feita eo jogador recebe outra vez, se uma falta, em seguida,
o computador AI seleciona uma unidade de bordo a bordo e o do jogador
mesmo processo contnuo at que o jogador ou as vitrias de computador
o jogo.
Vamos olhar para os internos da lgica mais de perto.
Figura 76 - Jogador Navio Placement Diagrama de Fluxo
Quebrar F igura 75, w e vai comear por tomar um olhar mais atento
o que acontece internamente para a lgica do programa quando o jogador solicitado
para colocar suas / seus navios em sua placa. Figura 76, ilustra a lgica
fluir em mais detalhe.
pgina 215
Vah Karamian
201
Como ilustrado, o jogador precisa primeiro selecionar uma pea para ser colocado
no quadro. Quando uma pea selecionado, em seguida, ele / ela tem que selecionar onde
eles gostariam de colocar a pea no tabuleiro, e em que a orientao.
Existem apenas duas orientaes disponveis, horizontal e vertical.
Quando uma determinada unidade de bordo selecionado, o computador verifica para ver se
no h espao suficiente para a colocao da pea, tambm verificar para ver
Se todo o comprimento do navio seleccionado claro para o posicionamento. Isso ,
se no h peas colocadas j colocado no caminho do recm
pea selecionada. Este processo continua repetindo at que todas as peas foram
colocado com sucesso em cima da prancha.
Em seguida, o computador iniciado colocando suas peas.
Figura 77 - AI Navio Placement Diagrama de Fluxo
A AI passa por um processo semelhante quando se est a colocar a sua prpria
tocando peas em cima da prancha. Ele comea por selecionar o prximo disponvel
pea a ser colocado, em seguida, ele decide aleatoriamente o que no era orientao
para colocar a pea, ao lado decide as coordenadas no tabuleiro,
uma vez que determinado, em seguida, comea a atravessar o processo de
verificar e verificar se a seleo vlida para a colocao ou no. E se
pgina 216
Unity 3D - Jogo de Programao Intro
202
ele , ento tudo bom e os dados so gravados, se no, ele passa por
etapas para selecionar outra posio e orientao disponvel.
Quando todos os jogadores colocaram suas peas, o jogo comear. o sediagrama mugido ilustra a verso detalhada da lgica de jogo.
Figura 78 - O Jogo Logic
pgina 217
Vah Karamian
203
Figura 78 fornece uma viso mais detalhada de como o jogo interno
lgica quando tanto o jogador como o AI colocou seus navios em
seus respectivos conselhos. Cada jogador tem a chance de selecionar uma unidade de bordo
quando sua vez, se a unidade de placa seleccionada ocupada pelo oposta
nentes pea, ento temos um sucesso, vrias operaes acontecem por trs do
cena pelo gerente de jogo para contabilidade e tambm visual e de udio

representao, Finalmente, o gerente jogo verifica se o jogador tem


acertar todas peas do oponente, e se assim for, o jogo acabou.
A AI comea com uma lgica similar eo programa executa a
mesmos passos para os critrios de sucesso ou perder, no entanto, h um retrocesso
20
algoritmo desenvolvido para a IA, se houver um acerto! Este basicamente o
cdigo que realmente dar o AI sua inteligncia. Ela determina que a
melhor movimento seguinte para o AI se o AI tem um hit. Entretanto, a
gerente de jogo tambm verifica para determinar se o AI atingiu todo o
peas do jogo, e se assim for, o jogo encerrado com a AI ser o
vencedora.
Como voc pode ver, mesmo para um simples jogo, h um monte de planejamento
fazer como designer e programador. Os diagramas so fornecidos para
torn-lo mais fcil de visualizar o fluxo do programa. Vamos olhar para o
aplicao em uma seo diferente.
Jogo User Interface
Como qualquer outra aplicao, um jogo tambm precisa fornecer uma grfica
User Interface (GUI) para o usurio. A GUI do seu jogo um meio de
como o usurio ir interagir com o seu jogo. De um modo geral, a GUI
de uma aplicao e ou um jogo impulsionado pelas caractersticas e objetivos de
que a aplicao e ou jogo particular.
Normalmente, o GUI tem de exibir informaes significativas para o
usurio final. As informaes so dados relacionados com o meio ambiente. para inposio, no nosso jogo, precisamos de um meio para o jogador para selecionar as peas
que so necessrios para ser colocado sobre a sua placa, tambm precisamos de um meio para
20
Retrocesso um algoritmo geral para encontrar todos (ou alguns) solues para alguns comproblemas computacionais, problemas de satisfao nomeadamente constrangimento, que constri
incrementalmente
candidatos para as solues, e abandona cada candidato parcial C ( "Backtracks"), logo que
determina que C no pode possivelmente ser completada com uma soluo vlida.
pgina 218
Unity 3D - Jogo de Programao Intro
204
alterar a orientao da pea antes de coloc-los em cima da prancha,
e, finalmente, precisamos mostrar a pontuao para o jogador e tambm o AI
A GUI para o jogo no muito complexo, mas independentemente disso, voc ainda
precisa prestar ateno s exigncias do seu projeto e concepo e
implementar uma interface grfica que vai ser suficiente para a experincia geral.
Figura 79 - Jogo GUI Concept
Aqui est uma lista de entrada e de sada que precisam ser tratadas:
entradas:
Escolha peas individuais.
Alterar a orientao da pea (vertical / horizontal)
Select localizao a bordo do jogador para colocar a pea.
Select localizao a bordo do inimigo para ter um hit.
Sada:
placa de exibio do jogador / inimigo (s)
pgina 219
Vah Karamian

205
peas de Displayplayer a ser colocada sobre a placa do leitor
antes do jogo comear.
representar visualmente as peas de tabuleiro aps jogador tem posio
nado-los em cima da prancha.
contagens de exibio para tanto o jogador como o inimigo.
representar visualmente um sucesso a bordo e do tanto do jogador
O conselho do inimigo.
A msica de fundo para o jogo.
Sound FX quando h uma batida a bordo, quer do jogador
ou placa do inimigo.
Dada a nossa lista de entradas e sadas, podemos chegar a um esboo
representando o layout de como gostaramos que a nossa GUI a ser projetado.
Estes processo geralmente vai levar algum tempo e esforo e isso ser mais
provavelmente passar por algumas iteraes antes de se estabelecer em um de- final,
placa.
Figura 80 - Jogo GUI Score exibio
pgina 220
Unity 3D - Jogo de Programao Intro
206
Olhando para a Figura 79 ns dar uma olhada no nosso layout GUI desejado. Como
indicada no diagrama, temos cinco botes que representam a seleo
o das nossas peas para a colocao de placa na parte inferior da tela, ns
tem um boto para a mudana de orientao no canto superior esquerdo da
tela, e temos dois principais blocos grandes que representam as placas de jogos
que vamos usar para o nosso jogo.
Se voc observar a Figura 79 , no displayany informaes sobre
a pontuao no jogo. Este capturado na Figura 80 . Aqui como a interface do usurio
obras de lgica:
1. O jogador seleciona um determinado navio para ser colocado em sua / seu bordo.
2. Aps a colocao bem sucedida, o selecione pea ser removido da UI.
3. Esse processo se repete at que todas as peas foram colocadas em
o tabuleiro de jogo.
4. Neste ponto, quando o jogo comea, todo o posicionamento de funo
cionais botes so removidos ou escondidos da UI.
5. Em seguida, a UI pontuao exibida para o usurio como indicado na
o esboo.
Este outro conceito importante quando voc est projetando uma GUI
para uma aplicao particular. Devido s restries de tela imobilirio,
voc ter de decidir a forma de gerir a informao que voc quer
exibir para o usurio final. No s voc ter que pensar sobre o tamanho
localizao e orientao dos elementos de interface do usurio, mas tambm em que momento voc
deseja exibir informaes especficas.
Em alguns casos, voc pode ter que mostrar continuamente um conjunto de muito
dados importantes para o jogador, portanto, voc vai precisar para projetar a interface do usurio em
um
maneira que seja confortvel para o jogador para obter as informaes que ele ou
ela precisa, mas, ao mesmo tempo que no interfere com o jogo.
Em outros pontos, voc pode querer exibir informaes (mais decaudas) em relao a determinados critrios sobre um gatilho pelo jogador. este

ao trar um painel e ou uma janela que exibir dados em


mais detalhes.
pgina 221
Vah Karamian
207
Captulo 7 - Delving o Cdigo
Se voc seguir junto i n Captulo 3 - objetos do jogo e Componentes e Captulo 6 - Criando Battleship, voc deve ter uma boa
compreenso dos conceitos e uma ideia clara do nosso objetivo do jogo.
Para fazer uma breve recapitulao, no Captulo 3, que abrangeu o bsico do jogo Obserjectos e Unidade IDE, o conceito-chave do captulo era para voc
comeou na direo certa, e permitir-lhe saltar iniciar o seu prprio
estudo e desenvolvimento do IDE.
Captulo 6 foi totalmente dedicada ao conceito e a idia do
jogo chamado Batalha do navio. Ns cobrimos um monte de idias importantes, APabordagens em geral para desenvolvimento de software, e usamos Batalha Board
como um exemplo para demonstrao. Neste captulo, vamos mergulhar
no cdigo por trs do jogo e ver como ele dirige tudo e
cola tudo juntos.
Script - BoardUIVer1.cs
Conselho UI Ver um script usado para controlar as unidades de bordo individuais de
o conselho dado dentro do jogo. Se voc se lembrar do nosso cusso anterior
sion sobre a abordagem que devemos ter para a concepo e
implementao do nosso tabuleiro de jogo, voc vai lembrar que temos uma espeCIFIC pr-fabricada dedicado para a representao visual da nossa unidade de bordo.
Os detalhes da pr-fabricada so discutidos na seo seguinte, Putting
Tudo Junto - Jogo Objectos, no Captulo 6 - Criao de batalha
navio.
O pr-fabricada por si s bastante intil. Para que sejamos capazes
para traz-lo vida e interagir com o pr-fabricada precisamos de algum tipo de
scripting. O roteiro usada para interagir e modificar o estado de um determinado
GameObject. Neste caso particular, este passa a ser nossa Unidade Board.
Vamos dar uma olhada na lista de cdigos, e passar por cima de cada seo e
quebrar a lgica e entender o que ele est tentando alcanar.
pgina 222
Unity 3D - Jogo de Programao Intro
208
usando UnityEngine;
usando UnityEngine.UI;
usando System.Collections;
classe pblica BoardUIVer1 : MonoBehaviour {
pblica GameObject AttackPrefab;
pblica GameObject WreckPrefab;
pblica GameObject AttackPosition;
pblica GameObject CubePrefab;
flutuar timeLimit = 4.0f; // 10 segundos.
pblica Texto lblBoardPosition;
int pblica ROW;
int pblica COL;
bool pblicos ocupados;

// Usado para indicar se a unidade est ocupada


bool pblicas atacado;
// Usado para indicar se a unidade for atacado
// Use isso para inicializao
vazio Iniciar () {
este .OCCUPIED = false ;
este .ATTACKED = false ;
}
privada GameObject tmp = NULL ;
privada GameObject tmp1 = NULL ;
privada GameObject TMP 2 = NULL ;
// Update chamado uma vez por quadro
vazio Update () {
Se (transform.tag.Equals ( "boardAttack" ) && este .ATTACKED &&
este .OCCUPIED)
{
este .WreckPrefab.SetActive ( verdadeiro );
Se (timeLimit> 0)
{
// Diminuir timeLimit.
timeLimit - = Tempo .deltaTime;
Se ( esse .tmp == nulo )
tmp = GameObject .Instantiate ( este .AttackPrefab,
este .AttackPosition.transform.position,
este .AttackPosition.transform.rotation) como GameObject ;
// Destroy (tmp, 3.0f);
}
outro
pgina 223
Vah Karamian
209
{
Destroy (tmp);
timeLimit = 4.0f;
}
}
se (transform.tag.Equals ( "board" ) && este .ATTACKED && este .OCCUPIED)
{
este .CubePrefab.SetActive ( false );
Se (timeLimit> 0)
{
// Diminuir timeLimit.
timeLimit - = Tempo .deltaTime;
Se ( esse .tmp2 == nulo )
TMP 2 = GameObject .Instantiate ( este .AttackPrefab,
nova Vector3 (transform.position.x, 1.0f, transform.position.z),
transform.rotation) como GameObject ;
}
outro

{
Destroy (TMP 2);
timeLimit = 4.0f;
}
}
}
public void PlaceEnableCubePrefab ()
{
este .CubePrefab.SetActive ( verdadeiro );
}
}
Cdigo Bloco 47 - Listagem de BoardUIVer1.cs
Vamos comear por afirmar que BoardUIVer1 definida como uma classe que
herdando de MonoBehaviour
21
. Todos os C # roteiros de herdar padro
de MonoBeviour. Por padro cada script tem um Iniciar () e um Update () funo definida.
A funo Start () ser chamado pelo Unity antes jogabilidade BE
gins, ou seja, antes que a funo Update () chamado pela primeira vez, e ele
o lugar ideal para fazer a sua inicializao.
21
MonoBehaviour a classe base cada script deriva.
pgina 224
Unity 3D - Jogo de Programao Intro
210
A funo Update () o lugar para colocar o cdigo que ir lidar com o
atualizao de quadros para o GameObject. Este movimento pode incluir, desencadear aes e responder a entrada do usurio. Basicamente qualquer coisa que
precisa ser tratado ao longo do tempo durante o jogo.
Vamos dar uma olhada na estrutura de classes, e decomp-lo para uma melhor
compreenso:
Ns temos uma classe chamada BoardUIVer1, ele contm o seguinte
propriedades / atributos:
AttackPrefab , do tipo GameObject e uma referncia para
o Prefab GameObject usado para exibir o FX especial
para um sucesso a bordo do jogador.
WreckPrefab , do tipo GameObject e uma referncia para
o Prefab GameObject usado para exibir visual
naufrgio de um hit na placa inimigo.
AttackPosition , do tipo GameObject e uma referncia para
a posio 3D para instanciar o AttackPrefab visualmente
na tela.
timeLimit , do tipo flutuador e utilizado como um temporizador para manudling quando criar uma nova instncia do FX especial.
lblBoardPosition , do tipo de texto e usado para exibir
a posio do Conselho de Unidade.
ROW , do tipo int e usado para manter o nmero da linha
a placa de unidade.
COL , do tipo int e utilizada para conter o nmero da coluna
do conselho de administrao da unidade.

OCCUPIED , do tipo booleano e usado para indicar se o


Board Unit especfico ocupado ou no.
ATAQUE , do tipo booleano e usado para indicar se o
Board Unit especfica atacado ou no.
A classe tambm tem a seguinte trs funes definidas:
pgina 225
Vah Karamian
211
Iniciar () , na funo start () os dois varivel OCUPADOS
e atacou so inicializados como false. Isto porque por
nenhum padro das unidades de tabuleiro esto ocupadas ou atacado.
Update () , a funo Update () um pouco mais complicado. isto
usado para gerenciar o aspecto visual da unidade de tabuleiro baseado
sobre o estado.
PlaceEnableCubePrefab () , esta funo utilizada para ativar
o pr-fabricada definido na unidade de bordo.
Vamos olhar para o Update () funo com mais profundidade. Este o lugar onde
a maioria da ao est acontecendo para esta classe particular. H dois
principais condies que estamos verificando:
Se (transform.tag.Equals ( "boardAttack" ) && este .ATTACKED && este .OCCUPIED)
{
este .WreckPrefab.SetActive ( verdadeiro );
Se (timeLimit> 0)
{
// Diminuir timeLimit.
timeLimit - = Tempo .deltaTime;
Se ( esse .tmp == nulo )
tmp = GameObject .Instantiate ( este .AttackPrefab,
este .AttackPosition.transform.position,
este .AttackPosition.transform.rotation) como GameObject ;
}
outro
{
Destroy (tmp);
timeLimit = 4.0f;
}
}
// Este bloco de cdigo aqui usado para o jogador enemny espao reservado ...
se (transform.tag.Equals ( "board" ) && este .ATTACKED && este .OCCUPIED)
{
este .CubePrefab.SetActive ( false );
Se (timeLimit> 0)
{
// Diminuir timeLimit.
timeLimit - = Tempo .deltaTime;
Se ( esse .tmp2 == nulo )
TMP 2 = GameObject .Instantiate ( este .AttackPrefab,
nova Vector3 (transform.position.x, 1.0f, transform.position.z),
transform.rotation) como GameObject ;
}
outro

{
Destroy (TMP 2);
pgina 226
Unity 3D - Jogo de Programao Intro
212
timeLimit = 4.0f;
}
}
Se voc notar, tanto do se as condies de verificar se os mesmos critrios:
a unidade de bordo devem ser atacados e deve ser ocupado. estes critrios
so verificados atravs do this.ATTACKED e this.OCCUPIED devidamente,
gravatas. A principal diferena entre os dois blocos feito atravs do
propriedade de marca associada pr-fabricada bordo unidade.
Precisamos ser capazes de identificar de alguma forma cujo conselho estamos interacting com, e isso feito atravs da propriedade tag que
associado ao pr-fabricada bordo unidade. Para bordo do jogador, a tag property definido como "boardAttack" e para a placa do inimigo, a tag
propriedade definida como "board" . A propriedade tag definido e asassinado no momento da concepo. Em outras palavras, uma vez que estamos utilizando um nico
script para lidar com ambas as unidades de tabuleiro do jogador e placa do inimigo
unidades, preciso distinguir de alguma forma entre os dois, e, portanto, ns
esto fazendo isso atravs da propriedade tag.
Desde que agora est fora do caminho, a estrutura real e lgica para
ambos se os blocos so semelhantes, se estiverem reunidas as condies, ativar / enable
o pr-fabricada usado para representar visualmente um sucesso. O prximo passo verificar
uma varivel temporizador, o temporizador est definido para redefinir a cada quatro (4) segundos,
ns
instanciar o pr-fabricada efeitos visuais definidos na posio de ataque transformar
associado ao pr-fabricada bordo unidade. Note-se que a cada quatro segundos
destrumos o GameObject efeitos visuais da cena.
Script - BoardVer1.cs
Este script a principal fora motriz por trs do jogo Batalha Board.
Ele usado para controlar a lgica do jogo e fluxo de jogo do incio ao fim.
o script que traz tudo junto e atua como o BE cola
tre todas as diferentes peas. um script complexo, por isso vou tentar
decomp-lo tanto quanto possvel. Vamos dar uma olhada e listar todos os
variveis internas que foram definidos na BoardVer1
22
classe.
22
O code-block est mostrando apenas as variveis declaradas, listagem completa do cdigo proDESDE mais tarde.
pgina 227
Vah Karamian
213
. ...
. ...
pblica Camera cameraEndGame;
pblica AudioClip explosionPlayerBlast;
pblica AudioClip explosionEnemyBlast;

privada AudioSource AudioSource;


pblica GameObject BoardUnitPrefab;
pblica GameObject BoardUnitAttackPrefab;
pblica GameObject CubePrefab;
// Esta varivel ser utilizada para o captulo 5 ... melhorias do cdigo
pblica GameObject IverHuitfeldt;
pblica GameObject IverHuitfeldtAnchorPosition;
pblica GameObject AdmiralSergeyGorshkov;
pblica GameObject AdmiralSergeyGorshkovAnchorPosition;
pblica GameObject MRVikhrIFQ;
pblica GameObject MRVikhrIFQAnchorPosition;
pblica GameObject Steregushchiy;
pblica GameObject SteregushchiyAnchorPosition;
pblica GameObject AdmiralKuznetsov;
pblica GameObject AdmiralKuznetsovAnchorPosition;
// ------------------------------------------------ ---------------------pblica GameObject [,] boardPlayer = new GameObject [10,10];
pblica GameObject [,] boardEnemy = new GameObject [10, 10];
// Usado para colocar navios inimigos (por tamanho)
private int [] navios = new int [5] {2,3,3,4,5};
private int maxNumberOfHits = 17;
private int playerHitCount = 0;
private int enemyHitCount = 0;
int pblica blockSize = 3;
pblica bool verticais = false ;
pblica GameObject myWater;
#region REF BUTTON
pblica Boto butAircraftCarrier;
pblica Boto butBattleship;
pblica Boto butSubmarine;
pblica Boto butDestroyer;
pblica Boto butPatrolBoat;
pblica Boto butUIReset;
pblica Boto butExit;
pgina 228
Unity 3D - Jogo de Programao Intro
214
pblica Boto butHorizontal;
pblica Boto butVertical;
pblica Canvas canvasScoreBoard;
pblica Texto lblPlayerScore;
pblica Texto lblAIScore;
pblica Imagem imgYouWin;
pblica Imagem imgYouLose;
#endregion
...
. ...
Cdigo Bloco 48 - Variveis BoardVer1
Aqui esto as variveis responsveis para o principal jogo.
cameraEndGame , do tipo Camera, e usado para exibir
a cena final do jogo.

explosionPlayerBlast , do tipo AudioClip, e usado para


reproduzir o som FX, quando o jogador atingido.
explosionEnemyBlast , do tipo AudioClip, e usado para
reproduzir o som FX quando o inimigo atingido.
AudioSource , do tipo AudioSource, utilizado para a
a reproduo do udio em nvel.
BoardUnitPrefab , do tipo GameObject, o referncia pr-fabricada usada para manter bordo unidade do jogador.
BoardUnitAttackPrefab , do tipo GameObject, que a
referncia ao pr-fabricada usada para manter bordo unidade do inimigo.
CubePrefab , do tipo GameObject, esta varivel utilizada
para gerar dinamicamente uma casa pr-fabricada cubo de pistas visuais.
boardPlayer , um bidimensional tipo de dados array, representando bordo do jogador. A dimenso da matriz
10x10.
boardEnemy , um bidimensional tipo de dados array, representando bordo do inimigo. A dimenso da matriz
10x10.
navios , um tipo de dados uma matriz dimensional, detm o comprimento
de cada pea que ter de ser colocado no tabuleiro. este
varivel utilizado especificamente pela AI quando colocar
pedaos em cima da prancha.
pgina 229
Vah Karamian
215
maxNumberOfHits , do tipo int, e usado para representar
o valor mximo atingvel para uma vitria.
playerHitCount , do tipo int, o contador para o
pontuao do jogador.
enemyHitCount , do tipo int, o contador para o AI
Ponto.
blockSize , do tipo int, que usado para medir e compr o limite da colocao navio nas placas de jogo.
Pense nisso como uma margem ou uma medida de preenchimento.
verticais , do tipo booleano, que usada para identificar se o atual
pea a ser colocado vai ser vertical ou horizontal.
Como voc pode ver, a lista de variveis para gerir o jogo bastante
extenso. Vamos ver como cada um est sendo usado quando ns cobrir o
funes na classe.
Variveis grficos avanados
As seguintes variveis so todos do tipo GameObject. Eles so um
referncia aos prefabs que representam o modelo 3D para cada navio que
ser colocada a bordo do jogador.
IverHuitfeldt
IverHuitfeldtAnchorPosition
AdmiralSergeyGorshkov
AdmiralSergeyGorshkovAnchorPosition
MRVikhrIFQ
MRVikhrIFQAnchorPosition
Steregushchiy
SteregushchiyAnchorPosition

AdmiralKuznetsov
AdmiralKuznetsovAnchorPosition
Variveis Graphical User Interface
As seguintes variveis so utilizadas para referenciar os elementos de interface do usurio em
o jogo. As variveis que comeam com butXXX esto representando o mastoneladas definidos na interface do usurio que o usurio pode interagir com. as variveis
pgina 230
Unity 3D - Jogo de Programao Intro
216
comeando com lblXXX esto fazendo referncia rtulos na interface do usurio, as variveis
iniciaring com imgXXX esto fazendo referncia imagens na interface do usurio. a varivel
canvasScoreBoard do tipo da lona e usado para fazer referncia a pontuao
bordo no jogo. Vamos tambm olhar para estes em mais detalhe na prxima
seo.
butAircraftCarrier
butBattleship
butSubmarine
butDestroyer
butPatrolBoat
butUIReset
butExit
butHorizontal
butVertical
canvasScoreBoard
lblPlayerScore
lblAIScore
imgYouWin
imgYouLose
Funes definidas em BoardVer1 Classe
O jogo tem algumas funes que so necessrias para o seu funcionamento.
Nesta seo, vamos listar cada funo e passar por cima do cdigo e deescriba que as funes esto realizando.
Awake () , a Awake () chamado uma vez e o
primeira funo que ser executado no ciclo de vida do
jogo. Ele usado para agarrar uma referncia ao AudioSource em
o nvel.
Iniciar () , o Start () funo chamada uma vez, bem,
chamado aps o Awake () funo. O Start () funo
responsvel por inicializar todas as variveis do jogo. Isto
tambm responsvel pela gerao de ambas as placas de jogos,
um para o jogador e outra para o inimigo.
pgina 231
Vah Karamian
217
CheckPlayerBoard () , responsvel por entregar o lugarmento das peas do jogo em tabuleiro de jogo do jogador.
CheckAttackBoard () , responsvel pelo tratamento do ataque
e deteco de um sucesso tanto para o jogador eo inimigo.
Wait4Me () , uma funo usado para temporizao.

Update () , uma funo que chamada cada frame. o Update () funo o corpo principal do programa de jogo. isto
determina o estado do jogo e chama o apropriado
funes conforme necessrio durante a durao do jogo.
ChangeHitDirection () , esta funo usada pelo AI
tomar uma deciso sobre a direo a sua prxima jogada ser.
PlaceEnemyShips () , esta funo usada pelo AI para decide onde quer colocar os seus navios no tabuleiro de jogo
antes do jogo comear.
CheckBoardForEnemyPlacement (linha, col, tamanho hor) , este
funo usada pelo AI para determinar se o posicionamento
do navio vlido ou no. uma funo recursiva. Isto
com base nos dados originais de linha e coluna do tamanho do
navio e a orientao.
CheckWhichShipWasPlaced (linha, col) , esta funo utilizada
por o AI para determinar qual o navio est j colocada sobre o
tabuleiro de jogo.
butCreateBattleship (tamanho) , esta funo acionado quando
o jogador escolhe o boto UI definido para um navio especfico
para a colocao.
butCreateBattleShipSetID (shipID) , esta funo desencaGered quando o jogador seleciona o boto UI definido para um
navio especfico para a colocao. Os dois funcionam em conjunto provide o tamanho e a identificao do navio seleccionado.
butRestart () , esta funo faz algum trabalho de limpeza e
reinicia o jogo.
butExitClick () , esta funo termina o jogo.
butChangeOrientation () , esta funo muda a orientao
o da colocao pea do jogador para o tabuleiro de jogo.
ResetGUIButtons () , esta funo repe todas as GUI mastoneladas quando o usurio reiniciar o jogo.
pgina 232
Unity 3D - Jogo de Programao Intro
218
Awake () implementao da funo
Agora que temos um breve resumo do que cada funo deassinado para, podemos olhar para a implementao real e comear a absorver
os detalhes adiante. O primeiro e mais simples de todas as funes a Awake ()
funo.
anular Awake ()
{
este .audioSource = getComponent < AudioSource > ();
}
Cdigo Bloco 49 - Awake () funo na classe BoardVer1
Existe apenas uma linha de cdigo, neste mtodo, e utilizado para obter
os componentes ligados ao AudioSource GameObject onde esta
prprio script est anexado. O GameObject passa a ser o principal
Cmara definida na cena. Precisamos de uma referncia ao AudioSource
para que possamos acessar diretamente o udio queremos jogar em um determinado
Tempo. Voc vai ver como esta varivel utilizada em outras funes
listado abaixo.

Start () implementao da funo


A prxima funo queremos olhar o Iniciar () funo.
anular Iniciar ()
{
#region JOGO DE CONTABILIDADE
gua tmpWater = este .myWater.gameObject.GetComponent < gua > ();
tmpWater.waterMode = gua . WaterMode .Refractive;
este .cameraEndGame.gameObject.SetActive ( false );
este .canvasScoreBoard.enabled = false ;
este .count = 0;
este .currentShipID = 0;
este .blockSize = 0;
este .placeEnemyShips = verdadeiro ;
este .START_GAME = false ;
este .PLAYER_TURN = verdadeiro ;
esta .maxNumberOfHits = 17;
este .playerHitCount = 0;
pgina 233
Vah Karamian
219
este .enemyHitCount = 0;
este .hit_row = -1;
este .hit_col = -1;
este .hit_dir = HitDirection .none;
este .IsBusy = false ;
este .gotoLastHit = false ;
este .imgYouLose.enabled = false ;
este .imgYouWin.enabled = false ;
este .butUIReset.gameObject.SetActive ( false );
#if UNITY_WEBPLAYER
// Para o jogador web que no precisamos para exibir o boto de sada !!!
this.butExit.gameObject.SetActive (false);
this.butUIReset.GetComponent <RectTransform> (). Traduzir (nova Vector3 (75,
0, 0));
#fim se
Se ( este .vertical)
{
este .butVertical.gameObject.SetActive ( verdadeiro );
este .butHorizontal.gameObject.SetActive ( false );
}
outro
{
este .butVertical.gameObject.SetActive ( false );
este .butHorizontal.gameObject.SetActive ( verdadeiro );
}
#endregion
// Limpar o tabuleiro (s)
para ( int i = 0; i <10; i ++)
{
para ( int j = 0; j <10; j ++)
{

boardPlayer [i, j] = NULL ;


boardEnemy [i, j] = NULL ;
}
}
// Criar um quadro de 10x10 - Conselho 1
int linha = 1;
int col = 1;
para ( int i = 0; i <10; i ++)
{
para ( int j = 0; j <10; j ++)
{
// Instanciar pr-fabricada e coloc-lo corretamente em cena
GameObject tmp = GameObject .Instantiate ( este .BoardUnitPrefab,
nova Vector3 (i, 0, J), esta .BoardUnitPrefab.transform.rotao) como GameObject ;
BoardUIVer1 tmpUI = tmp.GetComponent < BoardUIVer1 > ();
pgina 234
Unity 3D - Jogo de Programao Intro
220
cadeia name = cadeia .format ( "B1: [{00:00}, {01:00}]" , linha, col);
tmpUI.lblBoardPosition.text = nome;
tmpUI.COL = j;
tmpUI.ROW = i;
boardPlayer [i, j] = tmp;
tmp.name = nome;
col ++;
}
col = 1;
row ++;
}
// Criar um quadro de 10x10 - Conselho 2
linha = 1; col = 1;
para ( int i = 11; i <21; i ++)
{
para ( int j = 0; j <10; j ++)
{
// Instanciar pr-fabricada e coloc-lo corretamente em cena
GameObject tmp = GameObject .Instantiate ( este .BoardUnitAttackPrefab,
nova Vector3 (i, 0, J), esta .BoardUnitAttackPrefab.transform.rotation) como GameObject ;
BoardUIVer1 tmpUI = tmp.GetComponent < BoardUIVer1 > ();
cadeia name = cadeia .format ( "B2: [{00:00}, {01:00}]" , linha, col);
tmpUI.lblBoardPosition.text = nome;
tmpUI.COL = col-1;
tmpUI.ROW = row-1;
boardEnemy [tmpUI.ROW, tmpUI.COL] = tmp;
tmp.name = nome;
col ++;
}
col = 1;
row ++;

}
}
Cdigo Bloco 50 - Iniciar () funo na classe BoardVer1
As primeiras duas linhas na funo obter uma referncia para a gua comPonent na myWater varivel, e ns mudar o WaterMode para
Refrao . Isto muda o modo de processamento de gua e, portanto, o
mudanas na aparncia no nvel.
pgina 235
Vah Karamian
221
As prximas duas linhas de cdigo desativa a cmera do jogo final, temos
configurao atravs da varivel cameraEndGame . Tambm desativar o canvas objeto que est fazendo referncia ao quadro de pontuao atravs da
canvasScoreBoard varivel. As prximas linhas inicializar todo o VaR
iables que so usados para entregar os dados do jogo.
Indo para o primeiro loop for, estamos inicializando os tabuleiros de jogo para
tanto o jogador como o inimigo. Aqui temos dois loops, um emalojado na outra representando as linhas e as colunas do nosso
Pranchas. Eles so criados para percorrer 10 vezes cada um, como que o tamanho do nosso
borda. Observe que estamos anulando cada posio na matriz / carto,
preparando-o, portanto, para a criao real do bordo no passo seguinte.
// Criar um quadro de 10x10 - Conselho 1
int linha = 1;
int col = 1;
para ( int i = 0; i <10; i ++)
{
para ( int j = 0; j <10; j ++)
{
// Instanciar pr-fabricada e coloc-lo corretamente em cena
GameObject tmp = GameObject .Instantiate ( este .BoardUnitPrefab,
nova Vector3 (i, 0, J), esta .BoardUnitPrefab.transform.rotation) quanto
GameObject ;
BoardUIVer1 tmpUI = tmp.GetComponent < BoardUIVer1 > ();
cadeia name = cadeia .format ( "B1: [{00:00}, {01:00}]" , linha, col);
tmpUI.lblBoardPosition.text = nome;
tmpUI.COL = j;
tmpUI.ROW = i;
boardPlayer [i, j] = tmp;
tmp.name = nome;
col ++;
}
col = 1;
row ++;
}
Cdigo Bloco 51 - Cdigo de Construo do Conselho de Administrao do Jogador
Tudo isso cdigo est fazendo instanciar o nosso pr-fabricada referenciado pelo
varivel BoardUnitPrefab , situa-se numa posio <i, 0, j> , onde i
a linha, e J a coluna, e o objecto Vector3 a posio em 3D
da Unidade de Conselho no espao 3D. A rotao definido como o padro do
transformao do objecto.

pgina 236
Unity 3D - Jogo de Programao Intro
222
Que uma linha onde o pr-fabricada Unidade Board instanciado e
colocado no mundo 3D. As prximas linhas de cdigo, formatar o nome
para a unidade de placa, que , eles aplicar um rtulo de identificao, tal como,
B1 [00,00] e etc ... o i e j valores so atribudos aos dados interno
variveis do BoardUIVer1 classe, ROW e COL respectivamente. E
Finalmente, a Unidade de Placa recentemente instanciado armazenado no-2 dimenso
matriz sional que representa bordo do jogador no local especfico
novamente identificados pelos valores de i e j .
NOTA: Quando a unidade do Conselho instanciado, ele tem um script anexado a ele
chamados BoardUIVer1.cs. Cada vez que um GameObject introduzido na cena, o
processo ter todos os scripts, que so habilitados, ligado a ele ser executado, e em
Neste caso, a Awake () ea funo start () ser chamado pela primeira vez e apenas uma vez, se
eles so definidos. Isso mencionado, como um lembrete de que esses scripts seria provavelmente
tm os seus prprios initializations e etc ...
O segundo bloco do loop for cria o conselho para o inimigo.
A lgica do cdigo funciona de forma semelhante, a contabilidade feita um pouco diferentes. Aqui est a lista para a criao bordo inimigo:
// Criar um quadro de 10x10 - Conselho 2
linha = 1; col = 1;
para ( int i = 11; i <21; i ++)
{
para ( int j = 0; j <10; j ++)
{
// Instanciar pr-fabricada e coloc-lo corretamente em cena
GameObject tmp = GameObject .Instantiate ( este .BoardUnitAttackPrefab,
nova Vector3 (i, 0, J), esta .BoardUnitAttackPrefab.transform.rotao) como GameObject ;
BoardUIVer1 tmpUI = tmp.GetComponent < BoardUIVer1 > ();
cadeia name = cadeia .format ( "B2: [{00:00}, {01:00}]" , linha, col);
tmpUI.lblBoardPosition.text = nome;
tmpUI.COL = col-1;
tmpUI.ROW = row-1;
boardEnemy [tmpUI.ROW, tmpUI.COL] = tmp;
tmp.name = nome;
col ++;
}
col = 1;
row ++;
}
Cdigo Bloco 52 - Cdigo para a Construo Inimigo Board
pgina 237
Vah Karamian
223
A maior diferena que voc vai notar aqui o ponto de partida para
a varivel i . Esta porque precisamos de deslocar a criao real
do GameObject a uma coordenada especfica. Isto usado especificamente
apenas para a colocao do objecto no mundo 3D.
Se voc notar, utilizamos as variveis de linha e col para os dados reais

atribuio para a Unidade de Conselho, e no as, i e j variveis como antes.


Isto porque, a linha e col representam os nmeros que queremos inter
nalmente para a placa de unidade e tambm o armazenamento do GameObject na
matriz de 2 dimensionsl representando tabuleiro de jogo do inimigo. Outro que no seja
que, tudo o resto a mesma lgica.
Update () funo de implementao
A prxima funo devemos olhar o Update () funo. este
funo o corao do script. Ele chamado a cada quadro nico,
o motor de jogo Unity. Tambm controla o fluxo do jogo.
// Update chamado uma vez por quadro
anular Update ()
{
Se ( este .IsBusy)
retornar;
Se ( este .count <5)
{
// Se a seta para cima ou o boto direito do mouse foi clicado, em seguida,
alternar entre
// Vertical e horizontal
se ( Input .GetKeyDown ( KeyCode .UpArrow) || entrada .GetMouseButtonUp (1))
isso ! .vertical = este .vertical;
Se ( este .vertical)
{
este .butVertical.gameObject.SetActive ( verdadeiro );
este .butHorizontal.gameObject.SetActive ( false );
}
outro
{
este .butVertical.gameObject.SetActive ( false );
este .butHorizontal.gameObject.SetActive ( verdadeiro );
}
este .CheckPlayerBoard ();
}
outro
{
se (placeEnemyShips)
pgina 238
Unity 3D - Jogo de Programao Intro
224
{
// botes de orientao desativar
este .butHorizontal.gameObject.SetActive ( false );
este .butVertical.gameObject.SetActive ( false );
//Debug.Log("I VOU COLOCAR navios inimigos AGORA ");
// Colocar os navios inimigos
esta .PlaceEnemyShips ();
este .START_GAME = verdadeiro ;
}
Se ( este .START_GAME)
{
este .butUIReset.gameObject.SetActive ( verdadeiro );

este .canvasScoreBoard.enabled = verdadeiro ;


este .CheckAttackBoard ();
Se ( este .playerHitCount> = esta .maxNumberOfHits || este .enemyHitCount> = esta .maxNumberOfHits)
{
este .START_GAME = false ;
}
este .lblPlayerScore.text = cadeia .format ( "{00:00}" , este .playerHitCount);
este .lblAIScore.text = cadeia .format ( "{00:00}" , este .enemyHitCount);
}
outro
{
// Algum ganhou o jogo!
Se ( esse .playerHitCount> = esta .maxNumberOfHits)
{
// Fazer outro grfico para representar o cone do vencedor
este .lblPlayerScore.text = cadeia .format ( "{00:00}" , este .playerHitCount);
este .imgYouWin.enabled = verdadeiro ;
}
Se ( esse .enemyHitCount> = esta .maxNumberOfHits)
{
// Fazer outro grfico para representar o cone do vencedor
este .lblAIScore.text = cadeia .format ( "{00:00}" , este .enemyHitCount);
este .imgYouLose.enabled = verdadeiro ;
// Exibe as restantes peas do navio inimigo
para ( int i = 0; i <10; i ++)
{
para ( int j = 0; j <10; j ++)
{
GameObject tmp = boardEnemy [i, j];
pgina 239
Vah Karamian
225
se (tmp.GetComponent < BoardUIVer1 > (). OCUPADOS &&! tmp.GetComponente < BoardUIVer1 > (). ATACADO)
{
tmp.transform.GetComponent < Renderer > (). material.color =
Cor .cyan;
}
}
}
}
// Muda o modo de processamento de gua
gua tmpWater = este .myWater.gameObject.GetComponent < gua > ();
tmpWater.waterMode = gua . WaterMode .Reflective;
este .cameraEndGame.gameObject.SetActive ( verdadeiro );
}
}

}
Cdigo Bloco 53 - funo Update () definida na classe BoardVer1
O Update () funo um pouco complexo, mas administrvel.
O primeiro se verifica a condio para ver se o segmento est ocupado com base em um
Varivel booleana chamada IsBusy , e se assim for, ele sai da funo at que o
prximo ciclo. Esta varivel atualizado por pro- colocao navio da AI
cesso.
O bloco condio prxima
Se ( este .count <5)
lida com o jogador de
colocao navio. A contagem varivel usada para manter o controle do lugarmento de pedras do jogador. Assim, a partir de 0, incrementa-se de cada vez
h uma colocao bem sucedida de uma pea do jogo em cima da prancha. Dentro
o bloco if, a verificao de cdigo para a entrada do mouse do usurio para ver se o
boto direito do mouse sobre o mouse ou a seta para cima foi pressionada, se EIterap uma destas condies for verdadeiro, ento a orientao da pea
colocao ser invertido. Isso feito usando o
este .vertical
varivel
capaz.
O prximo conjunto de se os blocos so utilizados para atualizar a interface GUI
com base na entrada de utilizador para o boto de orientao. Finalmente, as chamadas de cdigo
a
este .CheckPlayerBoard ();
funo que, em seguida, cuida da accolocao tual da pea do jogo. Esta funo ser coberto
separadamente.
Na seo else do if condio, determinamos se o AI
precisa para comear a colocar as suas peas do jogo ou o jogo est pronto para comear.
pgina 240
Unity 3D - Jogo de Programao Intro
226
Dentro do corpo da outra condio, vemos o primeiro se condision
E se
(placeEnemyShips)
. Esta condio verifica a varivel placeEnemyNavios para determinar se o computador AI ainda tem peas do jogo para
colocao, e em caso afirmativo, em seguida, ele chama o
esta .PlaceEnemyShips ();
funo
para completar a colocao das peas em conformidade. Esta funo
ser coberto separadamente em detalhe. Uma vez que o retorno de funo, ele define o VaR
iable para identificar o incio do jogo.
Isso nos leva ao prximo se a condio dentro do bloco else
Se ( este .START_GAME)
. Esse bloco de cdigo onde o jogo real comea,
e a funo principal para lidar com a entrada do utilizador e tambm a
AI
este .CheckAttackBoard ();
. Esta funo muito envolvido e
sero abordados separadamente. Cada vez atravs do Update () funo,

o cdigo verifica para ver se h um vencedor no jogo.


A seo else do bloco de cdigo exibe corretamente a pontuao para
o usurio. Se o computador AI o vencedor do jogo, ele tambm exibir
todas as peas do jogo no tabuleiro, o que inclui o hit eo no-hit
peas do jogo.
CheckPlayerBoard () implementao da funo
Indo para baixo na ordem de como as funes esto a ser chamado a partir de
dentro do Update () funo, vamos cobrir a nossa prxima funo chamada
CheckPlayerBoard () .
private void CheckPlayerBoard ()
{
se ( Input .mousePosition! = NULL )
{
// Capturar a posio do mouse e lana um raio para ver o objeto que atingiu
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora tmpHitHighlight, 100))
{
BoardUIVer1 tmpUI = tmpHitHighlight.transform.GetComponente < BoardUIVer1 > ();
se (tmpHitHighlight.transform.tag.Equals ( "Conselho" ) &&
! TmpUI.OCCUPIED)
{
BoardUIVer1 boardData = boardPlayer [tmpUI.ROW,
tmpUI.COL] .transform.GetComponent < BoardUIVer1 > ();
se (tmpHighlight! = NULL )
pgina 241
Vah Karamian
227
{
Se (boardData.OCCUPIED)
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .Red;
outro
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .white;
}
Se ( esse .tmpBlockHolder! = NULL )
{
Destroy ( este .tmpBlockHolder);
}
Se ( este .PLACE_BLOCK)
{
este .tmpBlockHolder = new GameObject ();
este .OK_TO_PLACE = verdadeiro ;
se (! este .vertical && (tmpUI.ROW <= 10 - este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab, nova Vector3 (tmpUI.ROW + i, este .CubePrefab.transform.position.y,
tmpUI.COL), este .CubePrefab.transform.rotation) como GameObject ;

GameObject bp = boardPlayer [tmpUI.ROW + i, tmpUI.COL];


BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
}
outro
{
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
Se ( esse .vertical && (tmpUI.COL <= 10 - este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab, nova Vector3 (tmpUI.ROW, este .CubePrefab.transform.position.y,
tmpUI.COL + i), esta .CubePrefab.transform.rotation) como GameObject ;
GameObject bp = boardPlayer [tmpUI.ROW, tmpUI.COL + i];
pgina 242
Unity 3D - Jogo de Programao Intro
228
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
}
outro
{
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
}
tmpHitHighlight.transform.GetComponent < Renderer > (). material.color = Cor .Blue;

tmpHighlight = tmpHitHighlight.transform.gameObject;
}
}
}
Se ( entrada .GetMouseButton (0))
{
// Capturar a posio do mouse e lana um raio para ver o objeto que atingiu
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
RaycastHit atingido;
se ( Fsica .Raycast (ray, fora atingido, 100))
{
Debug log (hit.transform.gameObject.name);
se (hit.transform.tag.Equals ( "board" ))
{
BoardUIVer1 tmpUI = hit.transform.GetComponent < BoardUIVer1 > ();
Se ( este .PLACE_BLOCK && este .OK_TO_PLACE)
{
se (! este .vertical)
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject sB = boardPlayer [tmpUI.ROW + i, tmpUI.COL];
sB.transform.GetComponent < Renderer > (). material.color =
Cor .Green;
sB.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
pgina 243
Vah Karamian
229
sB.GetComponent < BoardUIVer1 > (). CubePrefab.gameObject.GetComponent < Renderer .> () material.color = Cor .Green;
boardPlayer [tmpUI.ROW + i, tmpUI.COL] = sB;
}
}
Se ( este .vertical)
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject sB = boardPlayer [tmpUI.ROW, tmpUI.COL + i];
sB.transform.GetComponent < Renderer > (). material.color =
Cor .Green;
sB.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
sB.GetComponent < BoardUIVer1 > (). CubePrefab.gameObject.GetComponent < Renderer .> () material.color = Cor .Green;
boardPlayer [tmpUI.ROW, tmpUI.COL + i] = sB;
}
}
este .CheckWhichShipWasPlaced (tmpUI.ROW, tmpUI.COL);
este .OK_TO_PLACE = verdadeiro ;
tmpHighlight = NULL ;
}
// Grupo bloco na placa

Se ( esse .count> = 5)
{
Se ( esse .tmpBlockHolder! = NULL )
{
Destroy ( este .tmpBlockHolder);
}
}
}
}
}
}
Cdigo Bloco 54 - CheckPlayerBoard () Definio de Funo
Ento, a primeira coisa que esta funo faz verificar para ver se o Input.mousePosition no nulo. Isto importante, porque as necessidades do usurio
usar o mouse para colocar o seu jogo pedao em cima da prancha.
A prxima linha de cdigo muito importante. Estamos criando uma Ray obJECT usando a posio do mouse.
pgina 244
Unity 3D - Jogo de Programao Intro
230
Definio matemtica de um raio: Uma poro de uma linha que se inicia num ponto
e apaga-se em uma determinada direo ao infinito.
Um raio usado na Unidade, em conjunto com o Raycast () funo
definido na Fsica objecto, para gerar uma linha lgica no espao 3D
e quando voc atirar o raio, ele realmente ir fornecer informaes indepening qualquer objeto em seu caminho. basicamente usado para Ray Fundio
23
.
Este satetement especial
se ( Fsica .Raycast (ray, fora tmpHitHighlight, 100))
, o que faz o nosso trabalho Raycast e tambm retorna
os dados necessrios necessrio. Os dados de hit armazenado em tmpHighligh variao
ble. Antes de continuar, tambm deve listar algumas variveis temporrias
que so usadas especificamente dentro do CheckPlayerBoard () funo.
GameObject tmpHighlight = NULL ;
RaycastHit tmpHitHighlight;
GameObject tmpBlockHolder = NULL ;
bool privada OK_TO_PLACE = verdadeiro ;
Cdigo Bloco 55 - variveis temporrio utilizado pelo CheckPlayerBoard ()
NOTA: As variveis enumeradas no bloco de cdigo 55 a re todos tambm parte da classe
dados, no entanto, eles foram listados logo acima do CheckPlayerBoard () funo
para esclarecimentos.
Devido natureza da configurao da cena sabemos que os nicos objetos
que pode ser atingido pelo Raycast vo ser os Conselhos de Unidade e tambm
as outras peas do jogo. O que gostaramos de fazer extrair o
BoardUIVer1 componente do tmpHitHighlight varivel e incio
processar o objecto.
H duas condies que estamos procurando, em primeiro lugar, queremos fazer
-se que o hit raycast registado uma unidade de bordo. Isto feito com a
identificao da etiqueta. A segunda condio ter certeza de que o

determinada unidade de bordo no ocupada. Se forem satisfeitas estas duas condies,


23
Raio de fundio a utilizao de testes de interseco do raio da superfcie de resolver uma
variedade de problemas em
computao grfica e geometria computacional. O termo foi usado pela primeira vez em
computao grfica
em um papel 1982 por Scott Roth para descrever um mtodo para render geometria slida
construtiva
modelos.
pgina 245
Vah Karamian
231
prosseguir com o processamento dos dados reais no boardPlayer [,] 2 dimenso
matriz cional armazenar o n de dados reais.
O cdigo fica bastante complexa aqui, ento vamos lev-la a seo por seo
o.
se ( Fsica .Raycast (ray, fora tmpHitHighlight, 100))
{
BoardUIVer1 tmpUI = tmpHitHighlight.transform.GetComponente < BoardUIVer1 > ();
se (tmpHitHighlight.transform.tag.Equals ( "Conselho" ) &&
! TmpUI.OCCUPIED)
{
BoardUIVer1 boardData = boardPlayer [tmpUI.ROW,
tmpUI.COL] .transform.GetComponent < BoardUIVer1 > ();
se (tmpHighlight! = NULL )
{
Se (boardData.OCCUPIED)
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .Red;
outro
tmpHighlight.GetComponent < Renderer > (). material.color =
Cor .white;
}
Se ( esse .tmpBlockHolder! = NULL )
{
Destroy ( este .tmpBlockHolder);
}
Se ( este .PLACE_BLOCK)
{
este .tmpBlockHolder = new GameObject ();
este .OK_TO_PLACE = verdadeiro ;
se (! este .vertical && (tmpUI.ROW <= 10 - este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab, nova Vector3 (tmpUI.ROW + i, este .CubePrefab.transform.position.y,
tmpUI.COL), este .CubePrefab.transform.rotation) como GameObject ;
GameObject bp = boardPlayer [tmpUI.ROW + i, tmpUI.COL];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();

se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
}
outro
{
pgina 246
Unity 3D - Jogo de Programao Intro
232
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
Se ( esse .vertical && (tmpUI.COL <= 10 - este .blockSize))
{
para ( int i = 0; i < esta .blockSize; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab, nova Vector3 (tmpUI.ROW, este .CubePrefab.transform.position.y,
tmpUI.COL + i), esta .CubePrefab.transform.rotation) como GameObject ;
GameObject bp = boardPlayer [tmpUI.ROW, tmpUI.COL + i];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
visual.GetComponent < Renderer > (). material.color =
Colorir .gray; // ok para o lugar
}
outro
{
visual.transform.localScale = new Vector3 (0.6f,
0.6f, 0.6f);
visual.GetComponent < Renderer > (). material.color =
Cor .yellow; // No ok
este .OK_TO_PLACE = false ;
}
visual.transform.parent = este .tmpBlockHolder.transFormato;
}
}
}
tmpHitHighlight.transform.GetComponent < Renderer > (). material.color = Cor .Blue;
tmpHighlight = tmpHitHighlight.transform.gameObject;
}

}
}
Cdigo Bloco 56 - Determinar o que objetar que tm atingido por vazamento ray.
pgina 247
Vah Karamian
233
Tentar explicar o que est acontecendo na linha-a-linha ser um pouco excessiva
whelming. No faria mais sentido para dar-lhe um informativo geral
ver no bloco de cdigo e ter voc cavar atravs dele para os detalhes.
Cdigo Bloco 56 do es algumas coisas para ns. A primeira coisa que performas nosso elenco ray. Ns obter os dados retornados pelo ray casting
functino para determinar que tipo de GameObjects temos atingido. Se o
GameObject retornado uma Unidade Conselho pertencente ao jogador, eo
Unidade de bordo no est ocupado, comeamos o processo principal de recuperar a
principais dados da matriz de 2 dimenses que prendem a placa jogo real
dados. Com base no estado da unidade da placa de sucesso, que altere a cor da
unidade de bordo para vermelho se ele estiver ocupado, visualmente notificando o usurio que
eles no pode colocar uma unidade em que o local particular, ou que o branco
cor padro para uma placa de unidade vazio.
Em seguida, se o jogador capaz de colocar seu bloco, o cdigo itera
atravs do e gera dinamicamente pistas visuais para a colocao de
a parte do jogo, neste caso, o selecione pea navio. Durante todo o iteraes
o e de verificao da disponibilidade de unidades de tabuleiro ao longo da via,
que determina se a pea do jogo pode ser colocado no local seleccionado ou
no. Se todos os controlos e verificaes so OK o programa, em seguida, na verdade,
toma os dados e grava-lo no tabuleiro de jogo do jogador. Este processo
repete at que todas as peas do jogo foram colocados em cima da prancha.
CheckWhichShipWasPlaced () implementao da funo
Esta funo usada para inicializar os prefabs do navio seleccionado
para ser colocado no tabuleiro. Usou-se as posies de linha e coluna como a
origem para a colocao ea identificao real do navio feito
atravs do ID que foi atribudo em tempo de design.
private void CheckWhichShipWasPlaced ( int linha, int col)
{
interruptor ( este .currentShipID)
{
case 1:
{
se (! este .vertical)
{
// Lugar que o mais vertical
GameObject testingVisual = GameObject .Instantiate ( este .AdmiralKuznetsov, nova Vector3 (linha + 2,
pgina 248
Unity 3D - Jogo de Programao Intro
234
este .AdmiralKuznetsov.transform.position.y, col), este .AdmiralKuznetsov.transform.rotation) como GameObject ;
testingVisual.transform.RotateAround (testingVisual.transform.posio, Vector3 .At, 90.0f);

}
outro
{
GameObject testingVisual = GameObject .Instantiate ( este .AdmiralKuznetsov, nova Vector3 (linha, este .AdmiralKuznetsov.transform.position.y,
col + 2), este .AdmiralKuznetsov.transform.rotation) como GameObject ;
}
// Porta-avies foi colocada, boto de desativar
este .butAircraftCarrier.gameObject.SetActive ( false );
este .count ++;
break;
}
Caso 2:
{
se (! este .vertical)
{
// Lugar que o mais vertical
GameObject testingVisual = GameObject .Instantiate ( este .Steregushchiy, nova Vector3 (linha + 1.5f, este .Steregushchiy.transform.position.y,
col), este .Steregushchiy.transform.rotation) como GameObject ;
testingVisual.transform.RotateAround (testingVisual.transform.posio, Vector3 .At, 90.0f);
}
outro
{
GameObject testingVisual = GameObject .Instantiate ( este .Steregushchiy, nova Vector3 (linha, este .Steregushchiy.transform.position.y,
col + 1.5f), este .Steregushchiy.transform.rotation) como GameObject ;
}
// Navio de batalha foi colocada, boto de desativar
este .butBattleship.gameObject.SetActive ( false );
este .count ++;
break;
}
Caso 3:
{
se (! este .vertical)
{
// Lugar que o mais vertical
GameObject testingVisual = GameObject .Instantiate ( este .AdmiralSergeyGorshkov, nova Vector3 (linha + 1,
este .AdmiralSergeyGorshkov.transform.position.y, col),
este .AdmiralSergeyGorshkov.transform.rotation) como GameObject ;
testingVisual.transform.RotateAround (testingVisual.transform.posio, Vector3 .At, 90.0f);
}
pgina 249
Vah Karamian
235
outro
{

GameObject testingVisual = GameObject .Instantiate ( este .AdmiralSergeyGorshkov, nova Vector3 (linha,


este .AdmiralSergeyGorshkov.transform.position.y, col + 1),
este .AdmiralSergeyGorshkov.transform.rotation) como GameObject ;
}
// Submarine foi colocado, desativar o boto
este .butSubmarine.gameObject.SetActive ( false );
este .count ++;
break;
}
Caso 4:
{
se (! este .vertical)
{
// Lugar que o mais vertical
GameObject testingVisual = GameObject .Instantiate ( este .IverHuitFeldt, nova Vector3 (linha + 1,
este .IverHuitfeldt.transform.position.y, col),
este .IverHuitfeldt.transform.rotation) como GameObject ;
testingVisual.transform.RotateAround (testingVisual.transform.posio, Vector3 .At, 90.0f);
}
outro
{
GameObject testingVisual = GameObject .Instantiate ( este .IverHuitFeldt, nova Vector3 (linha,
este .IverHuitfeldt.transform.position.y, col + 1),
este .IverHuitfeldt.transform.rotation) como GameObject ;
}
// Destroyer foi colocado, desativar o boto
este .butDestroyer.gameObject.SetActive ( false );
este .count ++;
break;
}
Caso 5:
{
se (! este .vertical)
{
// Lugar que o mais vertical
GameObject testingVisual = GameObject .Instanticomeu ( este .MRVikhrIFQ, nova Vector3 (linha + 0.5f,
este .MRVikhrIFQ.transform.position.y, col), este .MRVikhrIFQ.transform.rotao) como GameObject ;
testingVisual.transform.RotateAround (testingVisual.transform.posio, Vector3 .At, 90.0f);
}
outro
{
GameObject testingVisual = GameObject .Instanticomeu ( este .MRVikhrIFQ, nova Vector3 (linha,
pgina 250

Unity 3D - Jogo de Programao Intro


236
este .MRVikhrIFQ.transform.position.y, col + 0.5f), este .MRVikhrIFQ.transform.rotation) como GameObject ;
}
// Barco de patrulha foi colocado, desativar o boto
este .butPatrolBoat.gameObject.SetActive ( false );
este .count ++;
break;
}
}
// Dados internos clara
este .currentShipID = 0;
este .blockSize = 0;
}
Cdigo Bloco 57 - Visualmente colocando a pea selecionada para o tabuleiro de jogo
O principal lgico no cdigo aqui para identificar o ID do navio e
instanciar corretamente o pr-fabricada associado para o tabuleiro de jogo.
PlaceEnemyShips () implementao da funo
Uma vez que todas as peas do jogo do jogador foram colocados no
bordo, a AI tem de fazer o mesmo. Os PlaceEnemyShips () funo
usada para colocar as peas para o adversrio do computador.
private void PlaceEnemyShips ()
{
este .placeEnemyShips = false ;
para ( int i = 0; i < esta .ships.Length; i ++)
{
int linha = Aleatrio .Range (0,9);
int col = Aleatrio .Range (0,9);
bool ori = ( aleatrio .Range (0, 9)> 5)? verdadeira : false ;
este .CheckBoardForEnemyPlacement (linha, col, este .ships [i], ori);
}
}
Cdigo Bloco 58 - Funo de AI para colocar peas do jogo
A funo usa um loop for para percorrer todo o jogo
peas que precisam ser colocados no tabuleiro de jogo AI. Dentro do para
loop, a lgica gera uma linha aleatria e uma posio da coluna aleatria
e uma orientao aleatria para o pedao de corrente que est a ser preparado para
colocao.
pgina 251
Vah Karamian
237
CheckBoardForEnemyPlacement () implementao da funo
O trabalho real feito por uma funo de apoio denominado Check
BoardForEnemyPlacement () . Esta uma funo recursiva e aqui
a lista para ele.
private void CheckBoardForEnemyPlacement ( int linha, int col, int tamanho, bool
hor)
{
GameObject checkUnit = boardEnemy [linha, col];
se (checkUnit.GetComponent < BoardUIVer1 > (). OCUPADOS || (linha + size> 9) ||

(Col + size> 9))


{
int R1 = aleatria .Range (0, 9);
int C1 = aleatria .Range (0, 9);
este .CheckBoardForEnemyPlacement (R1, c1, tamanho hor);
retornar;
}
bool okToPlace = verdadeiro ;
se (! hor && (linha + tamanho <10))
{
para ( int i = 0; i <size; i ++)
{
GameObject bp = boardEnemy [row + i, col];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
// OkToPlace = true;
}
outro
{
okToPlace = false ;
}
}
}
se (hor && (tamanho col + <10))
{
para ( int i = 0; i <size; i ++)
{
GameObject bp = boardEnemy [linha, col + i];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
se (! bpUI.OCCUPIED)
{
// OkToPlace = true;
}
outro
{
okToPlace = false ;
}
}
pgina 252
Unity 3D - Jogo de Programao Intro
238
}
Se (okToPlace)
{
se (hor!)
{
para ( int i = 0; i <size; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab,
nova Vector3 (linha + i, 11.9f, col),

este .CubePrefab.transform.rotation) como GameObject ;


visual.GetComponent < Renderer > () material.color =. Cor .yellow;
visual.tag = "enemyPrefabPH" ;
GameObject sB = boardEnemy [row + i, col];
sB.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
boardEnemy [row + i, col] = sB;
visual.gameObject.name = cadeia .format ( "EN-R - [{0}, {1}]" , row +
i, col);
}
}
se (hor)
{
para ( int i = 0; i <size; i ++)
{
GameObject visuais = GameObject .Instantiate ( este .CubePrefab,
nova Vector3 (linha, 11.9f, col + i),
este .CubePrefab.transform.rotation) como GameObject ;
visual.GetComponent < Renderer > () material.color =. Cor .magenta;
GameObject sB = boardEnemy [linha, col + i];
sB.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
boardEnemy [linha, col + i] = sB;
visual.gameObject.name = cadeia .format ( "EN-C - [{0}, {1}]" , fila,
col + i);
}
}
}
outro
{
int R1 = aleatria .Range (0, 9);
int C1 = aleatria .Range (0, 9);
este .CheckBoardForEnemyPlacement (R1, c1, tamanho hor);
}
}
Cdigo Bloco 59 - Funo responsvel pela colocao pea do jogo AI
pgina 253
Vah Karamian
239
Atravessar a funo voc notar que usamos a linha e col
que foram passados para a funo para obter os dados a partir do 2-dimensional
matriz que representa tabuleiro de jogo do computador. A prxima verificao deminar se a posio seleccionada j est ocupado ou no, e se o
linha e coluna, mais o tamanho da pea esto dentro dos limites do jogo
Placa dada a posio. Se este no for o caso, o programa de re-geates esses valores e chama prprio novamente.
Se o primeiro cheque passado, vamos passar para a segunda seleo. Somente
como quando estvamos colocando as peas do jogo do jogador, precisamos de uma forma de
determinar se a posio seleccionada pelo computador vlido para lugarmento.
Se estamos OK para colocar a pea, em seguida, o programa atualiza o
placas unidade identificada com o status mais recente. Caso contrrio, ele gera uma
novo conjunto de linha e coluna e chama a funo mais uma vez, e vai

por todo o processo novamente. Isto continua da at que todo o


peas foram correctamente colocada na placa do computador. Se houver
uma falta, ento a vez de atacar alterado para o jogador.
CheckAttackBoard () implementao da funo
Seguindo em frente, a prxima funo temos lista de o Check
AttackBoard () funo.
private void CheckAttackBoard ()
{
// Verifica para ver quem transform-lo
Se ( este .PLAYER_TURN)
{
se ( Input .mousePosition! = NULL )
{
// Capturar a posio do mouse e lana um raio para ver o objeto que
acertar
Ray ray = Cmara .main.ScreenPointToRay ( Input .mousePosition);
se ( Fsica .Raycast (ray, fora tmpAttackHitHighlight, 200))
{
BoardUIVer1 tmpUI = tmpAttackHitHighlight.transform.GetComponente < BoardUIVer1 > ();
Se (tmpAttackHitHighlight.transform.tag.Equals ( "boardAttack" ) &&
! TmpUI.ATTACKED)
{
GameObject pb = boardEnemy [tmpUI.ROW, tmpUI.COL];
BoardUIVer1 bpUI = bp.GetComponent < BoardUIVer1 > ();
pgina 254
Unity 3D - Jogo de Programao Intro
240
se (tmpAttackHighlight! = NULL )
{
Se (bpUI.ATTACKED)
{
Se (bpUI.ATTACKED)
{
tmpAttackHighlight.GetComponent < Renderer > (). material.color = Cor .gray;
}
}
outro
{
tmpAttackHighlight.GetComponent < Renderer > (). material.color = Cor .white;
}
}
tmpAttackHitHighlight.transform.GetComponent < Renderer > (). material.color = Cor .Blue;
tmpAttackHighlight = tmpAttackHitHighlight.transform.gameObjecto;
}
}
}

Se ( entrada .GetMouseButton (0))


{
Ray ray1 = Cmara .main.ScreenPointToRay ( Input .mousePosition);
RaycastHit atingido;
se ( Fsica .Raycast (ray1, fora batida, 200))
{
Debug log (hit.transform.gameObject.name);
Se (hit.transform.tag.Equals ( "boardAttack" ))
{
BoardUIVer1 tmpUI = hit.transform.GetComponente < BoardUIVer1 > ();
GameObject enemyBoard = boardEnemy [tmpUI.ROW, tmpUI.COL];
Debug log ( cadeia .format ( "Board inimigo: {0}" , enemyBoard.transform.name));
// Verificar para ver se temos um hit na placa de jogador
// Precisamos ter certeza de que ns no aumentam apenas porque
estamos acertando a bordo
se (enemyBoard.GetComponent < BoardUIVer1 > (). OCUPADOS &&! enomyBoard.GetComponent < BoardUIVer1 > (). ATACADO)
{
// Temos um hit
enemyBoard.transform.GetComponent < BoardUIVer1 > (). OCUPADOS
= Verdadeiro ;
enemyBoard.transform.GetComponent < BoardUIVer1 > (). ATACADO
= Verdadeiro ;
pgina 255
Vah Karamian
241
enemyBoard.transform.GetComponent < Renderer > (). material.color = Cor .Red;
hit.transform.GetComponent < Renderer > (). material.color =
Cor .Red;
// Temos um hit, udio exploso jogo
este .audioSource.PlayOneShot ( este .explosionEnemyBlast,
0.75f);
este .playerHitCount + = 1;
este .playerHadHit = verdadeiro ;
}
outro
{
enemyBoard.transform.GetComponent < BoardUIVer1 > (). ATACADO
= Verdadeiro ;
enemyBoard.transform.GetComponent < Renderer > (). material.color = Cor .gray;
hit.transform.GetComponent < Renderer > (). material.color =
Cor .gray;
este .playerHadHit = false ;
}
boardEnemy [tmpUI.ROW, tmpUI.COL] = enemyBoard;
tmpAttackHighlight = NULL ;
}

}
}
Se ( entrada .GetMouseButtonUp (0))
{
se (! este .playerHadHit)
{
// Agora vamos capturar o verdadeiro aspecto de virada do jogador vs.
AI
este .PLAYER_TURN =! este .PLAYER_TURN;
este .playerHadHit = false ;
}
}
}
outro
{
int R1 = 0;
int C1 = 0;
Se ( este .gotoLastHit)
{
este .hit_dir = este .hit_dir_last;
este .hit_row = este .hit_row_last;
este .hit_col = este .hit_col_last;
este .gotoLastHit = false ;
}
interruptor ( este .hit_dir)
pgina 256
Unity 3D - Jogo de Programao Intro
242
{
// Certifique-se de verificar os limites ...
caso HitDirection .At:
{
R1 = este .hit_row + 1;
c1 = este .hit_col;
break;
}
caso HitDirection .right:
{
c1 = este .hit_col + 1;
R1 = este .hit_row;
break;
}
caso HitDirection .down:
{
R1 = este .hit_row - 1;
c1 = este .hit_col;
break;
}
caso HitDirection .Left:
{
c1 = este .hit_col - 1;

R1 = este .hit_row;
break;
}
default:
{
R1 = aleatria .Range (0, 9);
C1 = aleatria .Range (0, 9);
break;
}
}
se ((R1 <0 || R1> 9) || (c1 <0 || C1> 9))
{
// Ns aldo precisa verificar e alterar hit_direction aqui ...
este .ChangeHitDirection ();
este .CheckAttackBoard ();
// Tentar uma nova unidade
retornar;
// Sada aps a chamada de volta
}
Debug log ( cadeia .format ( "R1 = {0}, C1 = {1}" , R1, c1));
GameObject playerBoard = boardPlayer [R1, C1];
// Verificar para ver se a unidade tiver sido atacados antes, se tiver sido
em seguida, tentar um novo local
se (playerBoard.GetComponent < BoardUIVer1 > (). ATACADO)
{
// Ns aldo precisa verificar e alterar hit_direction aqui ...
este .ChangeHitDirection ();
pgina 257
Vah Karamian
243
este .CheckAttackBoard ();
// Tentar uma nova unidade
retornar;
// Sada aps a chamada de volta
}
// Verificar para ver se temos um hit na placa de jogador
se (playerBoard.GetComponent < BoardUIVer1 > (). ocupada)
{
// Temos um hit
playerBoard.transform.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
playerBoard.transform.GetComponent < BoardUIVer1 > () ATACADO =. verdadeira ;
playerBoard.transform.GetComponent < Renderer > (). material.color =
Cor .Red;
// Temos um hit, udio exploso jogo
este .audioSource.PlayOneShot ( este .explosionPlayerBlast, 0.75f);
este .enemyHitCount + = 1;
// Temos um hit
esta .hit_col = c1;
este .hit_row = R1;
esta .hit_col_last = c1;
este .hit_row_last = R1;

este .hit_dir_last = este .hit_dir;


Se ( esse .hit_dir == HitDirection .none)
este .hit_dir = HitDirection .At;
StartCoroutine ( este .Wait4Me ());
}
outro
{
playerBoard.transform.GetComponent < BoardUIVer1 > () ATACADO =. verdadeira ;
playerBoard.transform.GetComponent < Renderer > (). material.color =
Cor .gray;
este .ChangeHitDirection ();
este .PLAYER_TURN =! este .PLAYER_TURN;
este .gotoLastHit = verdadeiro ;
}
boardPlayer [R1, C1] = playerBoard;
}
}
Cdigo Block 60 - CheckAttackBoard lista de funes
A funo CheckAttachBoard () utilizado tanto pelo jogador e
Tambm a AI durante o tempo de jogo. O que significa que, quando o jogador picaretas
uma placa de unidade no tabuleiro de jogo inimigo, ou o AI seleccionar uma placa de unidade
no tabuleiro de jogo do jogador, ento essa funo usada como o ponto de partida
pgina 258
Unity 3D - Jogo de Programao Intro
244
ponto. Como antes, a funo dependente de mais algumas variveis para
contabilidade e etc ... O que se segue uma lista das variveis usadas dentro
a funo:
GameObject tmpAttackHighlight = NULL ;
RaycastHit tmpAttackHitHighlight;
GameObject tmpAttackBlockHolder = NULL ;
#region Memria AI para o sucesso Hit
public enum HitDirection {none, para cima, direita, baixo, esquerda};
int pblica hit_row;
// Usado para a linha atual hit
int pblica hit_col;
// Usado para col atual hit
pblica HitDirection hit_dir;
// Usado para dir atual hit
int pblica hit_row_last;
// Usado para ltima linha hit conhecido
int pblica hit_col_last;
// Usado para ltima col hit conhecido
pblica HitDirection hit_dir_last;
// Usado para ltima dir hit conhecido
bool pblica playerHadHit = false ;
bool pblica gotoLastHit = false ;
#endregion
funo de variveis utilizadas por CheckAttackBoard () - cdigo de bloco 61
As variveis que listei n cdigo de bloco 61 so especificamente utilizados pela
CheckAttackBoard () funo. Como foi referido anteriormente, tm sido de-

multado antes da funo para maior clareza.


Uma grande diferena que deve chamar sua ateno, enquanto voc rever
o cdigo, as variveis definidas para as operaes de IA. As necessidades de IA
para representar a seleo atual hit, e ele tambm precisa manter o controle de
a sua jogada anterior para que ele possa determinar o local e direo
para mover seguinte. As variveis definidas no bloco de cdigo 61 ajuda com estes
operaes.
O primeiro se os cheques de bloco para ver quem a vez para o ataque. Comosuming que a vez do jogador, o programa mais uma vez usa o raio
lanou a operao para agarrar a unidade de bordo que tenha sido devolvido atravs do
tmpAttackHighlight varivel. A lgica aqui quase a mesma que a
definido no CheckPlayerBoard () funo. Mas observe que a nossa condio
es so diferentes. Estamos verificando para ter certeza de que est selecionando o
O conselho do inimigo para o movimento de ataque, e que a placa selecionada
unidade no tem sido atacada antes.
pgina 259
Vah Karamian
245
Se a condio for atendida, usamos a matriz de dados 2-dimensional que
armazena os dados da placa do inimigo para recuperar o estado atual do conselho
unidade e fazer modificaes a ele com base em um xito ou um fracasso. Durante o
processo tambm usamos notificao visual com base no estado do tabuleiro.
Esta lgica acontece durante a seleo / movimento do mouse sobre
placa do inimigo. Uma vez que o boto esquerdo do mouse foi clicado, em seguida,
as operaes reais comear por se registar um sucesso ou um fracasso.
Se (hit.transform.tag.Equals ( "boardAttack" ))
{
BoardUIVer1 tmpUI = hit.transform.GetComponent < BoardUIVer1 > ();
GameObject enemyBoard = boardEnemy [tmpUI.ROW, tmpUI.COL];
Debug log ( cadeia .format ( "Board inimigo: {0}" , enemyBoard.transform.name));
// Verificar para ver se temos um hit na placa de jogador
// Precisamos ter certeza de que ns no aumentar s porque somos hitting a placa
se (enemyBoard.GetComponent < BoardUIVer1 > (). OCUPADOS &&! enemyBoard.GetComponente < BoardUIVer1 > (). ATACADO)
{
// Temos um hit
enemyBoard.transform.GetComponent < BoardUIVer1 > () ocuparam =. verdadeira ;
enemyBoard.transform.GetComponent < BoardUIVer1 > () ATACADO =. verdadeira ;
enemyBoard.transform.GetComponent < Renderer > (). material.color =
Cor .Red;
hit.transform.GetComponent < Renderer .> () material.color = Cor .Red;
// Temos um hit, udio exploso jogo
este .audioSource.PlayOneShot ( este .explosionEnemyBlast, 0.75f);
este .playerHitCount + = 1;
este .playerHadHit = verdadeiro ;
}
outro
{
enemyBoard.transform.GetComponent < BoardUIVer1 > () ATACADO =. verdadeira ;
enemyBoard.transform.GetComponent < Renderer > (). material.color =

Cor .gray;
hit.transform.GetComponent < Renderer .> () material.color = Cor .gray;
este .playerHadHit = false ;
}
boardEnemy [tmpUI.ROW, tmpUI.COL] = enemyBoard;
tmpAttackHighlight = NULL ;
}
Bloco de cdigo 62 - Registrando um xito ou um fracasso pelo jogador
pgina 260
Unity 3D - Jogo de Programao Intro
246
No bloco de cdigo 62, ns isolamos o cdigo responsvel pela
registo de um xito ou um fracasso pelo jogador. Se tivermos um sucesso, ns atualizamos
o estado do tabuleiro da unidade, em conformidade, a exposio, bem como os dados
que representa a placa na matriz 2-dimensional. Da mesma forma que fazemos
o mesmo se o ataque uma miss.
H uma ltima condio preciso verificar, se o jogador tem um hit,
ento ser novamente a vez do jogador para selecionar a prxima posio de ataque.
Caso contrrio, damos a volta ao AI
Se ( entrada .GetMouseButtonUp (0))
{
se (! este .playerHadHit)
{
// Agora vamos capturar o verdadeiro aspecto de virada do jogador vs. AI
este .PLAYER_TURN =! este .PLAYER_TURN;
este .playerHadHit = false ;
}
}
Cdigo Bloco 63 - Mudando voltas aps a seleo do Jogador
Olhando para o cenrio onde a vez do AI para atacar, o AI
verifica para ver se ele tinha um hit do movimento anterior, e se assim for, torna-se
a direo sucesso, a linha hit ea coluna hit. Com base na maes
mao fornecida, decide onde fazer sua prxima jogada. Depois de
mover ns certifique-se de que esto nos limites do tabuleiro. E se
no, ns recursivamente chamar a funo para obter uma nova posio de ataque.
Se tudo estiver bem, ns agarrar dados bordo unidade do jogador, e verifique
se tiver sido anteriormente atacados, se assim que ns comeamos uma nova posio.
Por fim, verifique se a posio selecionada ocupado, este
determina se temos um hit para o movimento. O programa executa a
contabilidade necessrio, salva os dados atualizados para o 2-dimensional
matriz que representa bordo do jogador e o processo vai para o prximo
passo.
pgina 261
Vah Karamian
247
ChangeHitDirection () implementao da funo
A AI usa outra funo para determinar a direo para acertar
no quadro. Isto feito atravs da ChangeHitDirection () funo.
Aqui est uma lista da funo:
private void ChangeHitDirection ()

{
interruptor ( este .hit_dir)
{
// Mudana de direo com base na lgica
caso HitDirection .none:
{
este .hit_dir = HitDirection .At;
break;
}
caso HitDirection .At:
{
este .hit_dir = HitDirection .right;
break;
}
caso HitDirection .right:
{
este .hit_dir = HitDirection .down;
break;
}
caso HitDirection .down:
{
este .hit_dir = HitDirection .Left;
break;
}
caso HitDirection .Left:
{
este .hit_dir = HitDirection .none;
break;
}
}
}
Cdigo Bloco 64 - funo usada para mudar a direo hit para o AI
A funo bastante simples. Ele muda a direo de
o hit com base no padro que foi pr-definida
24
.
A prxima seo ir cobrir as funes e eventos de interface de usurio.
24
Isso muito bsico, e foi implementado para simplificar. Para um melhor desempenho AI
voc pode querer considerar a implementao de um algoritmo de recuo para fazer a melhor jogada
com base em dados histricos.
pgina 262
Unity 3D - Jogo de Programao Intro
248
Jogo User Interface
As seguintes variveis so utilizadas para referenciar os elementos de interface do usurio em
o jogo. As variveis que comeam com butXXX esto representando o mastoneladas definidos na interface do usurio que o usurio pode interagir com. as variveis
comeando com lblXXX esto fazendo referncia rtulos na interface do usurio, as variveis
iniciaring com imgXXX esto fazendo referncia imagens na interface do usurio. a varivel

canvasScoreBoard do tipo da lona e usado para fazer referncia a pontuao


bordo no jogo. Vamos tambm olhar para estes em mais detalhe na prxima
seo.
butAircraftCarrier
butBattleship
butSubmarine
butDestroyer
butPatrolBoat
butUIReset
butExit
butHorizontal
butVertical
canvasScoreBoard
lblPlayerScore
lblAIScore
imgYouWin
imgYouLose
As figuras a seguir ilustram os conceitos de interface do usurio:
Figura 81 - Interface de Usurio - Jogador colocao pea do jogo
Na Figura 81 voc vai notar a posio dos botes primrios
apresentado ao jogador no incio do jogo. Os jogadores espectculos
cinco botes para cada pea de jogo que necessita de ser colocado sobre o jogo
pgina 263
Vah Karamian
249
borda. Uma vez que o jogador escolhe um navio particular, a interface do usurio ir acionar o
as funes necessrias que fornecem o tamanho da pea de jogo, bem como
o ID relacionado com ele. Os detalhes desta matria abordada no seguinte
Sees.
O boto no canto superior esquerdo da tela usado para a orientao do navio que vai ser lugares no conselho, eo
boto no canto superior direito o boto de sada. Esta apenas visvel no
implementaes no-web. Em outras palavras, voc precisa encontrar uma maneira para sair da APplication em um computador ou um dispositivo mvel, este boto vai cuidar
isso para voc!
Figura 82 - User Interface O Jogo
Figura 82 O jogador coloca todas as peas do jogo, a interface do usurio
do jogo muda para refletir de forma adequada. Todos os elementos da interface associaciado a colocao de peas do jogo so substitudos com os elementos de interface do usurio
associada ao quadro de pontuao e a capacidade de reiniciar o jogo e
ou sair do jogo. Isto ilustrado i n Figura 82 . Na prxima seo,
vo discutir os detalhes das funes e os elementos de tempo de design de
GUI.
Eventos do boto para colocar Partes do jogo
Existem duas funes de suporte que so utilizadas no incio de
o jogo para permitir que o jogador para colocar seus / suas peas do jogo. Estes dois
funo so:
pgina 264
Unity 3D - Jogo de Programao Intro
250

butCreateBattleShip (tamanho)
butCreateBattleShipSetID (shipID)
A primeira funo define o tamanho da pea do jogo selecionado, eo
segunda funo define o ID. A varivel tamanho usado pelos Check
PlayerBoard () funo para determinar os limites de colocao das
parte do jogo, e a varivel de ID usado pelo CheckWhichShipWasPlaced () funo para criar uma instncia do pr-fabricada apropriada.
#region eventos de boto PARA COLOCAO navios de batalha
public void butCreateBattleShip ( int size)
{
//this.PLACE_BLOCK = this.PLACE_BLOCK!;
este .blockSize = size;
}
public void butCreateBattleShipSetID ( int shipID)
{
este .currentShipID = shipID;
}
#endregion
Cdigo Bloco 65 - Funo de lidar com parte UI de colocao navio pelo jogador
pgina 265
Vah Karamian
251
Figura 83 - Funes Ref. por Mastoneladas
A fim de que o conceito de
trabalho, voc precisa configurar o enbiente de um modo especfico em
o designer. Quando voc est setting-se os componentes de boto
para cada parte do jogo, voc vai
precisa tambm incluem os dois patros valores que so, em seguida,
usado no cdigo para corretamente
trabalhar na lgica.
A Figura 83, demonstra o
configurao de tempo de design do boto
objeto definido sob a lona.
Note, que, no evento de clique,
anexamos os dois funo
es
25
que precisam de ser disparado.
Cada funo tem um nico
valor, um para o tamanho e o
outro para o ID.
Seguindo este conceito, voc vai ter cada boto disparar ambos
estas funes no evento de clique, e para cada boto os valores para
os parmetros vo ser diferentes.
Tipo de navio
Tamanho
Identidade

Porta-avies
5
1
Battleship
4
2
Submarino
3
3
Destruidor
3
4
Barco de patrulha
2
5
Em seguida, devemos olhar para a funo de reincio.
25
Desde a escrita deste livro, Unidade s suporta funo de valor nico so necessrios
eventos. Portanto, precisamos configurar-lo desta forma passar vrios parmetros.
pgina 266
Unity 3D - Jogo de Programao Intro
252
Boto de eventos para Restart
O boto de reinicializao usado para limpar o jogo e reiniciar todo o
variveis para seus valores padro. Isso d ao jogador a reposio abilityto
o jogo a qualquer momento durante o jogo. Aqui est a lista de cdigos de
a funo de reposio.
public void butRestart ()
{
GameObject [] playerBoardGO = GameObject .FindGameObjectsWithTag ( "board" );
foreach ( var ir em playerBoardGO)
{
Destroy (ir);
}
GameObject [] enemyBoardGO = GameObject .FindGameObjectsWithTag ( "boardAttack" );
foreach ( var ir em enemyBoardGO)
{
Destroy (ir);
}
GameObject [] enemyPrefabPH = GameObject .FindGameObjectsWithTag ( "enomyPrefabPH " );
foreach ( var ir em enemyPrefabPH)
{
Destroy (ir);
}
GameObject [] = shipModels GameObject .FindGameObjectsWithTag ( "shipModel" );
foreach ( var ir em shipModels)
{
Destroy (ir);
}

esta .ResetGUIButtons ();


Comear();
}
Cdigo Bloco 66 - Repor lista de funes
Nesta funo, voc vai notar que o primeiro loop for a iterao
por meio de unidades de tabuleiro do jogador e destru-los um por um. este
processo acontece para todo o outro jogo Objectos presente no 3D
mundo. Assim que o jogo objetos foram destrudos, o ResetGUIButtoneladas () funo chamada para repor os elementos GUI.
private void ResetGUIButtons ()
{
este .butAircraftCarrier.gameObject.SetActive ( verdadeiro );
pgina 267
Vah Karamian
253
este .butBattleship.gameObject.SetActive ( verdadeiro );
este .butSubmarine.gameObject.SetActive ( verdadeiro );
este .butDestroyer.gameObject.SetActive ( verdadeiro );
este .butPatrolBoat.gameObject.SetActive ( verdadeiro );
este .lblPlayerScore.text = cadeia .format ( "00" );
este .lblAIScore.text = cadeia .format ( "00" );
}
Cdigo Bloco 67 - Funo Repor GUI
A funo GUI Redefinir garante que os elementos da interface padro
so visveis e tambm redefine os rtulos de pontuao.
No Captulo 6 - Criando Battleship , discutimos os requisitos
e as especificaes do jogo chamado Batalha do navio. Deu algum histrico
fundo no jogo, introduziu o jogo, e apresentou plano
para a implementao. Isto foi seguido de identificao dos objectos de jogo
que seria necessrio para o nosso jogo, e mais importante o jogo fluir e
a lgica do jogo necessrio para alcanar os nossos objectivos.
No Captulo 7 - se aprofundar no cdigo, ns olhamos para os scripts que
foram criados para fazer todas as peas em nosso trabalho jogo com um umde outros. Comeamos por olhar para o BoardUIVer1.cs script que
responsvel pela gesto do estado do conselho unidade individual em
o jogo de tabuleiro. Em seguida, olhou para a implementao de BoardVer1.cs
script que lida com tudo no jogo.
Agora voc est pronto para criar alguns jogos divertidos!
pgina 268
pgina 269
Vah Karamian
255
Anexo 1 - Tabela de Figuras
ndice de figuras
Figura 1 - loop diagram.............................................................................................9
Figura 2 - Diagrama de loop foreach ............................................ ....................................... 10
Figura 3 - enquanto diagrama de circuito ............................................ ........................................... 11
Figura 4 - do-while diagrama de circuito .......................................... ....................................... 11
Figura 5-Car Object......................................................................................................18

Figura 6-Avio Composite objeto ............................................ ................................ 23


Figura Exemplo 7-Inheritance ............................................. ......................................... 25
Figura 8-Unidade 5 Editor ............................................ .................................................. ..35
Figura 9-Cube Primitive ............................................. .................................................. 38
Figura 10 Inspector Janela ............................................. ........................................... 40
Figura 11-Transform Tools ............................................. .............................................. 41
Figura 12-Posio ........................................................................................................41
Figura 13-Rotation........................................................................................................41
Figura 14-Scale.............................................................................................................41
Figura 15-New Material nomes CH1EX1MAT ........................................... ................. 42
Figura 16 Aplicando o material CH1EX1MAT ao cubo GameObject .................. 44
Figura 17-CUBE2 posio, rotao, escala ......................................... .......................... 46
Figura 18-Script Anexado ao jogo de objetos .......................................... ......................... 49
Figura 19 - Tipos de propriedade, referncia e valor ......................................... ............... 53
Figura 20 - Propriedades de classe Car ............................................ ....................................... 54
Figura 21 - NavMesh Componentes ............................................. .................................. 57
Figura 22 - Conceito Prefab ............................................. .............................................. 59
Figura 23 - Simples 50x50 Terrain ............................................ ..................................... 67
Figura 24 - snap shot de Terrain Ferramenta .......................................... ................................ 68
Figura 25 - Terreno Projeto ............................................. .............................................. 68
Figura 26 - Terreno com textura aplicada ........................................... ............................ 69
Figura 27 - Busca e recolher objetos do jogo .......................................... ....................... 70
Figura 28 - Cube Prefab com Cube Collider .......................................... ...................... 75
Figura 29 - Inspector janela mostrando Box Collider .......................................... ........ 76
Figura 30 - corpo rgido Congelar rotao ............................................ ............................ 79
Figura 31 - Configurao da cmara Terceira Pessoa ........................................... .............................
80
......................................... Collider Interao aps IsTrigger est ativado - Figura 32 ..81
Figura 33 - sada do console para deteco de coliso .......................................... .............. 82
Figura 34 - Drop-Off Plataforma ........................................... ........................................... 85
Figura 35 - Drop Off Zona em ao .......................................... ................................... 88
Figura 36 - Representao visual de uma pilha .......................................... ..................... 89
Figura 37 - Console janela mostrando Pilha Ouput aps a ordem de sucesso ................ 95
Figura 38 - apenas um conceito para o Nvel 2 ......................................... ................................. 96
Figura 39 - Nvel 2 Projeto ............................................ ............................................... 97
Figura 40 - Modelo 3D Quarto ............................................ ............................................. 98
Figura 41 - Modelo 3D na cena Unidade .......................................... ................................. 98
Figura 42 - Hierarquia de quarto ........................................... .................................... 99
Figura
43
Projeto
de
amostra
de
unidades
de
armazenamento
e
colecionador ........................................ 112
pgina 270
Unity 3D - Jogo de Programao Intro
256
Figura 44 - Interface de usurio Amostra 1 ........................................... ................................ 131
Figura 45 - Interface de usurio Amostra 2 ........................................... ................................ 132
Figura
46
Rect
da
barra
de
ferramentas
Ferramenta
Botes ........................................... ............................ 134
Figura 47 - Rect Transformar componentes ............................................ ......................... 135
Figura 48 - Pivot interface ............................................. ............................................. 135
Figura 49 - Anchor UI Elements ............................................ ..................................... 136
Figura 50 - Pr-selecionar Anchor componentes ............................................ ............................ 137

Figura 51 - Canvas com painel anexada ........................................... .......................... 143


Figura 52 - Painel de UI e texto Elemento .......................................... ............................. 145
Figura 53 - Collectables UI Implementado ............................................ ....................... 146
Figura 54 - UI adicional para Matching ........................................... ........................... 147
Figura 55 - Elementos adicionais de interface do usurio para o Nvel
1 ......................................... ................ 148
Figura 56 - Boto OnClick Evento ............................................ .................................. 149
Figura 57 - Nvel 2 Conceito Nvel ........................................... ................................... 154
Figura 58 - Nvel 3 UI Conceito ........................................... ....................................... 160
Figura 59 - Outra amostra UI ............................................ ....................................... 175
Figura 60 - Background Painel de Estado ............................................ .............................. 177
Figura 61 - Fundo do painel Mensagem ............................................ .......................... 177
Figura 62 - Fundo do painel Inimigo ............................................ ............................ 177
Figura 63 - Painel de texturas aplicadas ao nvel 3 ......................................... .................. 178
Figura 64 - Nvel 3 UI Enhancement ........................................... ............................... 179
Figura 65 - lona World Space Propriedades ........................................... ..................... 180
Figura 66 - Conceito UI para Bar Sade .......................................... .............................. 182
Figura 67 - Space World Canvas Hierarquia ........................................... ..................... 182
Figura 68-Grid Amostra layout ............................................ ....................................... 185
Figura 69-Unidade Base Board ............................................ ............................................. 187
Figura 70-Board Unit com textura e Elementos UI Aplicada .................................... 188
Figura 71-A Board...................................................................................................191
A Figura 72 mostra detalhes por Unidade Conselho .......................................... ....................... 192
Figura 73 - Estrutura BoardUnitPlayer ............................................. ........................... 196
Figura 74 - CubeWreck Prefab ............................................. ....................................... 197
Figura 75 - Jogo de Fluxo de Alto Nvel ........................................... ................................. 199
Figura 76 - Jogador Navio Placement Diagrama de Fluxo .......................................... ............ 200
Figura 77 - AI Navio Placement Diagrama de Fluxo .......................................... ................ 201
Figura 78 - O Jogo Logic ............................................ .......................................... 202
Figura 79 - Jogo GUI Conceito ............................................ ...................................... 204
Figura 80 - Jogo GUI Score exibio ........................................... .............................. 205
Figura 81 - Interface de Usurio - Jogador colocao pea do jogo ........................................ ..248
Figura 82 - User Interface O Jogo ........................................... .............................. 249
Figura 83 - Funes Ref. por botes ................................................ ........................ 251
pgina 271
Vah Karamian
257
Apndice 2 - Tabela bloco de cdigo
Tabela bloco de cdigo
Cdigo de bloco tipos 1-variveis de atribuio e de dados ......................................... ............... 5
Cdigo Bloco 2-se ... exemplo de estrutura de outra ......................................... ............................ 5
Cdigo Bloco 3 - declarao if..else Nested ........................................ ................................ 6
Cdigo Bloco 4-switch exemplo estrutura declarao .......................................... ............... 7
Cdigo de bloco amostras estrutura 5 de circuito ........................................... ................................ 12
Cdigo Bloco 6-exemplo de um mtodo .......................................... .................................... 13
Cdigo Bloco 7 - parmetro passe Mtodo por referncia ......................................... .......... 14
Cdigo
Bloco
programa
de
8
simples
calculadora
de
demonstrao .......................................... .................. 16
Cdigo Bloco 9 - Class Car Amostra ........................................... ...................................... 19
Cdigo Bloco 10 - classe Car usando propriedades .......................................... ........................ 21
Cdigo Bloco 11 - Estrutura de Dados MyStack ........................................... .......................... 27

Cdigo Bloco 12 - Cdigo de exemplo Generics ........................................... ............................ 28


Cdigo Bloco 13 - Simples manipulador de eventos Exemplo .......................................... ...............
32
Cdigo Bloco 14 - Class carro com manipulador de eventos ......................................... ....................
34
Cdigo Bloco 15 - SerializeField para Inspector Janela .......................................... ....... 54
Cdigo Bloco 16 - MyCollectable.cs listando .......................................... .......................... 77
Cdigo Bloco 17 - PlayerInput () verso inicial ......................................... ...................... 79
Cdigo Bloco 18 - MyCollectable.cs ver 2 ......................................... ............................. 82
Cdigo Bloco 19 - MyCollectableData.cs ........................................... ............................. 83
Cdigo Bloco 20 - PlayerInput.cs Ver. 2 ................................................. ......................... 84
Cdigo Bloco 21 - PlayerInput.cs Ver. 3 ................................................. ......................... 88
Cdigo Bloco 22 - Estrutura de dados Pilha ........................................... ............................... 90
Cdigo Bloco 23 - PlayerInput.cs Ver. 4 ................................................. ......................... 94
Cdigo Bloco 24 - Cdigo de Seleo de quarto Listing .......................................... ................ 100
Cdigo Bloco 25 - Porta de Correr Listagem de cdigo .......................................... ..................... 102
Cdigo
Bloco
26
RoomSelection
script
de
atualizao
para
incluir
temporizador .............................. 105
Cdigo Bloco 27 - PlayerInput.cs Atualizao para incluir Temporizador Estado .........................
107
Cdigo Bloco 28 - atualizao SlidingDoor.cs Script para a funo Temporizador .............................
108
Cdigo Bloco 29 - Quarto Visitou alm de roteiro SlidingDorr.cs ............................... 109
Cdigo Block 30 - Adio de roteiro PlayerInput.cs para lidar com quartos visitou ............... 110
Cdigo Bloco 31 - MyStorage.cs ......................................... verso inicial ................... 114
Cdigo Bloco 32 - MyCollector.cs verso 1 ......................................... ........................ 116
Cdigo Bloco 33 - MyResource.cs verso 1 ......................................... ........................ 117
Cdigo Bloco 34 - MyEnemy.cs verso 1 ......................................... ........................... 121
Cdigo Bloco 35 - PlayerInput.cs com funo ataque inimigo .................................... 126
Cdigo Bloco 36 - MyEnemy.cs com funo de Ataque ........................................ ......... 129
Cdigo Bloco 37 - Nvel 1 Variveis de lona Jogo ......................................... ............ 148
Cdigo Bloco 38 - Boto dispara para o Nvel 1 ......................................... ...................... 149
Cdigo Bloco 39 - Nvel 2 Timer e Objective ....................................... cdigo UI ...... 157
Cdigo Block 40 - funo Revista RoomVisited () para o Nvel 2 ................................... 159
Cdigo Bloco 41 - Listagem MyStorage.cs para UI design ....................................... ......... 163
Cdigo Bloco 42 - Listagem MyCollector.cs para UI design ....................................... ...... 165
Cdigo Bloco 43 - Listagem MyResource.cs para UI design ....................................... ...... 166
pgina 272
Unity 3D - Jogo de Programao Intro
258
Cdigo Bloco 44-BoardUIVer1 definio de classe ........................................... ................ 189
Cdigo Bloco 45 Criando o dinamicamente Conselho .......................................... .............. 190
Cdigo Bloco 46 Destaque Lines para Mouse Position e ray casting ...................... 195
Cdigo Bloco 47 - Anncios para BoardUIVer1.cs ......................................... ..................... 209
Cdigo Bloco 48 - Variveis BoardVer1 ............................................ ............................ 214
Cdigo Bloco 49 - Awake (funo) na BoardVer1 ....................................... classe ....... 218
funo Start () in BoardVer1 ....................................... classe - Cdigo Bloco 50 ........... 220
Cdigo Bloco 51 - Cdigo de Construo do Conselho de Administrao
jogador ........................................ ..221
Cdigo Bloco 52 - Cdigo de Enemy Board Construo ......................................... ...... 222
Cdigo Bloco 53 - funo Update () definida na classe BoardVer1 ................................. 225

do

Cdigo Bloco 54 - CheckPlayerBoard () funo Definio ......................................... 229


Cdigo Bloco 55 - variveis temporrio utilizado pelo CheckPlayerBoard () .......................... 230
Cdigo Bloco 56 - Determinar que objeto temos atingido por vazamento ray ........................ 232
Cdigo Bloco 57 - Visualmente colocando a pea selecionada para o tabuleiro de jogo .................
236
Cdigo Bloco 58 - Funo de AI para colocar peas do jogo ....................................... ...... 236
Cdigo Bloco 59 - Funo responsvel pela colocao pea do jogo AI ........................ 238
Cdigo Block 60 - CheckAttackBoard funo de listagem ........................................... ....... 243
Cdigo Bloco 61 - funo de variveis utilizadas por CheckAttackBoard () ............................. 244
Cdigo Bloco 62 - Registrando um xito ou um fracasso pelo jogador ..................................... .....
245
Cdigo Bloco 63 - Alterao das voltas aps a seleo do jogador ......................................... ..246
Cdigo Bloco 64 - funo usada para mudar a direo hit para o AI ...................... 247
Bloco de cdigo 65 - Funo de lidar com parte UI de colocao navio pelo jogador ............. 250
Cdigo Bloco 66 - Lista funo Reset ........................................... ............................. 252
Cdigo Bloco 67 - GUI Funo Repor ........................................... .............................. 253
pgina 273
259
pgina 274

You might also like