Professional Documents
Culture Documents
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
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
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;
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.
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
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:
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 ; }
}
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.
}
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
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
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
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 () {
}
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
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
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 ++;
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,
_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 ;
}
}
}
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
{
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
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 (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
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
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
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 ()
{
}
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
}
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;
}
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
}
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:
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
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-
}
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
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
{
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.
{
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;
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.
}
}
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
}
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,
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
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
{
}
}
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;
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
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);
}
do