Aula disparos

18

Click here to load reader

Transcript of Aula disparos

Page 1: Aula disparos

Projeto de jogos RAD:Disparos, tiros e balas

Augusto Bülow

Page 2: Aula disparos

Unity3D

• Tiros: analogia ao mundo real• Objeto disparado com direção e velocidade• Jogo : mesma forma

• Objeto próprio = bala• Velocidade(s) iniciais

• Percebe / Trata colisões : códigos

• Efeitos: inicial, rastro, explosão

• Prefab: re-utilização balas

Page 3: Aula disparos

Unity3D

• Prototipar objeto – criação normal• Quando completo = cria-se PREFAB

• Criar Objeto Bala (esfera)

• Precisa de Collider (RigidBody*)• Balas alta velocidade = desligar gravidade

• RigidBody / UseGravity = 0

• Criar Script controle básico da bala

Page 4: Aula disparos

Unity3D

• Script Básico:• Disparar sons

• Inicializar tiro (velocidades)• Ativar efeitos• Perceber colisões -> Criar efeito• Perceber colisões -> Remover

• Remover distância * (finalizar sempre objetos)

Page 5: Aula disparos

Unity3Dvar vetor_forca : Vector3;

var velo_tiro = 300;

//inicializar

function Start () {

//DEBUG = MOSTRA DISPARO

debug = gameObject.Find("Debug2");

debug.guiText.text = "BALA DISPARADA";

//forca inicial

vetor_forca.x = 0;

vetor_forca.y = 0;

vetor_forca.z = velo_tiro;

//converte forca para direcao

vetor_forca = transform.TransformDirection(vetor_forca);

//adiciona forca inicial da bala ( convertida para sua direcao)

rigidbody.AddForce(vetor_forca);

}

Start = inicializa velo bala

Page 6: Aula disparos

Unity3D• Update = usando Física = FixedUpdate()

• Cuidar da remoção da bala *

• Por tempo

• Por distância

//fisica = fixed update

function FixedUpdate () {

//distancia em relação ao player – localizar player

player = GameObject.Find("Player");

var distancia = Vector3.Distance(transform.position,player.transform.position);

if (distancia > 100) {

Destroy(gameObject);

}

}

Page 7: Aula disparos

Unity3D• Perceber / Controlar Colisão da Bala

• RigidBody = OnCollisionEnter

// Perceber tratar colisoes

function OnCollisionEnter(quem : Collision) {

//DEBUG = MOSTRA COLSIAO / DEL

debug = gameObject.Find("Debug2");

debug.guiText.text = "BALA COLIDIU";

//auto destroi na colisao

Destroy(gameObject);

}

Page 8: Aula disparos

Unity3D• Disparo Balas : código em quem vai disparar

• Re-utilização objeto bala = Instantiate / Prefab

• Transformar nossa bala em Prefab

• Criar novo prefab -> Inserir objeto bala no prefab

• Instantiate -> utiliza Prefab

// Tecla ativa tiro

if (Input.GetButton("Fire1") {

Atira();

}

• Controlando disparo com função

Page 9: Aula disparos

Unity3D• Função disparo / Atira

//Variavel ponteiro para bala (prefab)

var bala : Transform; function Atira() {

//CRIA BALA POSICAO E ROTACAO DE QUEM DISPARA

Instantiate(bala, transform.position, transform.rotation);

}

Page 10: Aula disparos

Unity3D

• Possíveis problemas neste ponto

• Tiros sem delay: • Muitas balas criadas (1 por ciclo) = auto colisão entre balas

• Colisão com objeto “emissor”• Tiro disparado da posição do player = auto colisão com o player

• Inicializado dentro da área de colisão de “quem dispara”

Page 11: Aula disparos

Unity3D• Temporizar tiros: delay mínimo entre-tiros (normal armas)

var timer_tiro = 0.0;

var delay_tiro = 0.5;

....

//ZERA TIMER ENTRE TIROS

if (timer_tiro > 0) {

timer_tiro -= Time.deltaTime;

}

//DISPARA TECLA + TIMER OK

if (Input.GetButton("Fire1") && timer_tiro <= 0) {

timer_tiro = delay_tiro;

Atira();

}

Page 12: Aula disparos

Unity3D• Posição inicial bala = fora da colisão do emissor

• Calcular Posição relativa = a frente (fora collider)var posicao_bala : Vector3;

var dist_tiro = 1.5;

var altura_tiro = 0.9;

function Atira() {

//calculando posicao relativa - a frente - evita colisao player

var angulo = transform.eulerAngles.y * Mathf.Deg2Rad;

posicao_bala.x = transform.position.x + dist_tiro * Mathf.Sin(angulo);

posicao_bala.y = transform.position.y + altura_tiro;

posicao_bala.z = transform.position.z + dist_tiro * Mathf.Cos(angulo);

//CRIA TIRO POSICAO LIVRE

Instantiate(bala, posicao_bala, transform.rotation);

}

Page 13: Aula disparos

Unity3D• Criando efeito para explosão da bala

• Criar um objeto : controlar a explosão

• Transformar em Prefab pós pronto (re-uso)

• Criar objeto vazio

• Adicionar / Criar efeito explosão (partículas)

• Adicionar Particle Emitter + Particle Renderer + Particle Animator

• Setar Renderer -> Material -> Fire Add

• Setar Emissor: OneShot

• Setar Animator: AutoDestruct

• Roda uma vez e Auto-remove objeto Explosão

Page 14: Aula disparos

Unity3D• Acionar explosão no momento da batida : bala

• Instanciar objeto explosão (Prefab)

• Codigo bala:

var explode = 0;

var explosao_obj : Transform;

.....

//cria explosao e destroi – centralizo cod. no update

if (explode == 1) {

Instantiate(explosao_obj, transform.position, transform.rotation);

Destroy(gameObject);

}

Page 15: Aula disparos

Unity3D• Sons acionados por eventos

• Facilidade: Sons vinculados aos objetos

– - Inserir AudioSource

– - Autoplay : play on awake• - criaçao da bala: som disparo• - criaçao da explosão: som

• Inserir sons exemplo: arma01.wav, explo01.wav

Page 16: Aula disparos

Unity3D• Inimigos IA = mesmo esquema de tiro

• Pode-se aproveitar codigo

• Diferença: IA auto-ativa tiros, não teclas

– - Criar estados especifico para atirar IA*

– - Observar timer

– - Observar posiçao • - não colidir ao iniciar

Page 17: Aula disparos

Unity3D• Atirador IA simplesvar timer_atira = 0.0;

var entre_tiros =1;

function Update () {

player = GameObject.Find("Player");

transform.LookAt(player.transform.position);

timer_atira -= Time.deltaTime;

if (timer_atira <= 0) {

timer_atira = entre_tiros;

Atira();

}

Page 18: Aula disparos

Unity3D• Função atira = mesmavar bala : Transform;

var posicao_bala : Vector3;

var dist_tiro = 1.5;

var altura_tiro = 0.6;

function Atira() {

//calculando posicao relativa - a frente - evita colisao player

var angulo = transform.eulerAngles.y * Mathf.Deg2Rad;

posicao_bala.x = transform.position.x + dist_tiro * Mathf.Sin(angulo);

posicao_bala.y = transform.position.y + altura_tiro;

posicao_bala.z = transform.position.z + dist_tiro * Mathf.Cos(angulo);

//CRIA TIRO POSICAO LIVRE

Instantiate(bala, posicao_bala, transform.rotation);

}