Aula ia

22
Projeto de jogos RAD: Inteligência Artificial Parte 1 Augusto Bülow

description

Aula de Inteligencia artificial para unity3D

Transcript of Aula ia

Page 1: Aula ia

Projeto de jogos RAD: Inteligência Artificial

Parte 1

Augusto Bülow

Page 2: Aula ia

Unity3D : IA

IA: Simular comportamento inteligente em elementos autômatos no jogo

Planejamento básico: • O que o “robô” deve fazer?• Traduzir em estados– Separar ações individuais / diferentes– Criar mapa de estados

Page 3: Aula ia

Unity3D : IA

• Elementos com IA = máquina de estados

Estados:Partes do comportamento

Diferentes ações

Tratados com códigos (partes) separados

Controlar estados por variável *

Criar regras para mudança de estados

Page 4: Aula ia

Unity3D : IA

Resumindo:

1o passo: planejar o comportamento desejado

2o passo: identificar estados – separar ações diferentes (partes do comportamento)

3o passo: identificar mudança de estados – o que faz o robô mudar de um estado a outro

Programar regras – testar - adaptar

Page 5: Aula ia

Unity3D : IA

Patrulha

Vê player

Foge

AtacaMorre

Inicializa

Visão Geral Estados

Page 6: Aula ia

Unity3D : IA

Ataca Decide ataque

Ataque1

Move Lateral

Ataque2

Abaixa

Atira

Explodindo Bolhas:Detalhando

Page 7: Aula ia

Unity3D : IA

Patrulha

Vê player

Distancia < 300

Distancia > 500

Decide ataque

Ataque1 Ataque2

Random:30%Random:

70%

Detalhando: Regras para mudança de estados

Page 8: Aula ia

Unity3D : IA

• Conhecendo-se os estados e planejando-se as regras para mudanças de estado inicia-se a programação

- Traduzir o plano para código

- Estados = controle por variávelvar estado = 0;

....

if (estado == 1) {

.....

}

Page 9: Aula ia

Unity3D : IA- Criar Cubo “inimigo”

- Criar Script Inimigo1.js

- Inimigo precisa cuidar de suas colisões, chão / cena

- Definir e adicionar Collider:

- RigidBody ou CharacterController

- Tipo collider = códigos específicos de movimento

- Nosso exemplo : CharacterController*

Page 10: Aula ia

Unity3D : IA

PatrulhaPatrulha

Ataque1

Vai Ponto1 Observa Vai

Ponto2

Explodindo Bolhas:Detalhando

Observa

Page 11: Aula ia

Unity3D : IA- Patrulhar detalhado = 4 estados

- Estados definíveis: 10, 11, 12, 13 = Patrulha

- Criar /Planejar regras de mudança de estados

- O que leva de um estado a outro?

- EX:

- Ir ponto1: checar distancia para o ponto

- Espera / Observa: timer simples (tempo)

- Inicia Ataque: player próximo inimigo (dist. min)

Page 12: Aula ia

Unity3D : IA- Plano determinado = implementar código

- Variáveis iniciais identificadas:

var estado = 10;

var distancia_ok = 1.0;

var distancia_atual = 0.0;

var ponto1 : Vector3;

var ponto2 : Vector3;

var velocidade : Vector3;

var tempo = 0.0;

Page 13: Aula ia

Unity3D : IA- Estado 10 : Ir ponto 1, perceber a chegada (distancia)

if (estado == 10) {

// virar / apontar para o ponto

transform.LookAt(ponto1);

transform.rotation.x = 0;

transform.rotation.z = 0;

// mover / andar = velocidade frente Z

velocidade.x = 0;

velocidade.y = 0;

velocidade.z = 0.1;

//Mudança de estado = distancia / chegou no ponto

distancia_atual = Vector3.Distance(transform.position, ponto1);

if (distancia_atual <= distancia_ok) {

estado = 11;

}

}

Page 14: Aula ia

Unity3D : IA- Centralizamos código de movimento: controle apenas por

velocidade nos estados

//transforma velocidade para direção atual

velocidade = transform.TransformDirection(velocidade);

//Movimento unificado : controla velocidade nos estados

pointer = GetComponent(CharacterController);

pointer.Move(velocidade);

Page 15: Aula ia

Unity3D : IA- Estado 11: aguarda tempo / observa, parado

if (estado == 11) {

// parar = sem velocidade

velocidade.x = 0;

velocidade.y = 0;

velocidade.z = 0;

// Timer básico

tempo += Time.deltaTime;

if (tempo >= 1) {

estado = 12;

}

}

Page 16: Aula ia

Unity3D : IA- Start: inicialização básica, estado, pontos - destinos

function Start() {

//estado inicial

estado = 10;

//ponto 1: ex. posicao atual + variação

ponto1 = transform.position;

ponto1.z += 20;

// ponto2:

ponto2 = transform.position;

ponto2.z -= 10;

}

- Criar estados 12 e 13 = Finalizar Patrulha Básica

Page 17: Aula ia

Unity3D : IA- Ataque básico: percebe player perto = distância

- (modo simplório)

- Entra em estado de ataque

- Regras adicionais atacando

- Persegue player (anda na sua direção)

- Distância mínima = tira saúde ( faz ataque)

- Distância máxima = fugiu, volta a patrulha

Page 18: Aula ia

Unity3D : IA- Implementando ataque:

var distancia_player = 0.0;

var distancia_ataca = 15;

var distancia_hit = 2;

var distancia_fugiu = 30; ....

//Encontra player - multi uso

player = GameObject.Find("Player");

//Ativa ATAQUE AUTO - POR DISTANCIA

if (estado >= 10 && estado <= 13) {

distancia_player = Vector3.Distance(transform.position, player.transform.position);

if (distancia_player <= distancia_ataca) {

estado = 20;

}

}

Page 19: Aula ia

Unity3D : IA//20. ATAQUE

if (estado == 20) {

// virar / apontar para o player

transform.LookAt(player.transform.position);

transform.rotation.x = 0;

transform.rotation.z = 0;

// mover / andar = velocidade frente Z

velocidade.x = 0;

velocidade.y = 0;

velocidade.z = 0.1;

}

Page 20: Aula ia

Unity3D : IA- Implementando regras adicionais do estado//20. ATAQUE – PERSEGUE PLAYER

if (estado == 20) {

....

distancia_player = Vector3.Distance(transform.position,player.transform.position);

//Distancia fugiu = volta a patrulha

if (distancia_player >= distancia_fugiu) {

estado = 10;

}

}

Page 21: Aula ia

Unity3D : IA- Implementando regras adicionais (2) do estado//20. ATAQUE – PERSEGUE PLAYER

if (estado == 20) {

....

distancia_player = Vector3.Distance(transform.position,player.transform.position);

//Distancia hit = estado ataque real – tira energia, etc

if (distancia_player <= distancia_hit) {

estado = 21;

}

}

Page 22: Aula ia

Unity3D : IA//21. ATAQUE - REAL

if (estado == 21) {

// para de andar

velocidade = Vector3.zero;

//anima - (simula anima - FAZ GIRO BASICO)

aux_gira += 1 * Time.deltaTime;

transform.Rotate(Vector3(0, 3, 0));

if (aux_gira >= 1) { estado = 10; } // volta patulha tempo

//Criando efeito no player - acessa script dele, muda vars

//empurra trás, cima - única vez, uso var para controle

if (ataque_unico == 0) {

player.GetComponent("Player-anima").forca_move.y = 0.3;

player.GetComponent("Player-anima").forca_move.z = -2;

ataque_unico =1;

}

}