GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Conectar-se

Esqueci minha senha

Últimos assuntos
» como fazer o player atacar e depois voltar para o sprite parado.
por makgamer Sex 09 Abr 2021, 11:00

» Inimigo Seguir o Player e Uma coisa a mais...
por makgamer Sex 09 Abr 2021, 10:11

» Ponto de origem da bala
por Paulomm32 Ter 06 Abr 2021, 10:56

» [Resolvido]Alterar o ponto de origem da bala na sprite.
por Capote Ter 06 Abr 2021, 07:36

» Tiro não sai pelo cano da arma
por Capote Seg 05 Abr 2021, 07:30

» [Curso de GML] Aula 5 - A declaração FOR
por VectorthecrocodileBR Dom 04 Abr 2021, 23:52

» [Curso de GML] Aula 3 - As Declarações IF, IF/ELSE e SWITCH
por VectorthecrocodileBR Dom 04 Abr 2021, 17:18

» Tiro não sai pelo cano da arma
por Paulomm32 Dom 04 Abr 2021, 14:08

» Como faço efeito digitação
por makgamer Sab 03 Abr 2021, 23:36

» [RESOLVIDO]Fazer o personagem virar quando o mouse chega a 90 graus
por Paulomm32 Sab 03 Abr 2021, 13:28

» [RESOLVIDO]Atirar para onde eu aperto
por NPH Sex 02 Abr 2021, 20:36

» resolução do texto
por NPH Sex 02 Abr 2021, 16:45

» Novidade interessante!!! Update do GMS 2
por Mr.Rafael Qui 01 Abr 2021, 16:02

» Gerador de QRCODE Game maker Studio e GM 8
por TRFN Seg 29 Mar 2021, 23:36

» Olá, Me chamo Ausiane!
por TRFN Seg 29 Mar 2021, 23:28

» Como que eu faço para fazer time rewind no gamemaker
por Mr.Rafael Ter 23 Mar 2021, 16:35

» 0.1 + 0.2 == 0.3 = False???
por Ralphed Ter 23 Mar 2021, 11:33

» Esse é seu primeiro contato com programação de jogos?
por Ausiane Seg 22 Mar 2021, 08:34

» Estou encontrando problema no meu dano
por Sagastico Sab 20 Mar 2021, 21:48

» Instancias ID
por NPH Sab 20 Mar 2021, 18:55

» como eu faço um sistema de recorde?
por um cara ai Sab 20 Mar 2021, 15:53

» Como que eu faço para fazer o tempo parar no gamemaker?
por NPH Ter 16 Mar 2021, 21:19

» [Resolvido] Click de inventario
por PaladinoMaluko Sab 13 Mar 2021, 18:29

» Raliza Software - Hyperball
por tito76 Qua 10 Mar 2021, 03:40

» Draw Set Color local
por divin sphere Ter 09 Mar 2021, 20:36


Máquina de estado/State Machine no Unity

Ir em baixo

Máquina de estado/State Machine no Unity Empty Máquina de estado/State Machine no Unity

Mensagem por theguitarmester Qua 01 Jul 2020, 15:58

Como parte do pessoal aqui também tem interesse no Unity, resolvi postar essa máquina de estado que fiz para meu jogo e estou utilizando ela, ela está redondinha, faz tempo que to usando ela nesse projeto e não vi qualquer problema com ela.

State Machine / Máquina de estado com:
- Controle de estados centralizado da aplicação
- Estado por string
- Estados tem Create/Update e End
-Mudanças de estados podem ocorrer de um estado a outro, ou de qualquer estado

Classe: StateMachine.cs
Código:
using System;
using System.Collections.Generic;
using System.Linq;

/// Author: TGM, 2020
public class StateMachine
{
    public string currentState { get; private set; }
    public string previousState { get; private set; }
    private Dictionary<string, StateActions> states;
    private List<StateChanges> changesAnyState;
    public const string PreviousState = "_previous";

    public StateMachine(string state) {
        currentState = state;
        states = new Dictionary<string, StateActions>();
        changesAnyState = new List<StateChanges>();
    }
    
    public bool IsCurrent(string[] states) => states != null && (states).Contains(currentState);

    public void AddState(string name, Action create = null, Action update = null, Action end = null)
    {
        StateActions state = new StateActions(create, update, end);
        states.Add(name, state);
    }

    public void AddChange(string from, string to, Func<bool> when, string[] exceptFrom = null)
    {
        StateActions stateFrom = states[from];
        
        if (stateFrom == null) throw new Exception($"Invalid state(s): from: {from}, to: {to}");

        stateFrom.changes.Add(new StateChanges(to, when, exceptFrom));
    }

    public void AddChangeAnyState(string to, Func<bool> when, string[] exceptFrom = null)
    {
        StateActions stateTo = states[to];
        if (stateTo == null) throw new Exception($"Invalid to state: {to}");

        changesAnyState.Add(new StateChanges(to, when, exceptFrom));
    }

