Ajustes na IA inimigo
3 participantes
Página 1 de 1
Ajustes na IA inimigo
Olá pessoas! Estou desenvolvendo um jogo de terror com visão Top-Down bem simples, porém acabei ficando preso na IA do meu inimigo, a parte de Patrulhar e Perseguir meu jogador está quase completa, estou com um problema em fazer meu inimigo perseguir meu personagem se estiver somente no campo de visão dele, por enquanto ele persegue independente da direção do meu personagem, e também estou com um problema com ele e portas, quero que se caso, ele estiver perseguindo meu jogador, e durante a perseguição ele atravessar e fechar uma porta antes que inimigo passe, que o inimigo seja capaz de, parar seu movimento, destruir e porta(caso não esteja trancada), e se o personagem ainda estiver no campo de visão continuar a perseguição, caso contrario voltar a patrulhar, estou usando NavMesh e FSM no meu inimigo.
NPCBase:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NPCBaseFSM : StateMachineBehaviour {
public GameObject NPC;
public UnityEngine.AI.NavMeshAgent agent;
public GameObject opponent;
public float speed = 2.0f;
public float rotSpeed = 1.0f;
public float accuracy = 3.0f;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
NPC = animator.gameObject;
opponent = NPC.GetComponent<KillerIA> ().GetPlayer ();
agent = NPC.GetComponent<UnityEngine.AI.NavMeshAgent> ();
}
}
Killer IA:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KillerIA : MonoBehaviour {
Animator anim;
public GameObject player;
public float hideDistance = 5;
public GameObject GetPlayer() {
return player;
}
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));
if(anim.GetFloat("distance") > hideDistance)
anim.SetBool ("hide", GameObject.Find("Player").GetComponent<Controller>().hide);
}
}
Patrulha:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Patrol : NPCBaseFSM {
GameObject[] waypoints;
int currentWP;
void Awake() {
waypoints = GameObject.FindGameObjectsWithTag ("waypoint");
}
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
base.OnStateEnter (animator, stateInfo, layerIndex);
currentWP = 0;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
if (waypoints.Length == 0)
return;
if (Vector3.Distance (waypoints [currentWP].transform.position,
NPC.transform.position) < accuracy) {
currentWP++;
if (currentWP >= waypoints.Length) {
currentWP = 0;
}
}
agent.SetDestination (waypoints [currentWP].transform.position);
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
}
}
Perseguição:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chase : NPCBaseFSM {
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
base.OnStateEnter (animator, stateInfo, layerIndex);
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
agent.SetDestination (opponent.transform.position);
agent.speed = 5;
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
agent.speed = 2.5f;
}
}
Gostaria que alguém me ajudasse com esse problema, ou pelo menos pudesse me explicar como posso fazer para conseguir, obrigado pela atenção! <3
Feliz *2018*
Última edição por dstaroski em Qui Fev 08, 2018 8:03 am, editado 1 vez(es) (Motivo da edição : Alterado título conforme os padrões do fórum.)
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Ajustes na IA inimigo
MAN TENTA USA UM RAYCAST PRA CONFIRMA SE ELE ESTA VENDO OU NAO O PLAYER AQUI TA UM EXEMPLO QUE PEGUEI AQUI NO FORUMM ELE MANDA UM RAYCAST PRO PLAYER SE LOCALIZA ELE ATACA SE COLIDIR COM ALGO ELE VOLTA A PATRULHA
ABRACOS
ABRACOS
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(CharacterController))]
public class ZOMBIE : MonoBehaviour
{
public Transform[] AIPoints; // PONTOS POR ONDE O INIMIGO PODE TRANSITAR
private List<Transform> ListaDeAiPoints = new List<Transform>(); // LISTA QUE IRA GUARDAR OS AIPoints DISPONIVEIS PARA O INIMIGO ANDAR NO MOMENTO
public float velocidadeDeMovimento = 5, DistanciaDeObservacao = 30, DistanciaDeSeguir = 20, DistanciaDeAtaque = 2; // VARIAVEIS A SEREM CONFIGURADAS
private float distanciaDoJogador, cronometroTempoNoLocal;
private int AIpoitAtual; // AIPoint ATUAL PARA ONDE O INIMIGO ESTA SE MOVENDDO
private GameObject Player;
private bool VendoOPlayer, EsperandoNoLocal, SeguindoOPlayer;
public float TempoNoLocal = 0.001f; // TEMPO QUE O INIMIGO AGUARDA NO AIPoint ATE COMEÇAR A IR PARA O PROXIMO
void Start()
{
Player = GameObject.FindWithTag("Player"); // PLAYER = OBJETO QUE CONTEM A TAG PLAYER
for (int x = 0; x < AIPoints.Length; x++)
{ // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints[x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast(de, para))
{ // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
if (!ListaDeAiPoints.Contains(AIPoints[x]))
{ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints[x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast(de, para))
{ // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
ListaDeAiPoints.Remove(AIPoints[x]); // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
}
void Update()
{
//================================================RAYCAST ( INIMIGO ESTA VENDO O PLAYER? )=========================================================//
RaycastHit hit; // DECLARO UM RAYCAST
Vector3 deOnde = transform.position; //A VARIAVEL deOnde RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 paraOnde = Player.transform.position;//A VARIAVEL paraOnde RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 direction = paraOnde - deOnde; // O VETOR direction RECEBE A POSIÇAO CORRESPONDENTE A B-A, OU SEJA, O VETOR paraOnde - o vetor deOnde
if (Physics.Raycast(transform.position, direction, out hit, 1000) && distanciaDoJogador < DistanciaDeObservacao)
{ // SE RAYCAST, E SE A DISTANCIA DO PLAYER FOR MENOR DO QUE A MAXDISTANCIA
if (hit.collider.gameObject.CompareTag("Player"))
{ // SE A TAG DO OBJETO QUE O RAYCAST COLIDIU FOR "PLAYER"
VendoOPlayer = true; // VARIAVEL VendoOPlayer FICA VERDADEIRA
}
else
{ // SE NAO
VendoOPlayer = false;// VARIAVEL VendoOPlayer FICA FALSA
}
}
//===========================================LINECAST ( DEIXAR ACESSIVEL APENAS OS AIPOINTS VISIVEIS)=========================================//
if (EsperandoNoLocal == true)
{ // SE A VARIAVEL EsperandoNoLocal ESTIVER VERDADEIRA
for (int x = 0; x < AIPoints.Length; x++)
{ // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints[x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast(de, para))
{ // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
Debug.DrawLine(de, para); // APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
if (!ListaDeAiPoints.Contains(AIPoints[x]))
{ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints[x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast(de, para))
{ // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
Debug.DrawLine(de, para);// APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
ListaDeAiPoints.Remove(AIPoints[x]); // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
EsperandoNoLocal = false; // A VARIAVEL EsperandoNoLocal FICA FALSA
}
//==================================================== COMANDO PARA FAZER O INIMIGO ANDAR PELOS AIPOINTS======================================//
distanciaDoJogador = Vector3.Distance(Player.transform.position, transform.position); // MEDE A DISTANCIA ENTRE O INIMIGO E O PLAYER
if (distanciaDoJogador >= DistanciaDeObservacao || VendoOPlayer == false && EsperandoNoLocal == false)
{ // SE A DISTANCIA ENTRE INIMIGO E PLAYER FOR MENOR DO QUE A DISTANCIA DE OBSERVAÇAO E VAR'S....
if (AIpoitAtual < ListaDeAiPoints.Count)
{ // CHECAGEM PRA NAO DAR ERRO DE ARRAY
Vector3 target = ListaDeAiPoints[AIpoitAtual].transform.position;//A VARIAVEL target RECEBE A POSIÇAO DO AIpointAtual
transform.LookAt(target);//O INIMIGO OLHA NA DIREÇAO DO AIPOINT SELECIONADO ( O AIpointAtual )
transform.position = Vector3.MoveTowards(transform.position, target, velocidadeDeMovimento * Time.deltaTime); // MOVE O PALYER EM DIREÇAO AO AIpointAtual
if (transform.position == ListaDeAiPoints[AIpoitAtual].transform.position)
{ // SE A POSIÇAO DO PLAYER FOR IGUAL A POSIÇAO DO AIpointAtual, OU SEJA, CHEGOU NO DESTINO
cronometroTempoNoLocal += Time.deltaTime; // COMEÇA A CONTAR O CRONOMETRO DE ESPERA NO LOCAL
EsperandoNoLocal = true; // A VARIAVEL EsperandoNoLocal FICA VERDADEIRA PARA INDICAR QUE ESTA ESPERANDO
}
if (cronometroTempoNoLocal >= TempoNoLocal)
{ // SE JA ESPEROU O TEMPO QUE DEVERIA ESPERAR NO LOCAL
cronometroTempoNoLocal = 0; // ZERA O CRONOMETRO PARA PODER REUTILIZAR ELE
int NumeroDeElementosDaLista2 = ListaDeAiPoints.Count; // UMA INT COM NOME NumeroDeElementosDaLista2 RECEBE O NUMERO DE ITENS QUE TEM NA LISTA
AIpoitAtual = Random.Range(0, NumeroDeElementosDaLista2); // A VARIAVEL AIpoitAtual RECEBE UM VALOR ALEATORIO ENTRE 0 E O O NUMERO DE ITENS QUE TEM NA LISTA
}
}
}
//================================================= COMANDOS PARA CHECAR DISTANCIA, OLHAR E SEGUIR================================================//
else if (distanciaDoJogador >= DistanciaDeSeguir && distanciaDoJogador < DistanciaDeObservacao && VendoOPlayer == true)
{ // SE ESTA PERTO PARA OLHAR MAS AINDA E LONGE PARA SEGUIR:
Olhar(); // VOID PARA O INIMIGO FICAR OLHANDO PARA O PLAYER
}
else if (distanciaDoJogador <= DistanciaDeSeguir && VendoOPlayer == true)
{ //SE JA ESTA PERTO O SUFICIENTE PARA SEGUIR E ESTA VENDO O PLAYER
Seguir(); // VOID PARA O INIMIGO SEGUIR O PLAYER
}
//=======================================================CORRIGIR BUGS DE INDEX RANGE=============================================================//
if (AIpoitAtual >= ListaDeAiPoints.Count)
{ // SE O AIpoitAtual TIVER UM VALOR MAIOR DO QUE O MAXIMO DE ELEMENTOS QUE EXISTEM NA LISTA
AIpoitAtual = ListaDeAiPoints.Count - 1; // A VARIAVEL AIpoitAtual RECEBE O NUMERO DE ELEMENTOS DA LISTA -1, ISSO EVITARA BUGS
}
else if (AIpoitAtual <= 0)
{ //SE O AIpoitAtual TIVER UM VALOR MENOR DO QUE ZERO:
AIpoitAtual = 0;//AIpoitAtual RECEBERA O VALOR ZERO, ISSO EVITARA BUGS
}
//==========================================FAZER O PLAYER RECEBER DANO AO CHEGAR PERTO DO INIMIGO================================================//
if (distanciaDoJogador <= DistanciaDeAtaque)
{ // SE A DISTANCIA ENTRE O INIMIGO E O PLAYER FOR MENOR DO QUE A DISTANCIA DE ATAQUE
VidaPlayer.RecebendoDano = true; // A VARIAVEL RecebendoDano DO SCRIPT VidaPlayer FICA VERDADEIRA
}
else if (distanciaDoJogador > DistanciaDeAtaque)
{ // SE A DISTANCIA ENTRE O INIMIGO E O PLAYER FOR MAIOR DO QUE A DISTANCIA DE ATAQUE
VidaPlayer.RecebendoDano = false; // A VARIAVEL RecebendoDano DO SCRIPT VidaPlayer FICA FALSA
}
//===============================================ESTAVA SEGUINDO MAS PAROU DE VER O PLAYER========================================================//
if (SeguindoOPlayer == true && VendoOPlayer == false)
{ // SE ESTA SEGUINDO O PLAYER MAS NAO ESTA VENDO ELE
for (int x = 0; x < AIPoints.Length; x++)
{ // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints[x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast(de, para))
{ // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
Debug.DrawLine(de, para); // APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
if (!ListaDeAiPoints.Contains(AIPoints[x]))
{ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints[x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast(de, para))
{ // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
Debug.DrawLine(de, para);// APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
ListaDeAiPoints.Remove(AIPoints[x]); // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
int NumeroDeElementosDaLista2 = ListaDeAiPoints.Count; // A VARIAVEL NumeroDeElementosDaLista2 RECEBE O NUMERO DE ELEMENTOS CONTIDOS NA LISTA
AIpoitAtual = Random.Range(0, NumeroDeElementosDaLista2); // A VARIAVEL AIpoitAtual RECEBE UM VALOR ALEATORIO ENTRE 0 E O O NUMERO DE ITENS QUE TEM NA LISTA
SeguindoOPlayer = false; // A VARIAVEL SeguindoOPlayer RECEBE FALSE
}
}
//================================================================= OUTRAS VOIDS=======================================================================//
void Olhar()
{ // VOID QUE FAZ O INIMIGO OLHAR PARA O PLAYER
Vector3 OlharPlayer = Player.transform.position; // O VETOR OlharPlayer RECEBE A POSIÇAO DO PLAYER
transform.LookAt(OlharPlayer); // O INIMIGO PLHA EM DIREÇAO AO PLAYER
}
void Seguir()
{
SeguindoOPlayer = true; // A VARIAVEL SeguindoOPlayer FICA VERDADEIRA
Vector3 SeguirPlayer = Player.transform.position; // O VETOR SeguirPlayer RECEBE A POSIÇAO DO PLAYER
transform.position = Vector3.MoveTowards(transform.position, SeguirPlayer, velocidadeDeMovimento * Time.deltaTime); // O INIMIGO SE MOVE EM DIREÇAO AO PLAYER
}
}
exodiamk- Iniciante
- PONTOS : 2521
REPUTAÇÃO : 0
Respeito as regras :
Re: Ajustes na IA inimigo
Bem, eu alterei o script do meu inimigo, coloquei o raycast para a visão, parece estar funcionando, mas não consigo ter certeza, mas ele ainda pega meu personagem atraves da parede, tentei fazer com tags e tudo mais e fica dando erro "Object reference not set an instance of an object", então queria saber como posso resolver ou outro metodo;
Killer IA:
Killer IA:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KillerIA : MonoBehaviour {
Animator anim;
public GameObject player;
public float hideDistance = 5;
Ray thuRay;
public Color rayColor;
RaycastHit hit;
public GameObject GetPlayer() {
return player;
}
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
Vector3 targetDir = player.transform.position - transform.position;
float angle = Vector3.Angle (targetDir, transform.forward);
thuRay = new Ray (transform.position, -transform.forward * 10);
anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));
if (anim.GetFloat ("distance") > hideDistance)
anim.SetBool ("hide", GameObject.Find ("Player").GetComponent<Controller> ().hide);
if (angle <= 90 && Physics.Raycast (transform.position, -transform.forward, 10)) {
Debug.Log ("Can see you");
anim.SetBool ("canSee", true);
} else {
anim.SetBool ("canSee", false);
}
}
}
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Ajustes na IA inimigo
mano se esse for seu script voce so colocou para velo coloque depois do Debug.Log ("Can see you"); a parte do codigo que ele ira perseguir o player
e no else coloque se ele vai anda radon ou patrulhar
e no else coloque se ele vai anda radon ou patrulhar
exodiamk- Iniciante
- PONTOS : 2521
REPUTAÇÃO : 0
Respeito as regras :
Re: Ajustes na IA inimigo
Bom dia! por gentileza não ponha ajuda e tal sem seus títulos. Seja objetivo no título do tópico, descrevendo em parte seu problema. O mesmo será alterado.Gwiisk escreveu:Olá pessoas! Estou desenvolvendo um jogo de terror com visão Top-Down bem simples, porém acabei ficando preso na IA do meu inimigo, a parte de Patrulhar e Perseguir meu jogador está quase completa, estou com um problema em fazer meu inimigo perseguir meu personagem se estiver somente no campo de visão dele, por enquanto ele persegue independente da direção do meu personagem, e também estou com um problema com ele e portas, quero que se caso, ele estiver perseguindo meu jogador, e durante a perseguição ele atravessar e fechar uma porta antes que inimigo passe, que o inimigo seja capaz de, parar seu movimento, destruir e porta(caso não esteja trancada), e se o personagem ainda estiver no campo de visão continuar a perseguição, caso contrario voltar a patrulhar, estou usando NavMesh e FSM no meu inimigo.NPCBase:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NPCBaseFSM : StateMachineBehaviour {
public GameObject NPC;
public UnityEngine.AI.NavMeshAgent agent;
public GameObject opponent;
public float speed = 2.0f;
public float rotSpeed = 1.0f;
public float accuracy = 3.0f;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
NPC = animator.gameObject;
opponent = NPC.GetComponent<KillerIA> ().GetPlayer ();
agent = NPC.GetComponent<UnityEngine.AI.NavMeshAgent> ();
}
}
Killer IA:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KillerIA : MonoBehaviour {
Animator anim;
public GameObject player;
public float hideDistance = 5;
public GameObject GetPlayer() {
return player;
}
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));
if(anim.GetFloat("distance") > hideDistance)
anim.SetBool ("hide", GameObject.Find("Player").GetComponent<Controller>().hide);
}
}
Patrulha:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Patrol : NPCBaseFSM {
GameObject[] waypoints;
int currentWP;
void Awake() {
waypoints = GameObject.FindGameObjectsWithTag ("waypoint");
}
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
base.OnStateEnter (animator, stateInfo, layerIndex);
currentWP = 0;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
if (waypoints.Length == 0)
return;
if (Vector3.Distance (waypoints [currentWP].transform.position,
NPC.transform.position) < accuracy) {
currentWP++;
if (currentWP >= waypoints.Length) {
currentWP = 0;
}
}
agent.SetDestination (waypoints [currentWP].transform.position);
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
}
}
Perseguição:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chase : NPCBaseFSM {
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
base.OnStateEnter (animator, stateInfo, layerIndex);
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
agent.SetDestination (opponent.transform.position);
agent.speed = 5;
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
agent.speed = 2.5f;
}
}
Gostaria que alguém me ajudasse com esse problema, ou pelo menos pudesse me explicar como posso fazer para conseguir, obrigado pela atenção! <3
Feliz *2018*
Abraço!
Tópicos semelhantes
» Script de health de inimigo sendo acessado mesmo sem acerta o inimigo
» inimigo atacar
» Inimigo 2d
» IA inimigo!
» Dano do inimigo
» inimigo atacar
» Inimigo 2d
» IA inimigo!
» Dano do inimigo
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos