Post on 21-Jul-2015
Projeto de jogos RAD:Disparos, tiros e balas
Augusto Bülow
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
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
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)
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
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);
}
}
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);
}
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
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);
}
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”
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();
}
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);
}
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
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);
}
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
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
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();
}
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);
}