    public void Update()
    {
        StateActions state = states[currentState];

        state.update?.Invoke();
        foreach (StateChanges change in state.changes)
        {
            bool changed = Change(change);
            if (changed) break;
        };

        foreach (StateChanges anyChange in changesAnyState)
        {
            Change(anyChange);
        }
    }

    private bool Change(StateChanges change)
    {
        if (change.when() && !(IsCurrent(change.exceptFrom)))
        {
            if (change.to != PreviousState)
            {
                previousState = currentState;
                currentState = change.to;
            } else
            {
                string oldState = currentState;
                currentState = previousState;
                previousState = oldState;
            }
            states[previousState].end?.Invoke();
            states[currentState].create?.Invoke();
            return true;
        };
        return false;
    }
}


internal class StateActions
{    
    public Action create;
    public Action update;
    public Action end;
    public List<StateChanges> changes;

    public StateActions(Action create, Action update, Action end)
    {
        this.create = create;
        this.update = update;
        this.end = end;
        changes = new List<StateChanges>();
    }
}

internal class StateChanges
{
    internal string to;
    internal Func<bool> when;
    internal string[] exceptFrom;

    public StateChanges(string to, Func<bool> when, string[] exceptFrom)
    {
        this.to = to;
        this.when = when;
        this.exceptFrom = exceptFrom;
    }
}

Considerações sobre a implementação:
- Criei uma função pra poder voltar a um estado anterior: usei por um tempo depois decidi não usar mais, isso é fácil de gerar problemas porque tu não tem certeza de qual é o estado anterior (tu pode pensar que é um, mas se ocorreu algum anystate, vira outro logicamente). Eu não uso mais.
- Funções para pegar o estado atual dela não deveriam ser usadas em seu código, somente pra debug ou algo assim, porque é importante que tudo que envolve o estado, seja controlado dentro dela. Editado: Fazer o GET do estado atual para a IA seria aceitável.


Não sei quantos tem interesse, então postarei aqui sendo breve, mas qualquer pergunta de como funciona, por que usar algo assim, de implementação, ou outra coisa, sinta-se a vontade pra comentar Smile


Última edição por theguitarmester em Qui 02 Jul 2020, 21:37, editado 2 vez(es)
theguitarmester
theguitarmester

Games Ranking : Nota B

Notas recebidas : B
Data de inscrição : 28/02/2012
Reputação : 111
Número de Mensagens : 2055
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Plataformas :
  • Unity


Ver perfil do usuário http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por polosam Qua 01 Jul 2020, 21:21

Cara, vou estudar isso! Obrigado por postar!
polosam
polosam

Games Ranking : Nota A

Notas recebidas : A + B
Data de inscrição : 20/12/2010
Reputação : 120
Número de Mensagens : 737
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 1 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4


Ver perfil do usuário

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por vinians Qui 02 Jul 2020, 12:03

Muito bom @theguitarmeister, máquinas de estado são muito importante, eu uso muito e não depende de linguagem, é um algoritmo muito importante para programação de jogos e pra quem usa o Unity pode se basear na sua implementação. Show!

_________________

Games e Engines ? Aqui!
Siga-me no Twiter @vinians
Alguns dos meus jogos
Também crio músicas para jogos
Meu blog sobre assuntos diversos
* Leia as Regras do Fórum
vinians
vinians

Games Ranking : Nota B

Notas recebidas : B-C-A-C
Data de inscrição : 18/09/2008
Reputação : 87
Número de Mensagens : 2713
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4
  • Game Maker Studio 2.0
  • Construct 2
  • Java
  • C#
  • Javascript
  • C ou C++
  • Outros


Ver perfil do usuário https://vinians.itch.io

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por theguitarmester Qui 02 Jul 2020, 21:35

@Polosam, Boa!

@Vinians, sim, bah, sem ela eu nem conseguiria continuar mexendo no jogo, cada funcionalidade a mais que tu coloca, sem máquina de estado vira um caos!

Bah, fiz esse post e disse que não precisava pegar o estado da máquina de estado por fora... aí agora eu to tendo que usar huehueheuheu
Mas é pra algo específico: Inteligência Artificial....
O inimigo e o player no meu jogos, eles são bem parecidos, é a mesma mecânica deles, e o player funciona com inputs do teclado que eu transformo em código, por exemplo: se tu apertar o botão esquerdo do mouse, tu vai setar uma variável de input como true, algo como 'inputAttack = 1', e a máquina de estado só vê esses inputs. Da mesma forma o inimigo vai funcionar (as versões atuais tem mais coisas além de input, tá misturado), só por input. A questão é que nós (pessoas) ativamos os inputs através de coisas que vemos visualmente, mas uma IA não vai agir pelo visual (poderia até fazer assim, mas não sei se acabaria o jogo até 2022 hue), então ela tem que ter uma forma melhor de 'enxergar' aonde estão as coisas, e qual o estado dela. Por isso a máquina de estado que criei pra IA, vai ter acesso ao estado da máquina de estado que cuida do comportamento de um Character/guerreiro hehe;


Ah, com isso eu decidi mudar o jeito do GET do estado, deixando ele pela variável com o método publico (mas SET privado).
Atualizei o código no post.

Outra coisa interessante seria usar ENUM para os nomes dos estados. Eu decidi não usar apenas para a implementação no momento ter ficado mais simples de mudanças rápidas, mas provavelmente em algum momento eu os colocarei.
theguitarmester
theguitarmester

Games Ranking : Nota B

Notas recebidas : B
Data de inscrição : 28/02/2012
Reputação : 111
Número de Mensagens : 2055
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Plataformas :
  • Unity


Ver perfil do usuário http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por vinians Qui 02 Jul 2020, 22:31

A questão é que nós (pessoas) ativamos os inputs através de coisas que vemos visualmente, mas uma IA não vai agir pelo visual (poderia até fazer assim, mas não sei se acabaria o jogo até 2022 hue), então ela tem que ter uma forma melhor de 'enxergar' aonde estão as coisas, e qual o estado dela. 
Cara, isso é fantastico, sempre penso isso ai, tipo o que um personagem do jogo "vê", tipo como se ele tivesse vida as vezes eu analiso assim também, pense que o doido fosse somente eu hahahah, tipo "tron" :-)

_________________

Games e Engines ? Aqui!
Siga-me no Twiter @vinians
Alguns dos meus jogos
Também crio músicas para jogos
Meu blog sobre assuntos diversos
* Leia as Regras do Fórum
vinians
vinians

Games Ranking : Nota B

Notas recebidas : B-C-A-C
Data de inscrição : 18/09/2008
Reputação : 87
Número de Mensagens : 2713
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4
  • Game Maker Studio 2.0
  • Construct 2
  • Java
  • C#
  • Javascript
  • C ou C++
  • Outros


Ver perfil do usuário https://vinians.itch.io

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por theguitarmester Qui 02 Jul 2020, 23:02

@Vinians haha
Poisé, pra uma 'IA' de Mário da vida, em geral os bichos não tem praticamente interação com o Player, eles existindo ou não, a movimentação deles seriam as mesmas (tirando alguns inimigos como o 'jogador de beisebol'), mas quanto mais tu vai aproximando a mecânica do inimigo a do player, mais ele vai tendo que ter alguma forma de 'ver o mundo', e a maneira mais fácil pra se fazer isso é com informações de controle que o player não tem (e mesmo se tivesse, não seria tão relevante muitas, porque tu consegue visualmente ver).
É um desafio criar uma IA boa mas também é um processo bem bacana, quando tu consegue estabelecer uma boa base lógica pra trabalhar em cima, e uma base boa é usar máquina de estado e ter o comportamento bem abstraido, organizado, não misturar papéis.
theguitarmester
theguitarmester

Games Ranking : Nota B

Notas recebidas : B
Data de inscrição : 28/02/2012
Reputação : 111
Número de Mensagens : 2055
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Plataformas :
  • Unity


Ver perfil do usuário http://guitarmester.no.comunidades.net/index.php?pagina=19362978

moisesBR gosta desta mensagem

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por moisesBR Dom 05 Jul 2020, 18:42

Pessoal. Ainda nao consegui entender completamente essas maquinas. Mas tenho observado o qual util elas sao.

Tenho certa difjculdade para compreender algo. E me recuso usar algo qye eu nao entenda o funcionamento como usar uma engine pronta para fazer um game.

Sei que aqui nao é o local adequado, mas estou aproveitando a oportunidade, ha que tocaram no assunto.

Tem como simplificar ao naximo o uso dessa tal maquina?

Tipo: eu quero fazer eu mesmo do zero com minhas proprias nomenclaturas E etc!
Exemplo: quero usar uma maquina rao simplificada que usaria no máximo uns 3 estados!
E no caso no create as vars, no estepe as acoes basicas e mínimas e etc.

Porventura esses estados sao variaveis ou o que?
Apenas scripts? Tipo estou tentando criar minha versao de maquina nos steps usando variáveis definidas no create.

Nas estou encontrando entraves que travam outras coisas e etc.

Eu li, reli, vou ler de novo, mas nao entra na cachola desse velho careca de 44 anos.
Nas bao desisto sei que vou conseguir.
moisesBR
moisesBR

Data de inscrição : 24/10/2009
Reputação : 15
Número de Mensagens : 880
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por vinians Seg 06 Jul 2020, 09:15

Olá Moises, como vai ?
As máquinas de estado finito (Finite State Machines) são um algoritmo usado bastante pra fazer jogos é ótimo que você tenha interesse.
Mas pra te dar uma dica, não se baseie na implementação acima, ela está ótima mas está complexa pra você entender, e na verdade é bem simples.

Seria melhor você procurar na internet por "Finite State Machine" que existem várias expliações bem simples lá. Mas no modo mais básico que uso seria você declarar uma variavel no create por exemplo:
Código:

state = 1; // estado inicial da maquina

Neste caso o estado inicia com 1 que pode representar qualquer coisa para este objeto. Mas assim que certas condições forem atendidas ela muda de estado. Você pode usar enums para dar nome a cada estado fica mais fácil que simplesmente 1, ou usar uma string mesmo, nada impede.

 Por exemplo, como você faria um código de um inimigo patrulhando um local ?  Poderia ser assim:
No estado 1 ele está de um lado para o outro, so faz isso.
Mas quando ele "vê" o player ele muda para o estado 2 que é "perseguição" essa seria a condição de mudança do estado 1 (patrulha) para o 2 (perseguição), e poderia ter um terceiro (ataque).
Depois ele correndo atras do player ele vê que o player está muito longe e desiste, assim ele volta para o estado 1 e o ciclo se inicia. 
Viu como a maquina de estados separa as coisas ? Isso facilita muito a criação de AI simples.

Qualquer coisa posta ai!

_________________

Games e Engines ? Aqui!
Siga-me no Twiter @vinians
Alguns dos meus jogos
Também crio músicas para jogos
Meu blog sobre assuntos diversos
* Leia as Regras do Fórum
vinians
vinians

Games Ranking : Nota B

Notas recebidas : B-C-A-C
Data de inscrição : 18/09/2008
Reputação : 87
Número de Mensagens : 2713
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4
  • Game Maker Studio 2.0
  • Construct 2
  • Java
  • C#
  • Javascript
  • C ou C++
  • Outros


Ver perfil do usuário https://vinians.itch.io

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por moisesBR Seg 06 Jul 2020, 11:45

Exatamente o que estou fazendo!
O que me deixava caduco era essa tal FMS.
Mas andei fazendo uns teste, e de certa forma usei essa estrategia de estados. So me confundia pq n sabia o q era esses estados. Se era variáveis, scripts ou outra coisa.
Descobri ou acredito que sao mesmo variáveis.
Eu costumava ate recententemente usar
Situacao="acao". E usava isso no draw para ver/debugar o q tava rolando. Mas dwscobri que o sistema nao obedece!
Entao voltei a usar variaveis para cada situação.

Acho que vou criar um topico pra isso.
Como estou sem internet no pc, ta complicado mas vou tentar.
E questao de honra concluir nao so esse mas outros varios projetos que tenho.

moisesBR
moisesBR

Data de inscrição : 24/10/2009
Reputação : 15
Número de Mensagens : 880
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por theguitarmester Ter 07 Jul 2020, 22:17

eae,

Bom, é como comentei no post do meu jogo sobre como estava fazendo no início, que se tratava de uma 'míni máquina de estado', máquina de estado fake, ou controle de estado hehe, chame como quiser hue

A vantagem de tu fazer uma máquina de estado em que ela troca o estado, é que tu consegue facilmente ter eventos de start e end do state, porém controlar o estado direto por um switch é uma abordagem boa também, e acho que tu só precisa mudar pra uma maquina de estados, quando começar a se sentir desconfortável controlando o estado só por switch. Foi o que eu fiz tanto para o estado de comportamento, quanto o de IA do meu jogo, primeiro fiz utilizando uma variável de estado e um switch, e depois criei/utilizei essa do script aí.

Como o @Vinians já explicou bem, mas então só complementando, uma maneira bem simples seria controlar o comportamento de alguma coisa, desse modo:

Código:
estado = "parado"

Código:
switch estado {
case "movimento": hspeed=dirHorizontal; vspeed=dirVertical; break;
case "ataque": atacar(); break;
}

tu pode, mas não é necessário, criar outro switch só pra tratar daí as mudanças de estado, por exemplo:

Código:
switch estado {
case "movimento": if (atk) estado = "ataque";break;
case "ataque": if (!atk) estado = "movimento"; break;
}
theguitarmester
theguitarmester

Games Ranking : Nota B

Notas recebidas : B
Data de inscrição : 28/02/2012
Reputação : 111
Número de Mensagens : 2055
Prêmios : Máquina de estado/State Machine no Unity Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Plataformas :
  • Unity


Ver perfil do usuário http://guitarmester.no.comunidades.net/index.php?pagina=19362978

moisesBR gosta desta mensagem

Voltar ao Topo Ir em baixo

Máquina de estado/State Machine no Unity Empty Re: Máquina de estado/State Machine no Unity

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum