Programando com Scripts -...
Transcript of Programando com Scripts -...
AgendadaParte1
1. IntroduçãoautilizaçãodescriptsnoUnity(definiçãodecomportamentoparaosobjetos)
2. Comousarvariáveis3. Comousaroperadores4. Comousarcondicionais5. Comousarlaçosderepetição
•Serápresumidooconhecimentopréviodefundamentosdeprogramaçãoorientadaaobjetos
Scripts
•Aformadedefinircomportamentos
•Sãoanexadosaosobjetosdojogoeatribueminteratividadeaosmesmos
•Processobásico:1. Criarumscript2. Anexaraumoumaisobjetosdojogo3. Definirquaisquerpropriedadesdoscriptcomvalores
oucomreferênciasaoutrosobjetosdojogo
CriandoScripts
• Importanteguarda-losemumapastaespecífica
•Clicandocomobotãodireitodomousesobreessapasta,selecioneCreate >C#Script• Dandoumnomeaomesmo
•Opçõesdelinguagem:• Nativas – C# eUnityScript (baseadaemJavaScript)• Extensões – possibilidadedeutilizaroutraslinguagens.NETcompilandoparaumaDLLcompatível
CriandoScripts
•Aoclicarnoscriptnavisãodeprojeto,navisãodoinspetoréexibidooconteúdodomesmo
•Clicandoduasvezessobreoscript,eleéabertoparaedição• VisualStudioouMonoDevelop
AnexandoumScriptaumObjeto
•Navisãodeprojeto– cliquesobreoscriptesegurando,arraste-oparaoobjetodesejado• Umscriptpodeserarrastadoatéumobjetona:(i)visãodehierarquia,(ii)visãodecenae(iii)visãodoinspetor• Oscripttorna-seumcomponentedoobjeto
EstruturadeumScriptBásico
•Seçãode“Using”– defineasbibliotecasqueserãoutilizadasnaconstruçãodoscriptusing UnityEngine;using System.Collections;
•Seçãodedeclaraçãodeclasse– defineonomedaclasserepresentandooscriptesuahierarquiapublic class HelloWorldScript :MonoBehaviour {}
EstruturadeumScriptBásico
•Conteúdodaclasse– defineatributosemétodos{
//Métodoutilizadoparaainicializaçãovoid Start(){}
//Métodoexecutadoumavezporframe dojogovoid Update(){}
}
•Qualquersaídageradapelojogoéexibidanajaneladeconsole–Window >Console
Variáveis/Atributos
•EmumscriptUnity,umavariávelpodeconter:• Tiposprimitivos(dalinguagemdeprogramação)• Objetosdojogo• Outrosscripts
•Definiçãodevariáveis:<variable type><name>;
•Exemplo:int num1;
Variáveis/Atributos
•Tiposdeescopo:declasseedemétodo/bloco
•Visibilidadedeatributos(escopodeclasse):public eprivate•Modificadoresdeacessibilidade
Operadores
Categoria OperadoresAritméticos + ; - ; * ; / e%Atribuição =; +=; -=; *=; /=; ++ e--Igualdade == ;> ;< ; >= ;<= e!=Lógicos && (and);|| (or)e ! (not)
EstruturasdeControledeFluxo
•AsestruturasdecontroledefluxoseguemopadrãodalinguagemC
•Condicionais(maisutilizadas):• IF• IF– ELSE• IF– ELSEIF
• Laçosderepetição(maisutilizadas):•WHILE• FOR
AgendadaParte2
1. Comoescrevermétodos2. Comocapturaraentradadousuário3. Comotrabalharcomcomponenteslocais4. Comotrabalharcomobjetosdojogo
Métodos
•Podehaverumaconfusãocomaprogramaçãoorientadaaobjetos• Numscriptdefinimosmétodosoufunções?
•Método:representaumaaçãooupropósitoúnico• Podemtrabalharjuntospararesolvertarefascomplexas
Métodos
•Métodospadronizados:• Start:contémocódigoaserexecutadoquandoaprimeiracenativerinício• Update:contémocódigoaserexecutadoemcadaframenodesenrolardacena
•Padrãoparadefinição:<return type><name>(<parameters>){
<Inside the method's block>}
EscrevendoMétodos
•Primeiropasso,questionar-sesobre:• Qualatarefaespecíficaaserrealizada?• Quaisinformaçõesexternassãonecessárias?• Énecessáriodaralgumainformaçãocomoretorno?
•Exemplo:umdadopersonagemfoiatingidoporumaboladefogo,precisamosescreverummétodoqueremove5unidadesdevidadopersonagemint TakeDamageFromFireball(){
int playerHealth =100;return playerHealth – 5;
}
UsandoMétodos
•Umavezdefinido,ométodopodeserinvocado• Apartirdamesmaclasse• Ouporoutroscriptquepossuaumareferência
•Exemplo:int x =TakeDamageFromFireball();print ("Playerhealth:"+x);
EntradadoUsuário
•Aentradadousuáriopodeacontecerapartirdediferentesmeios– teclados,controles,toque,etc.
•Entradabásica:• ComoUnity,podemosprogramarumaaçãointerativaquandofordetectadoqueumadadateclafoipressionada• Porém,émaisaconselhadoutilizarumsistemademapeamentogenéricodecontroles• SãoconfiguradosatravésdoInputManager
EntradadoUsuário
•Paragerenciaraentradadousuário,utilizamosEdit >ProjectSettings>Input• Podeverosvárioseixosassociadosasaçõesdeentrada• Exemplo:
PropriedadesdosEixos
Propriedade Descrição
Name Nomedoeixo – comoéreferenciadoemcódigo
Descriptive Name/Descriptive NegativeName
Nome queseráexibidoaojogadornaconfiguraçãodojogo– onome“negativo”éequivalenteaonomedoeixooposto
NegativeButton/PositiveButton
Osbotõesquepassam osvalores,negativosepositivos,paraoeixo(ex.:setasesquerdaedireita)
Alt NegativeButton/Alt PositiveButton
Botõesalternativos quepassamvaloresparaoeixo(ex.:asteclasAeD paraoeixohorizontal)
Gravity Quãorápidoo eixoiráretornaraozero
Dead Entradasmenoresqueessevalorserãoignoradas
Sensitivity Quãorapidamenteo eixorespondeàentrada
PropriedadesdosEixos
Propriedade Descrição
Snap Quandomarcada, faráqueoeixováimediatamenteazeroquandoadireçãoopostaforpressionada
Invert Iráinverteroscontroles, quandomarcada
Type OTipodaentrada.Seserábotõesdomouse, teclado,movimentodomouseoumovimentodojoystick
Axis OEixocorrespondentedodispositivodeentrada(nãoseaplica aosbotões)
Joy Num Qual ojoystickseráutilizadoparaaentrada.Porpadrão,receberáentradadetodososjoysticks
ProgramandoaEntrada
•Umavezqueoseixosforamdefinidos,trabalharcomosmesmosnocódigoésimples• SeráutilizadaaclasseInput,maisespecificamenteométodoGetAxis() – informandoonomedoeixo
float hVal =Input.GetAxis("Horizontal");
•Paraoeixohorizontal:• Pressionarasetadaesquerda(ouoA)à valornegativo• Pressionarasetadadireita(ouoD)à valorpositivo
EntradadeumaTeclaEspecífica
•Umoutrotipodeentradamuitoutilizadaédeumateclaespecífica– tambémutilizaaclasseInput•MétodoGetKey() – queretornaumbooleanoindicandoquandoamesmafoiteclada
bool isKeyDown =Input.GetKey(KeyCode.K);
•Cadateclapossuiumcódigoespecífico
EntradadoMouse
•Paraomouse,precisamserconsideradodoiscomponentes:(i)movimentoe(ii)botões• NovamenteéutilizadaaclasseInput eométodoGetMouseButtonDown()– recebendouminteiroidentificandoumbotãoespecífico
bool isButtonDown;//seobotãoesquerdodomousefoipressionadoisButtonDown =Input.GetMouseButtonDown(0);//seobotãodireitodomousefoipressionadoisButtonDown =Input.GetMouseButtonDown(1);//seobotãocentraldomousefoipressionadoisButtonDown =Input.GetMouseButtonDown(3);
EntradadoMouse
•OmovimentodomousesedánoseixosX eY,omovimentoécapturadocomométodoGetAxis()
float value;//movimentonoeixoXvalue =Input.GetAxis("MouseX");//movimentonoeixoYvalue =Input.GetAxis("MouseY");
•Omovimentodomouseédadoatravésdamedidadodeslocamentoapenas desdeoúltimoframe
AcessandoComponentesLocais
•Comopodeservistodavisãodoinspetor,umobjetosécompostodevárioscomponentes• Componentestaiscomo:umatransformada,umrenderizador,umaluz,umacâmera,etc.• Scriptstambémsãocomponentes
•Épossívelinteragircomcomponentesemtempodeexecução– énecessáriorecupera-los(noStart)•MétodoGetComponent<Type>()
AcessandoComponentesLocais
•OmétodoGetComponent retornaoprimeirodotipoespecificadoanexadoaomesmoobjetoaoqualoscriptestáassociado
//Umatributoparaarmazenarocomponentedeluzprivate LightlightComponent;
Start(){lightComponent =GetComponent<Light>();lightComponent.type =LightType.Directional;
}
AcessandoComponentesLocais
•Acessandoatransformada(comoobjetoimplícito):• Alterandoessecomponente,vocêmoveoobjetonacena• Métodos– Translate(),Rotate()elocalScale()
//MoveoobjetopositivamentepeloeixoX//O'0f'significa0comoumvalordepontoflutuante(real)transform.Translate(0.05f,0f,0f);
//Rotaciona oobjetopeloeixoZtransform.Rotate(0f,0f,1f);
//Aumentaotamanhodoobjetoaodobroemtodasasdireçõestransform.localScale =newVector3(1.5f,1.5f,1.5f);
AcessandoOutrosObjetos
•Emalgunsmomentoséútilqueumscriptmanipuleoutrosobjetoseosseuscomponentes
•Pararecuperaroutrosobjetosatravésdoeditor:• Criamosumatributo(público)dotipoGameObject• Navisãodoinspetor,selecionamosoobjetodesejado
//Esteéoobjetodojogoquesedesejaacessarpublic GameObject objectYouWant;
AcessandoOutrosObjetos
•ComoscriptsejachamandodeSomeClassScript,avisãodoinspetorseriaaseguinte:• Tambémépossívelarrastaroobjetoatéolocalindicado
AcessandoOutrosObjetos
•Outraformadeacessaroutrosobjetoséutilizarummétododebusca– Find(),FindWithTag() eFindObjectByType()• Buscas(i)pornome,(ii)porrótuloou(iii)portipo
public class SomeClassScript :MonoBehaviour {//Esteéoobjetodojogoquesedesejaacessarprivate GameObject target;//Notequenãoénecessárioserpúblicoaobuscaroobjeto
void Start(){target =GameObject.Find("Cube");
}}
AcessandoOutrosObjetos
•Buscandoobjetosporrótulo:
public class SomeClassScript :MonoBehaviour {//Esteéoobjetoquesedesejaacessarprivate GameObject target;
void Start(){target =GameObject.FindWithTag("TargetCube");
}}
AcessandoOutrosObjetos
•Buscandoobjetosportipo(scriptassociado):
public class SomeClassScript :MonoBehaviour {//Esteéoobjetoquesedesejaacessarprivate GameObject target;
void Start(){target =GameObject.FindObjectByType
<CubeScript>();}
}
ModificandoComponentesdoObjeto
•Umavezcomumareferênciaaumoutroobjeto–podemosmanipularseuscomponentes
//Acessoaocomponentelocal,nãoéoquesedesejatransform.Translate(0f,0f,0f);
//Acessoaoobjetoalvo,éissoquesedesejatargetObject.transform.Translate(0f,0f,0f);
Exercitando
1. Crieumnovoprojetooucena2. Adicioneumcubo,posicionadoem(0,0,-5)3. Crieumapasta“scripts”ecrieumnovoscript
CubeControlScript,associadoaocubo4. Comaseguintefuncionalidade:
a) Quandoforpressionadaassetasesquerdaedireita–movimentamocuboaolongodoeixoX
b) Assetasparacimaeparabaixo– movimentamocubonoeixoY (positivamenteounegativamente)
c) QuandoomousesemoveraolongodoeixoY,rotacione ocubonoeixoX.QuandoomovimentofornoeixoX,rotacione ocubonoeixoY
d) QuandoforpressionadaateclaM,aumenteaescaladocubo.NocasodateclaN,diminuaaescaladocubo