SchultzGames
Para tirar dúvidas, crie um tópico especifico na área "Dúvidas em Geral" e aguarde ser respondido. Evite comentar em tópicos não relacionados a sua dúvida :D
TÓPICOS RECENTES:
Tópico:
Postado em:
Postado por:
segundo 3D Wrestling Ring de luta livre by MateusWTP
Unity 3D Scene Wrestling arena and Ring By Mateus + Download de graça
[Modelo 3D]Unity Interior 3D Estilo De Terror + Download Grátis
PRECISO DE UM ANIMADOR DE PERSONAGENS 3D (VAMOS NEGOCIAR)
Arquivo jar não encontrado
OBJETO sendo detruído imediatamente mesmo com o...
Meu site de Modelos 3D
DÚVIDA - ao pressionar andar, o player parece cancelar a gravidade (VÍDEO)
[RESLVIDO] Unity - "transform.SetParent()" em 2 objetos move outros objetos
Dúvida sobre resoluções de tela
Duvida na AppleStore
pressionando a tecla abaixar, o player continua andando abaixado (2D).
Fala Pessoal! Saiu mais um trailer do jogo que venho desenvolvendo
[RESOLVIDO] passar de uma animação para a outra rapidamente pelo animator
Unity - PlayerPrefs n são apagados no Celular mesmo Reiniciando o Aparelho
Modeloes 3D do Site Sketchfab
Blender - Modelos Importados transparentes
[PEDIDO]Cololar jogo na loja play store
Como pegar um objeto e fazer ele aparecer em forma de Estamina no Inspector
Procuro Pessoas para Projeto
Algum tutorial de como fazer um app que receba fotos e q fiqu armazenado no
Procuro um time para um jogo de corrida
[RESOLVIDO] Botões de Ataque e Pular carrega duas animações ao mesmo tempo
DEATH ISLAND 0.2.5 SURVIVAL GAME 4 ANOS EM DESENVOLVIMENTO
Player travando na colisão com o chão Unity 2D
Como resolver vazamento de memoria?
Instanciar uma classe nos atributos de outra classe é uma boa prática?
Jogo multiplayer com steam
Unity - Renderizção com Câmera Jogo Lento e travando. Alguém pfv?!
Mini Quarteirão com Texturas 3D VENDA
Controle do braço e cabeça no fps
PRECISO FAZER QUE MEU GAME FIQUE ONLINE
Ativar o objeto correto em Clones.
[TUTORIAL] Como fazer um interruptor simples (Unity 2018)
Preciso de 20 testadores jogo mobile
O Labirinto II - Trailer Oficial
Ue posso divulgar meu game que ainda esta em criaçao aqui no forum?
[RESOLVIDO] Inverter o sprite para a direçao que o personagem anda.
Set Active não a reabiilitado C#
Build APK VR Google Cardbord com video.
[PROGRAMADOR FREELA] $$
Mais Um jogo!
Collider (mesh?)
[TUTORIAL] Deformar mesh com batidas (para objetos, veículos, etc)
WW2 Low poly Pack (Free)
Procuro freelancer
Novo Teaser do jogo Dark Age
Unity Admob Erro
Sombras estão quadradas na build
nao consigo fazer o player sentar no sofa alguem me ajuda
Unity - Ao mudar de scene, todas as Lights são deletadas
210 Linhas de código para inimigo é muito grande?
modelar avatar e skins para um jogo web
ShapeKeys do Blender para a Unity altera áreas próximas
COMO EVITAR QUE UM OBJETO (PLAYER,ITEM ETC...) ATRAVESSE UMA PAREDE.
Ajuda em Script de Verificação de Ação e Reação
unity Failed to load PlayerSettings (internal index #0). Most likely data f
Materiais do Blander não aparecem no MeshRendere do Objeto na Unity
Repetiçoes de Textura no Terreno
SERVER IS DOWN - UNITY+MSQL
Procuro programadores - Novo jogo
Problema com o MS VEHICLES
Preciso de ajuda com a Unity
Problema com vídeo em 360° na Unity
Problemas no MS Vehicles
unity- eventos na Animação com Armature/Bones vinda do blender não funciona
ajuda exibir resultados simulados em uma liga Game Unity
Unity - ParticleSystem não é redirecionado no rawimage no canvas
Como resolver o problema de "face orientation" no Blender.
[DÚVIDA] Tive um problema com meu Canvas
erro na Directional Light
Problemas com o Directional Light da Unity 3D
Novo jogo da franquia Sphere game em desenvolvimento
malha da roda não girando com wheel collider unity
Problemas com ambiguidade
Touch mobile
INVALID TOKEN
Como acessar o "HD Render Pipeline" do HDRP por script?
CHAT GPT PRA JOGO DE TIRO? comentem
Tutorial script inimigo segue e foge do player
Ainda vale a pena lançar Asset na Asset Store?
Ajuda com tabela de historico de pontuaçao.
[TUTORIAL] Entrar no carro estilo GTA
Como derrapar um Whell Collider
Como altertar o valor do "Asymptote Value" do Whell Collider via Script
Preciso de ajuda para substituir valor de variavel em outro script
Ajuda com Top Down Shooter utilizando Photon
Duvida com Netcode
[RESOLVIDO] Unity - Movendo a Câmera na Horizontal/Vertical com Touch
Alguém me ajuda com os anúncios pfv
Segundo Trailer do jogo Dark Age, Feliz Natal a todos!
Unity - ScrollRect, Viewport, Content - O Conteúdo ñ inicia no topo
Coleta de itens
Unity - Cadastro do email do jogador
[GRATIS] PACK DE MODELOS 3D PARA JOGO DE TERROR
Onde Conseguir músicas para meu Jogo?
error CS0246 em Script
Alguem teve ja esse problema?
[Projeto em Andamento] Draug, um jogo de hordas
Dom Dez 08, 2024 4:00 pm
Sex Dez 06, 2024 10:45 pm
Sex Dez 06, 2024 12:27 am
Sáb Nov 30, 2024 12:53 pm
Qua Out 23, 2024 8:39 pm
Sex Out 18, 2024 4:05 pm
Dom Out 06, 2024 6:02 pm
Sáb Out 05, 2024 6:37 am
Qui Out 03, 2024 10:09 pm
Seg Set 30, 2024 9:25 am
Sáb Set 28, 2024 11:39 am
Seg Set 09, 2024 7:33 am
Dom Set 08, 2024 10:08 pm
Ter Set 03, 2024 11:59 am
Qua Ago 28, 2024 7:45 pm
Qua Ago 28, 2024 7:18 pm
Qua Ago 28, 2024 8:34 am
Dom Ago 25, 2024 8:37 pm
Sáb Ago 24, 2024 1:58 pm
Sex Ago 23, 2024 3:30 pm
Sex Ago 23, 2024 3:23 pm
Qua Ago 21, 2024 5:48 pm
Dom Ago 18, 2024 8:51 pm
Sex Ago 16, 2024 12:59 pm
Qua Ago 14, 2024 10:57 am
Sáb Ago 10, 2024 8:03 pm
Sex Ago 09, 2024 7:37 pm
Dom Ago 04, 2024 4:41 pm
Dom Ago 04, 2024 3:16 pm
Qui Jul 25, 2024 2:48 pm
Dom Jul 21, 2024 7:07 pm
Dom Jul 21, 2024 12:07 am
Sáb Jul 13, 2024 12:33 am
Qui Jun 27, 2024 5:49 pm
Qui Jun 20, 2024 12:30 pm
Dom Jun 09, 2024 7:43 pm
Dom Jun 09, 2024 2:16 pm
Seg Jun 03, 2024 11:39 am
Seg maio 27, 2024 12:45 pm
Seg maio 20, 2024 9:01 pm
Dom maio 19, 2024 3:08 pm
Sáb maio 18, 2024 11:46 am
Sáb maio 11, 2024 8:55 am
Qui maio 09, 2024 11:33 pm
Seg Abr 29, 2024 9:34 pm
Qui Abr 25, 2024 3:34 pm
Seg Abr 22, 2024 5:15 pm
Seg Abr 15, 2024 12:23 pm
Seg Abr 08, 2024 9:27 pm
Seg Abr 08, 2024 8:01 am
Sáb Abr 06, 2024 8:05 pm
Qui Abr 04, 2024 11:34 pm
Qui Abr 04, 2024 11:13 pm
Sex Mar 22, 2024 2:41 pm
Dom Mar 10, 2024 2:30 pm
Sex Mar 01, 2024 1:27 pm
Qui Fev 22, 2024 9:57 pm
Ter Fev 20, 2024 12:15 am
Seg Fev 19, 2024 1:06 pm
Seg Fev 12, 2024 1:56 pm
Seg Fev 12, 2024 1:17 pm
Dom Fev 11, 2024 8:55 pm
Dom Fev 11, 2024 11:16 am
Seg Fev 05, 2024 4:18 pm
Dom Fev 04, 2024 9:39 pm
Qua Jan 31, 2024 11:59 pm
Ter Jan 30, 2024 7:37 pm
Ter Jan 23, 2024 6:33 pm
Dom Jan 21, 2024 6:03 pm
Sáb Jan 20, 2024 7:03 pm
Sáb Jan 20, 2024 6:58 pm
Sáb Jan 20, 2024 6:39 pm
Sex Jan 19, 2024 8:40 am
Dom Jan 14, 2024 5:30 pm
Qua Jan 10, 2024 10:29 pm
Qua Jan 10, 2024 8:55 pm
Qua Jan 10, 2024 7:14 pm
Ter Jan 09, 2024 3:55 pm
Ter Jan 09, 2024 8:04 am
Sáb Jan 06, 2024 8:02 pm
Sex Jan 05, 2024 7:01 am
Sex Jan 05, 2024 12:12 am
Qui Jan 04, 2024 6:55 pm
Qui Jan 04, 2024 12:52 pm
Qui Jan 04, 2024 4:34 am
Ter Jan 02, 2024 11:48 pm
Dom Dez 31, 2023 7:25 pm
Qua Dez 27, 2023 5:44 pm
Qua Dez 27, 2023 3:08 pm
Sáb Dez 23, 2023 7:27 pm
Sáb Dez 23, 2023 5:06 pm
Qui Dez 21, 2023 8:10 pm
Seg Dez 18, 2023 2:04 pm
Sex Dez 15, 2023 5:11 pm
Qui Dez 14, 2023 9:13 pm
Qui Dez 14, 2023 2:47 pm
Qui Dez 14, 2023 1:48 pm
Qua Dez 13, 2023 8:58 pm
Ter Dez 12, 2023 2:32 pm



































































































[TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

5 participantes

Ir para baixo

TUTORIAL [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Manawydan Ter Ago 16, 2016 5:31 pm

Eai pessoal blz?
Hoje venho compartilhar um prototipo de script de Inteligencia Artificial Inimiga, que apresenta Estados e Eventos.
Use como quiser, o script esta todo comentado para facil entendimento/edição.

Script Da Vida:
Código:
using UnityEngine;
using System.Collections;

// CLASSE BASICA PRA CALCULO DE VIDA/DANO
public class HealthBehaviour : MonoBehaviour {
 // QUANTIDADE DE VIDA MAXIMA
 public int maxHealth = 100;
 // BOOLEANO REPRESENTANDO SE ESTA MORTO
 public bool IsDead{ get; protected set;}
 // VIDA ATUAL
 public int CurrentHealth{ get; protected set;}
 // delegate PARA OS EVENTO DE VIDA
 public delegate void HealthEvent(GameObject source, GameObject attacker, int previusHealth, int currentHealth);
 // EVENTO QUANDO A VIDA ACABAR(MORRER)
 public static event HealthEvent onHealthOver;
 // EVENTO QUANDO A VIDA MUDAR(AUMENTAR OU DIMINUIR)
 public static event HealthEvent onHealthChange;

 // METODO PARA TIRAR VIDA
 // dmg  SERIA A QUANTIDADE DE DANO
 // attacker QUEM ATACOU
 public void TakeDamage(int dmg, GameObject attacker)
 {
 // APENAS TIRAR VIDA SE ESTIVER VIVO NE?
 if (IsDead) return;
 // ARMAZENA A VIDA ANTERIOR PARA PASSAR AO EVENTO
 int previusHealth = CurrentHealth;
 // REDUZ A VIDA ATUAL PELA QUANTIDADE DE DANO PASSADA
 CurrentHealth -= dmg;
 // SE A VIDA ZEROU
 if (CurrentHealth <= 0) {
 CurrentHealth = 0;
 // MORREU
 IsDead = true;
 // EXECUTA O EVENTO onHealthOver(MORRER)
 if (onHealthOver != null)
 onHealthOver (gameObject, attacker, previusHealth, CurrentHealth);
 if (onHealthChange != null)
 // EXECUTA O EVENTO onHealthChange
 onHealthChange (gameObject, attacker, previusHealth, CurrentHealth);
 }
 else // NAO MORREU
 {
 if (onHealthChange != null)
 // EXECUTA O EVENTO onHealthChange
 onHealthChange (gameObject, attacker, previusHealth, CurrentHealth);
 }
 }
}
Script Inimigo:

Código:
/*******************************************
AUTHOR: MANAWYDAN
SCRIPT: INIMIGO BASICO COM ESTADOS E EVENTOS
VERSION: 0.1
TESTADO NA UNITY: 5.3.5f1
USO: USO LIVRE COMO QUISER
*/
using UnityEngine;
using System.Collections;

// ESTADOS DO INIMIGO, EM CADA ESTADO FAZER DETERMINADA AÇAO
public enum EnemyStates
{
 IDLE = 0, // PARADO
 ALERT = 1, // EM ALERTA
 HUNT = 2, // CAÇANDO
 ATTACK = 3, // ATACANDO
 DAMAGE = 4, // PERDENDO VIDA
 DYING = 5, // MORRENDO
 DEAD = 6 // MORTO

}

// ADICIONA ESSES 3 COMPONENSTES AUTOMATICAMENTE
[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(Rigidbody))]
// CLASSE PRINCIPAL, DERIVADA DA CLASS HealthBehaviour
public class EnemyAI : HealthBehaviour {
 //ESTADO ATUAL, A PRINCIPIO IDLE
 public EnemyStates currentState = 0;
 // REFERENCIA AO NavMeshAgent
 private NavMeshAgent agent;
 // REFERENCIA AO Animator
 private Animator animator;
 // REFERENCIA AO Rigidbody
 private Rigidbody myRigidbody;
 // REFERENCIA AO Transform
 private Transform myTransform;
 // REFERENCIA AO Transform DO JOGADOR
 public static Transform playerTransform;
 // CLASSE COM VARIAVEIS DE DETECÇAO
 public EnemyDetection DetectionSettings;
 // TIMER PARA CONTAR O TEMPO DE DETECÇAO ATUAL
 private float currentTimeToDetectView = 0;
 // TIMER PARA CONTAR O TEMPO EM QUE ESTA NO ESTADO DAMAGE
 private float currentTimeToDamage = 0;
 // DISTANCIA DO JOGADOR
 private float playerDistance = 0;
 // TIMER PARA CONTAR TEMPO QUE ESTA ATACANDO
 private float currentAttackRate = 0;
 // TIMER PARA CONTAR TEMPO QUE ESTA MORRENDO
 private float currentDyingTime = 0;
 // TIMER  ATUAL PARA DETECTAR SE EXISTE INIMIGO A FRENTE
 private float currentTimeToDetectEnemyForward = 0;
 // TEMPO PARA CADA VERIFICACAO SE EXISTE INIMIGO A FRENTE
 public float timeToDetectEnemyForward = 2f;
 // FORCA PARA APLICAR SE EXISTIR INIMIGO A FRENTE, PARA NAO DEIXAR OS INIMIGOS "GRUDADOS"
 public float forceToOffset = 3f;

 // DELEGATE PARA OS EVENTOS DO INIMIGO, source(FONTE) SERIA O INIMIGO QUE ATIVOU O EVENTO
 public delegate void EnemyEvent(GameObject source);
 // EVENTO QUANDO MUDA PARA O ESTADO "DAMAGE"
 public static event EnemyEvent onEnemyChangeToDamage;
 // EVENTO QUANDO MUDA PARA O ESTADO "IDLE"
 public static event EnemyEvent onEnemyChangeToIdle;
 // EVENTO QUANDO MUDA PARA O ESTADO "ALERT"
 public static event EnemyEvent onEnemyChangeToAlert;
 // EVENTO QUANDO MUDA PARA O ESTADO "HUNT"
 public static event EnemyEvent onEnemyChangeToHunt;
 // EVENTO QUANDO MUDA PARA O ESTADO "ATTACK"
 public static event EnemyEvent onEnemyChangeToAttack;
 // EVENTO QUANDO MUDA PARA O ESTADO "DYING"
 public static event EnemyEvent onEnemyChangeToDying;
 // EVENTO QUANDO MUDA PARA O ESTADO "DEAD"
 public static event EnemyEvent onEnemyChangeToDead;
 // EVENTO QUANDO INIMIGO OUVIR SOM
 public static event EnemyEvent onEnemyHearSound;

 void Awake()
 {
 // PEGA REFERENCIA DO NavMeshAgent
 agent = GetComponent<NavMeshAgent>();
 // PEGA REFERENCIA DO Animator
 animator = GetComponent<Animator>();
 // PEGA REFERENCIA DO Rigidbody
 myRigidbody = GetComponent<Rigidbody>();
 // PEGA REFERENCIA DO TRANSFORM DO JOGADOR, O MESMO DEVE TER A TAG "Player"
 playerTransform = GameObject.FindGameObjectWithTag ("Player").transform;
 // PEGA REFERENCIA DO TRANSFORM
 myTransform = transform;
 // SETA O VALOR DA "POSICAO DE PARADA" PARA O VALOR QUE DEFINIMOS
 agent.stoppingDistance = DetectionSettings.stopDistance;
 // SETA A VIDA ATUAL PARA VIDA CHEIA
 CurrentHealth = maxHealth;

 // QUANDO OS EVENTOS FOREM ATIVADOS DEFINIMOS PARA EXECUTAR NOSSAS FUNCOES
 onEnemyChangeToIdle += onEnemyChangeToIdle_Callback;
 onEnemyChangeToAlert += onEnemyChangeToAlert_Callback;
 onEnemyChangeToDamage += onEnemyChangeToDamage_Callback;
 onEnemyChangeToHunt += onEnemyChangeToHunt_Callback;
 onEnemyChangeToAttack += onEnemyChangeToAttack_Callback;
 onEnemyChangeToDying += onEnemyChangeToDying_Callback;
 onEnemyChangeToDead += onEnemyChangeToDead_Callback;
 onEnemyHearSound += onEnemyHearSound_Callback;

 onHealthChange += onHealthChange_Callback;
 onHealthOver += onHealthOver_Callback;
 }
 

 void Update()
 {
 // VERIFICAMOS O ESTADO ATUAL DO INIMIGO PARA EXECUTARMOS OS DEVIDOS METODOS
 switch(currentState)
 {
 //SE ESTIVER NO ESTADO IDLE
 case EnemyStates.IDLE:
 // EXECUTA AS FUNCOES DO ESTADO IDLE, E ASSIM SUCESSIVAMENTE
 Idle_b ();
 break;
 case EnemyStates.ALERT:
 Alert_b ();
 break;
 case EnemyStates.HUNT:
 Hunt_b ();
 break;
 case EnemyStates.DAMAGE:
 Damage_b ();
 break;
 case EnemyStates.ATTACK:
 Attack_b ();
 break;
 case EnemyStates.DYING:
 Dying_b ();
 break;
 case EnemyStates.DEAD:
 Dead_b ();
 break;
 }
 }

 // FUNCAO PARA MUDAR O ESTADO ATUAL DO INIMIGO
 public void SetState(EnemyStates state)
 {
 // ESTADO ATUAL RECEBE O VALOR QUE PASSARMOS
 currentState = state;
 // VERIFICA O NOVO ESTADO ATUAL
 switch(currentState)
 {
 // SE FOR IDLE
 case EnemyStates.IDLE:
 // VERIFICA SE O EVENTO NAO FOR NULO
 if(onEnemyChangeToIdle != null)
 // E ENTAO, CHAMA O EVENTO, PASSANDO O INIMIGO COMO FONTE...
 onEnemyChangeToIdle (gameObject);
 break;
 case EnemyStates.ALERT:
 if(onEnemyChangeToAlert != null)
 onEnemyChangeToAlert (gameObject);
 break;
 case EnemyStates.HUNT:
 if(onEnemyChangeToHunt != null)
 onEnemyChangeToHunt (gameObject);
 break;
 case EnemyStates.ATTACK:
 if(onEnemyChangeToAttack != null)
 onEnemyChangeToAttack (gameObject);
 break;
 case EnemyStates.DAMAGE:
 if(onEnemyChangeToDamage != null)
 onEnemyChangeToDamage (gameObject);
 break;
 case EnemyStates.DYING:
 if(onEnemyChangeToDying != null)
 onEnemyChangeToDying (gameObject);
 break;
 case EnemyStates.DEAD:
 if(onEnemyChangeToDead != null)
 onEnemyChangeToDead (gameObject);
 break;
 }
 }

 // METODO UTIL PARA ESPERAR DETERMINADOS SEGUNDOS
 void Wait(float t)
 {
 while (t > 0)
 t -= Time.deltaTime;
 }

 // METODO PARA SEGUIR O ALVO(NO MOMENTO O JOGADOR)
 void FollowTarget()
 {
 // INCREMENTA O CONTADOR
 currentTimeToDetectEnemyForward += Time.deltaTime;
 // SE O TEMPO DETERMINADO CHEGAR
 if(currentTimeToDetectEnemyForward>timeToDetectEnemyForward)
 {
 // ZERA O CONTADOR PARA CONTAR NOVAMENTE, "INFINITAMENTE"
 currentTimeToDetectEnemyForward = 0;
 // EXECUTA O METODO PARA NAO DEIXAR OS INIMIGOS "GRUDADOS"
 AvoidEnemysForward ();
 // ESPERA 0.1 SEGUNDOS
 Wait (0.1f);
 // ATIVAR O RIGIDBODY
 myRigidbody.isKinematic = true;
 // ESPERA 0.1 SEGUNDOS
 Wait (0.1f);
 // DESATIVAR O RIGIDBODY
 myRigidbody.angularVelocity = Vector3.zero;
 myRigidbody.isKinematic = false;
 }
 // MOVE O INIMIGO PARA A POSICAO DO JOGADOR
 agent.SetDestination(playerTransform.position);
 }

 // METODO QUE "EMPURRA" O INIMIGO PARA O LADO, PARA UQE O MESMO NAO "GRUDE" NO INIMIGO DA FRENTE
 void AvoidEnemysForward()
 {
 // CRIAMOS UM Vector3 PARA CALCULAR A DIRECAO DA FORÇA
 Vector3 offset = Vector3.zero;
 // CRIAMOS UM RaycastHit PARA SABER QUEM COLIDIU COM O Raycast
 RaycastHit hit;

 // EXECUTA O RAYCAST, COM UM RAIO QUE VAI DA POSICAO DO INIMIGO PARA FRENTE
 if(Physics.Raycast(transform.position,transform.forward,out hit, DetectionSettings.enemyCheckDistance))
 {
 // EXISTE UM INIMIGO NA NOSSA FRENTE?
 if(hit.collider.CompareTag("Enemy")){
 // EXECUTA O RAYCAST, COM UM RAIO QUE VAI DA POSICAO DO INIMIGO PARA DIREITA
 if (Physics.Raycast (transform.position, transform.right, out hit, DetectionSettings.enemyCheckDistance)) {
 // EXISTE MAIS 1 INIMIGO A DIREITA?
 if(hit.collider.CompareTag("Enemy"))
 {
 // EXECUTA O RAYCAST, COM UM RAIO QUE VAI DA POSICAO DO INIMIGO PARA ESQUERDA
 if (Physics.Raycast (transform.position, -transform.right, out hit, DetectionSettings.enemyCheckDistance)) {
 // ACRECENTAMOS +1 EM X E Z DO NOSSO VETOR
 offset.x++;
 offset.z++;
 }
 else
 {
 // ADICIONAMOS +1 APENAS EM Z
 offset.z++;
 }
 }
 }
 else
 {
 // ADICIONAMOS +1 APENAS EM X
 offset.x++;
 }
 }
 }
 // ADICIONAMOS UM FORÇA COM BASE NO VETOR, E COM A "POTENCIA" QUE SETAMOS ANTERIORMENTE
    // DO TIPO IMPULSE, PARA FAZER O INIMIGO CONTORNAR, UM POSSIVEL INIMIGO A SUA FRENTE
 myRigidbody.AddForce(offset*forceToOffset,ForceMode.Impulse);
 //SETAMOS A VELOCIDADE ANGULAR PARA ZERO PARA NAO FICAR EVIDENTE QUE "EMPURRAMOS" O INIMIGO COM FISICA
 myRigidbody.angularVelocity = Vector3.zero;
 }

 // METODO PARA FAZER O INIMIGO GIRAR, UTIL NO ESTADO DE ALERTA
 void Turn()
 {
 myTransform.Rotate (0, DetectionSettings.turnVelocity*Time.deltaTime, 0);
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onHealthChange OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE TEVE SUA VIDA MODIFICADA
 // attacker SERA QUEM O ATACOU, O PLAYER?
 // previusH A QUANTIDADE DE VIDA QUE ELE TINHA ANTERIORMENTE
 // curHealth A QUANTIDADE DE VIDA ATUAL
 void onHealthChange_Callback(GameObject source, GameObject attacker, int previusH, int curHealth)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // AKI VERIFICAMOS SE ELE PERDEU VIDA, E SE NAO MORREU
 if(previusH > curHealth && curHealth >0)
 {
 // COMO PERDEU VIDA, MUDA PARA O ESTADO DAMAGE(PERDA DE VIDA)
 animator.SetTrigger ("damage");
 SetState (EnemyStates.DAMAGE);
 }
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onHealthOver OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE MORREU
 // attacker SERA QUEM O MATOU, O PLAYER?
 // previusH A QUANTIDADE DE VIDA QUE ELE TINHA ANTERIORMENTE
 // curHealth A QUANTIDADE DE VIDA ATUAL, SEMPRE 0
 void onHealthOver_Callback(GameObject source, GameObject attacker, int previusH, int curHealth)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // MUDAMOS PARA O ESTADO MORRENDO
 SetState (EnemyStates.DYING);
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToIdle OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO IDLE
 void onEnemyChangeToIdle_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // FAZEMOS ELE PARAR DE MOVER
 agent.Stop();
 agent.enabled = false;
 agent.enabled = true;
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToAlert OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO ALERT
 void onEnemyChangeToAlert_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // FAZEMOS ELE PARAR DE MOVER
 agent.Stop();
 agent.enabled = false;
 agent.enabled = true;
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToHunt OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO HUNT
 void onEnemyChangeToHunt_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if (source == gameObject) {

 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToDamage OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO DAMAGE
 void onEnemyChangeToDamage_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // FAZEMOS ELE PARAR DE MOVER
 agent.Stop();
 agent.enabled = false;
 agent.enabled = true;
 // RESETAMOS O TIMER DE DANO PARA QUE ELE CONTE DENOVO
 currentTimeToDamage = 0;
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToAttack OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO ATTACK
 void onEnemyChangeToAttack_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // O QUE FAZER AKI? QUE TAL TOCAR UM SOM PARA QUE FIQUE CLARO QUE O INIMIGO VAI COMEÇAR A ATACAR?
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToDying OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO DYING
 void onEnemyChangeToDying_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // FAZEMOS ELE PARAR DE MOVER, JA QUE ESTA MORRENDO
 agent.Stop();
 agent.enabled = false;
 myRigidbody.isKinematic = true;
 // DESATIVAMOS O RIGIDBODY E OS COLISORES QUE PODERAM ATRAPALHAR
 Collider[] cols = GetComponents<Collider>();
 foreach(Collider c in cols)
 {
 c.enabled = false;
 }
 // AKI O INIMIGO PODERIA FAZER UAM ANIMACAO DE MORRENDO PQ N?
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyChangeToDead OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO DEAD
 void onEnemyChangeToDead_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // AKI VOCE PODE COLOCAR AS ACOES QUE ACONTECEM QUANDO ELE MORREU, DROPAR ITEM QUEM SABE?
 }
 }

 // ESSE METODO EXECUTA QUANDO O EVENTO onEnemyHearSound OCORRE,
 // AKI VOCE PODE FAZER QUAL ACAO QUE QUISER
 // source SERA O "INIMIGO" QUE ACABA DE MUDAR PARA O ESTADO DEAD
 void onEnemyHearSound_Callback(GameObject source)
 {
 // VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"
 if(source == gameObject)
 {
 // AKI PODEMOS COLOCAR AÇOES PARA QUANDO O INIMIGO OUVIR UM SOM
 // PODERIAMOS POR EXEMPLO: VERIFICAR OS INIMIGOS PROXIMO A ESTE QUE OUVIU O SOM
 // E "ALERTAR" A ELES QUE TEM ALGO DE ERRADO AKI POR PERTO
 }
 }

 // ESSE METODO ADICIONA UMA QUANTIDADE DE SOM PARA A DETECCAO POR SOM
 // ammount SERA A QUANTIDADE DE SOM A ADICIONAR
 // soundPos A POSICAO DE EXECUCAO DO SOM
 // USAREMOS ISSO PARA QUE QUANTO MAIS LONGE O SOM ESTIVER DO INIMIGO
 // MENOS ELE "OUVE"
 public void AddSoundToDetection(float ammount, Vector3 soundPos)
 {
 // CALCULAMOS A DISTANCIA ENTRE O SOM E O INIMIGO
 float soundDistance = Vector3.Distance(soundPos,myTransform.position);
 // SE A DISTANCIA FOR MAIOR QUE A DISTANCIA MAXIMA DE "AUDICAO", NAO FAZEMOS NADA E RETORNAMOS
 if(soundDistance>=DetectionSettings.soundMaxHearArea) return;
 // CASO CONTRARIO, DIMINUIMOS O VALOR DE ammount COM BASE NA DISTANCIA
 ammount -= (soundDistance/DetectionSettings.soundMaxHearArea)*ammount;

 // ADICIONAMOS O QUANTIDADE DE SOM PARA O VERIFICADOR
 DetectionSettings.soundAmmountDetected += ammount;
 // NAO DEIXAMOS O SOM PASSAR DE 100
 DetectionSettings.soundAmmountDetected = Mathf.Clamp (DetectionSettings.soundAmmountDetected,0,100f);
 // DESENCADEAMOS O EVENTO DE OUVIR O SOM
 onEnemyHearSound (gameObject);
 // VERIFICAMOS SE A QUANTIDADE DE SOM ATUAL FOI SUFICIENTE PARA FAZER O INIMIGO IR PARA O ESTADO ALERT
 if(DetectionSettings.soundAmmountDetected>=DetectionSettings.soundAmmountToDetect && currentState == EnemyStates.IDLE)
 {
 // MUDAMOS PARA O ESTADO ALERT
 SetState (EnemyStates.ALERT);
 }
 }

 // METODO QUE VERIFICA SE O PLAYER ESTA NA VIDAO DO INIMIGO
 void CheckVision()
 {
 // CRIAMOS UM Vector3 COM A DIFERENÇA ENTRA A OS "OLHOS" DO INIMIGO E A POSICAO DO PLAYER
 Vector3 dir = playerTransform.position - DetectionSettings.eyeTransform.position;
 // CALCULAMOS O ANGULO ENTRE O PLAYER E OS "OLHOS" DO INIMGO
 float angle = Vector3.Angle(dir,DetectionSettings.eyeTransform.forward);

 // SE ESTA DENTRO DO CAMPO DE VISAO DO INIMIGO
 if(angle<DetectionSettings.fieldOfViewAngle*0.5f)
 {
 // CRIAMOS UM RaycastHit
 RaycastHit hit;
 // CRIAMOS UM Raycast PARA VERIFICAR SE O PLAYER ESTA PROXIMO AO INIMIGO
 if(Physics.Raycast(DetectionSettings.eyeTransform.position,dir.normalized,out hit, DetectionSettings.fieldOfViewRange))
 {
 // SE FOR O PLAYER
 if(hit.collider.CompareTag("Player"))
 // MUDA PARA O ESTADO HUNT(CAÇANDO O PLAYER)
 SetState (EnemyStates.HUNT);
 }
 }
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO IDLE
 void Idle_b(){
 // INCREMENTA O TIMER PARA PODER CHECAR SE O PLAYER ESTA NA VISAO
 currentTimeToDetectView += Time.deltaTime;
 // SE O TEMPO  DETERMINADO PASSOU
 if (currentTimeToDetectView > DetectionSettings.timeToDetectView) {
 // RESETA PARA CONTAR DENOVO
 currentTimeToDetectView = 0;
 // VERIFICA SE O PLAYER ESTA NA VISAO
 CheckVision ();
 }
 // SE A DETECCAO DE SOM ESTA MUITO ALTA
 if(DetectionSettings.soundAmmountDetected>=DetectionSettings.soundAmmountToDetect)
 {
 // MUDA PARA O ESTADO ALERT
 SetState(EnemyStates.ALERT);
 }
 animator.SetBool ("isWalk", false);
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO ALERT
 void Alert_b(){
 // RESFRIA A DETECÇAO POR SOM
 DetectionSettings.soundAmmountDetected -= DetectionSettings.soundMultiplyToIdle * Time.deltaTime;
 // SE A DETECAO POR SOM FOR ZERADA
 if (DetectionSettings.soundAmmountDetected <= 0) {
 DetectionSettings.soundAmmountDetected = 0;
 // VOLTA PARA O ESTADO IDLE
 SetState (EnemyStates.IDLE);
 }
 // CASO CONTRARIO
 else
 {
 // VERIFICA POR VISAO
 CheckVision ();
 }
 // FAZ O INIIGO FICAR GIRANDO A PROCURA DO PLAYER
 Turn ();
 animator.SetBool ("isWalk", false);
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO HUNT
 void Hunt_b(){
 // CALCULA DISTANCIA ENTRE INIMIGO E O JOGADOR
 playerDistance = Vector3.Distance(myTransform.position,playerTransform.position);
 // SE ESTA FORA DO CAMPO DE VISAO
 if (playerDistance > DetectionSettings.fieldOfViewRange) {
 // VOLTA PRO ESTADO ALERT
 SetState (EnemyStates.ALERT);
 }
 // SE ESTIVER MUITO PROXIMO
 else if (playerDistance <= DetectionSettings.distanceToAttack) {
 // MUDA PARA O ESTADO DE ATAQUE
 SetState (EnemyStates.ATTACK);
 }
 // SEGUE O PLAYER
 FollowTarget ();
 animator.SetBool ("isWalk", true);
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO DAMAGE
 void Damage_b(){
 // INCREMENTA O CONTADOR, PARA SAIR DO ESTADO DAMAGE
 currentTimeToDamage += Time.deltaTime;
 if(currentTimeToDamage>DetectionSettings.timeToDamage)
 {
 // RESETA O CONTADOR E VOLTA PARA O ESTADO HUNT
 currentTimeToDamage = 0;
 SetState (EnemyStates.HUNT);
 }

 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO ATTACK
 void Attack_b(){
 // INCREMENTA O CONTADOR PARA PODER ATACAR
 currentAttackRate += Time.deltaTime;
 if(currentAttackRate>DetectionSettings.attackRate)
 {
 //TODO: ATAQUE, AKI POODE UTILIZAR OS METODOS PARA TIRAR VIDA
 currentAttackRate = 0;
 animator.SetTrigger ("attack");
 }

 // CALCULA A DISTANCIA DO JOGADOR
 playerDistance = Vector3.Distance(myTransform.position,playerTransform.position);

 // SE ESTIVER MUITO LONGE
 if(playerDistance>DetectionSettings.distanceToAttack)
 {
 // VOLTA PARA O ESTADO HUNT
 SetState (EnemyStates.HUNT);
 }
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO DYING
 void Dying_b(){
 // INCREMENTA O CONTADOR
 currentDyingTime += Time.deltaTime;
 if(currentDyingTime>DetectionSettings.dyingTime)
 {
 // QUANDO O TEMPO DETERMINADO PASSAR, MUDA PARA O ESTADO DEAD
 currentDyingTime = 0;
 SetState (EnemyStates.DEAD);
 }
 }

 // METODO QUE SERA EXECUTADO ENQUANTO O INIMIGO ESTIVER NO ESTADO DEAD,
 // POSSIVELMENTE SERA EXECUTA UMA UNICA VEZ
 void Dead_b(){
 // RETIRA OS EVENTOS PARA NAO DAR ERRO
 onEnemyChangeToIdle -= onEnemyChangeToIdle_Callback;
 onEnemyChangeToAlert -= onEnemyChangeToAlert_Callback;
 onEnemyChangeToDamage -= onEnemyChangeToDamage_Callback;
 onEnemyChangeToHunt -= onEnemyChangeToHunt_Callback;
 onEnemyChangeToAttack -= onEnemyChangeToAttack_Callback;
 onEnemyChangeToDying -= onEnemyChangeToDying_Callback;
 onEnemyChangeToDead -= onEnemyChangeToDead_Callback;
 onEnemyHearSound -= onEnemyHearSound_Callback;

 onHealthChange -= onHealthChange_Callback;
 onHealthOver -= onHealthOver_Callback;

 // DESTROI O INIMIGO, JA QUE ELE MORREU
 Destroy(gameObject);
 }
}

[System.Serializable]
// CLASSE PARA "ORGANIZAR" AS VARIAVEIS DE DETECCAO E ETC
public class EnemyDetection
{
 // ANGULO MAXIMO DE VISAO
 [Range(0,359f)]public float fieldOfViewAngle = 180f;
 // DISTANCIA MAXIMA DE VISAO
 public float fieldOfViewRange = 20f;
 // TEMPO PARA VERIFICAR A VISAO
 [Range(0.1f,5f)]public float timeToDetectView = 2f;
 // QUANTIDADE DE SOM PARA MUDAR PARA O ESTADO ALERT
 [Range(0,100f)]public float soundAmmountToDetect = 45f;
 // QUANTIDADE DE SOM DETECTADA ATUALMENTE
 public float soundAmmountDetected = 0;
 // QUANTIDADE DE SOM PARA DIMINUIR, PARA VOLTAR AO ESTADO IDLE
 public float soundMultiplyToIdle = 10f;
 // DISTANCIA MAXIMA QUE PODE OUVIR UM SOM
 public float soundMaxHearArea = 25f;
 // TEMPO PARA SAIR DO ESTADO DAMAGE
 public float timeToDamage = 1f;
 // TEMPO DE CADA ATAQUE
 public float attackRate = 2f;
 // DISTANCIA MINIMA PARA ATACAR
 public float distanceToAttack = 2f;
 // TEMPO PARA SAIR DO ESTADO DYING E IR PARA O DEAD(MORRER)
 public float dyingTime = 1.5f;
 // VELOCIDADE QUE GIRA ENQUANTO ESTA NO ESTADO ALERT
 public float turnVelocity = 15f;
 // DISTANCIA PARA PARAR DO NAV MESH AGENT
 public float stopDistance = 1.8f;
 // DISTANCIA PARA VERIFICAR INIMIGOS A FRENTE, PARA TENTAR CONTORNA-LOS
 public float enemyCheckDistance = 1.7f;
 // POSICAO DOS OLHOS PARA VERIFICAR VISAO, PODE SER O PROPRIO TRANSFORM DO INIMIGO
 public Transform eyeTransform;
}
Edit:
Upei o package  os scripts e uma cena de teste:
https://mega.nz/#!0Z8DmaQL!bZgcPInokmDgrUcJDtmnC1cOjHZIp5n_ypG9AG2Dn04


Última edição por Manawydan em Qui Ago 18, 2016 9:29 pm, editado 2 vez(es) (Motivo da edição : Uploado do package)
Manawydan
Manawydan
Mestre
Mestre

PONTOS : 3687
REPUTAÇÃO : 198
Idade : 27
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

https://wad.ojooo.com/register.php?ref=ManawydanBr

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Guilherme_cj852 Ter Ago 16, 2016 5:37 pm

Muito bom, direto aparece alguem aqui no fórum com duvidas sobre AI, esse script vai ajudar bastante
Guilherme_cj852
Guilherme_cj852
MembroAvançado

Masculino PONTOS : 3858
REPUTAÇÃO : 131
Idade : 23
Áreas de atuação : Programador C#
Designer
Iniciante em PHP
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

http://ugames-studio.weebly.com/

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Chilinger Ter Ago 16, 2016 10:26 pm

Ja pg uma vez para o Marcos mas vc sabe fazer AI para trafego de carro.

Chilinger
MembroAvançado

Masculino PONTOS : 4110
REPUTAÇÃO : 42
Idade : 30
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Eduardoro39 Qua Ago 17, 2016 8:31 pm

Pode fazer um video ensinando a instalar os dois scripts nao consegui fazer rancar dano do player
nao sei o que é esse Eye transform

Eduardoro39
Avançado
Avançado

Masculino PONTOS : 3276
REPUTAÇÃO : 11
Idade : 24
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Manawydan Qua Ago 17, 2016 9:54 pm

entao esse script é apenas um prototipo, voce teria que fazer o seu script de player derivar de HealthBehaviour, e quando quissese que o inimigo tirasse vida é só executar o método 
TakeDamage que esta presenta em HealthBehaviour. eyeTransform seria a posicao do olho do inimigo, ou seja a posicao que voce quer que ele lance o raycast para verificar a visao, se quiser pode colocar o transform do proprio inimigo.
Exemplo:
Código:
using UnityEngine;
using System.Collections;

// TEM QUE DERIVAR DE HealthBehaviour INVEZ DE MonoBehaviour
public class PlayerBehaviour : HealthBehaviour
{
 // RESTO DO CODIGO DO SEU PLAYER
}


E como esse script é um prototipo voce pode editar e modificar como quiser.
Se for usa a AI do jeito que esta voce pode editar a linha 555 por isso:
Código:
playerTransform.GetComponent<HealthBehaviour>().TakeDamage(100,gameObject);

Eu não coloquei esse codigo por padrao pra tentar deixar a AI mais generica pra voce tirar vida como quiser, é so executar o método TakeDamage.
E tambem usei o animator so pra mostrar como fazer a AI trocar de animacoes, se quiser pode apagar as partes de animacoes, caso contrario se qusier usar desta forma vai ter que criar um Animator Controller deste jeito: 
[TUTORIAL] Script Simples De AI Com Comportamentos e Eventos Ddd4cd2b3f3a4b7fb5a6f8f71edc5d83
Tente Fazer o que eu disse, pq essa AI é Basica-Intermediaria e usa varias coisas pra funcionar, se nao conseguir eu tento fazer um package e upo aki.
Manawydan
Manawydan
Mestre
Mestre

PONTOS : 3687
REPUTAÇÃO : 198
Idade : 27
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

https://wad.ojooo.com/register.php?ref=ManawydanBr

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Eduardoro39 Qui Ago 18, 2016 7:32 pm

upa o package nao consegui fazer rancar vida

Eduardoro39
Avançado
Avançado

Masculino PONTOS : 3276
REPUTAÇÃO : 11
Idade : 24
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Manawydan Qui Ago 18, 2016 9:25 pm

Upei o package no mega o link esta no primeiro post.
Eu usei um modelo da asset Store para testar a AI e tambem peguei o fps controler para o movimento do player. voce vai ter que criar a tag Enemy e aplicar nos inimigos.
Lembrando que esta AI é um prototipo logo voces podem editar/ modificar como quiser, ela é apenas uma base. Se voce ler os comentarios do script fica mais facil entender como as cosias funcionam, boa sorte!
Manawydan
Manawydan
Mestre
Mestre

PONTOS : 3687
REPUTAÇÃO : 198
Idade : 27
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

https://wad.ojooo.com/register.php?ref=ManawydanBr

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Eduardoro39 Sex Ago 19, 2016 12:37 am

Vlw só que nao consegui instalar as animaçoes ja ta la só que nao acontece nada

Eduardoro39
Avançado
Avançado

Masculino PONTOS : 3276
REPUTAÇÃO : 11
Idade : 24
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Manawydan Sex Ago 19, 2016 12:06 pm

Estranho aki ta funcionando normal. Voce criou a Tag Enemy e colocou nos inimigos?
Verifique se o Animator do inimigo esta linkado as animações em Motion, igual a imagem abaixo:
[TUTORIAL] Script Simples De AI Com Comportamentos e Eventos 2fab92ddefe34192842fdda8d3c882f1
Verifique tambem se o Animator Controller esta linkado nas AI:
[TUTORIAL] Script Simples De AI Com Comportamentos e Eventos D1e525d13a0f485c942ac1285b9c9562
Verifique tambem os parametros do animator controller e suas transições aki esta tudo ok, ai deveria estar tambem. Aparece algum erro no console?
Manawydan
Manawydan
Mestre
Mestre

PONTOS : 3687
REPUTAÇÃO : 198
Idade : 27
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

https://wad.ojooo.com/register.php?ref=ManawydanBr

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Eduardoro39 Sex Ago 19, 2016 7:42 pm

o que é isso   VERIFICAMOS SE O source SERA ESSE INIMIGO, POIS ESSE METODO SERA CHAMADO PARA TODOS QUE O "SE INSCREVERAM"

Eduardoro39
Avançado
Avançado

Masculino PONTOS : 3276
REPUTAÇÃO : 11
Idade : 24
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Callyde Jr Qui Set 08, 2016 1:05 pm

Parabens Manawydan Muito bom
Callyde Jr
Callyde Jr
Programador

Masculino PONTOS : 5189
REPUTAÇÃO : 446
Idade : 45
Áreas de atuação : Iniciante em modelagem Blender,Sketchup
Programador
Idealista

Meu Canal
https://www.youtube.com/ch
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

http://unnygames.000webhostapp.com/

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Callyde Jr Sex Set 09, 2016 12:19 pm

Aqui eu coloquei para tirar vida no inspetor, mais tenho uma duvida  a vida do player e a do inimigo estao com mesmo nome ?
Código:
C#


[list=linenums]
[*]//TODO: ATAQUE, AKI POODE UTILIZAR OS METODOS PARA TIRAR VIDA
[*] currentAttackRate = 0;
[*] animator.SetTrigger ("attack");
maxHealth - 10;
}
[/list]
Callyde Jr
Callyde Jr
Programador

Masculino PONTOS : 5189
REPUTAÇÃO : 446
Idade : 45
Áreas de atuação : Iniciante em modelagem Blender,Sketchup
Programador
Idealista

Meu Canal
https://www.youtube.com/ch
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

http://unnygames.000webhostapp.com/

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Manawydan Sex Set 09, 2016 12:30 pm

Voce pode fazer o player derivar de HealthBebaviour ou pode adicionar o  mesmo como um componente.
Se for fazer o metodo 1, entao voce pode chamar o metodo TakeDamage do alvo que quer tirar vida, ou seja se quer tirar vida do player voce deve acessar o script do player e executar o metodo TakeDamage.
Se for fazer o metodo 2, entao voce pode usar um GetComponent e pegar o script HealthBehavior do alvo e executar o metodo TakeDamage do alvo.
Manawydan
Manawydan
Mestre
Mestre

PONTOS : 3687
REPUTAÇÃO : 198
Idade : 27
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

https://wad.ojooo.com/register.php?ref=ManawydanBr

Ir para o topo Ir para baixo

TUTORIAL Re: [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos

Mensagem por Callyde Jr Sex Set 09, 2016 3:31 pm

Hummmm entendi, e parabens pelo tutorial
Callyde Jr
Callyde Jr
Programador

Masculino PONTOS : 5189
REPUTAÇÃO : 446
Idade : 45
Áreas de atuação : Iniciante em modelagem Blender,Sketchup
Programador
Idealista

Meu Canal
https://www.youtube.com/ch
Respeito as regras : [TUTORIAL] Script Simples De AI Com Comportamentos e Eventos WvDYdlf

http://unnygames.000webhostapp.com/

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos