En aquest tema, explorarem dos conceptes fonamentals per a la programació d'intel·ligència artificial (IA) en Unity: les màquines d'estats (FSM) i els arbres de comportament. Aquests patrons de disseny són àmpliament utilitzats per gestionar el comportament dels personatges no jugadors (NPCs) i altres elements del joc.

Màquines d'Estats Finits (FSM)

Què és una Màquina d'Estats Finits?

Una màquina d'estats finits (FSM) és un model de computació que consisteix en un nombre finit d'estats, transicions entre aquests estats i accions. És una manera senzilla i efectiva de gestionar el comportament d'un NPC.

Components d'una FSM

  1. Estats: Representen les diferents condicions o modes en què pot estar un NPC.
  2. Transicions: Canvis d'un estat a un altre basats en condicions específiques.
  3. Accions: Operacions que es realitzen quan un NPC està en un estat determinat o quan es produeix una transició.

Exemple Pràctic

Imagina un NPC que pot estar en tres estats: Patrullant, Perseguint i Atacant.

public enum State {
    Patrolling,
    Chasing,
    Attacking
}

public class NPCController : MonoBehaviour {
    public State currentState;

    void Update() {
        switch (currentState) {
            case State.Patrolling:
                Patrol();
                if (SeePlayer()) {
                    currentState = State.Chasing;
                }
                break;
            case State.Chasing:
                Chase();
                if (InAttackRange()) {
                    currentState = State.Attacking;
                } else if (!SeePlayer()) {
                    currentState = State.Patrolling;
                }
                break;
            case State.Attacking:
                Attack();
                if (!InAttackRange()) {
                    currentState = State.Chasing;
                }
                break;
        }
    }

    void Patrol() {
        // Codi per patrullar
    }

    void Chase() {
        // Codi per perseguir
    }

    void Attack() {
        // Codi per atacar
    }

    bool SeePlayer() {
        // Codi per detectar el jugador
        return true; // Placeholder
    }

    bool InAttackRange() {
        // Codi per verificar si el jugador està a l'abast d'atac
        return true; // Placeholder
    }
}

Exercici Pràctic

Crea una FSM per a un NPC que pugui estar en els estats de "Idle", "Walking" i "Running". Implementa les transicions basades en la distància al jugador.

Arbres de Comportament

Què és un Arbre de Comportament?

Un arbre de comportament és una estructura jeràrquica que defineix una seqüència d'accions o comportaments que un NPC pot realitzar. És més flexible i escalable que una FSM, especialment per a comportaments complexos.

Components d'un Arbre de Comportament

  1. Nodes: Representen accions o decisions.
  2. Arrels: El node inicial de l'arbre.
  3. Fulles: Nodes terminals que no tenen fills.
  4. Sucursals: Nodes que tenen fills i defineixen la lògica de decisió.

Exemple Pràctic

Imagina un NPC que ha de decidir entre patrullar, perseguir o atacar basant-se en la distància al jugador.

public abstract class Node {
    public abstract bool Execute();
}

public class PatrolNode : Node {
    public override bool Execute() {
        // Codi per patrullar
        return true;
    }
}

public class ChaseNode : Node {
    public override bool Execute() {
        // Codi per perseguir
        return true;
    }
}

public class AttackNode : Node {
    public override bool Execute() {
        // Codi per atacar
        return true;
    }
}

public class SelectorNode : Node {
    private List<Node> children = new List<Node>();

    public void AddChild(Node child) {
        children.Add(child);
    }

    public override bool Execute() {
        foreach (Node child in children) {
            if (child.Execute()) {
                return true;
            }
        }
        return false;
    }
}

public class NPCController : MonoBehaviour {
    private Node rootNode;

    void Start() {
        rootNode = new SelectorNode();
        ((SelectorNode)rootNode).AddChild(new AttackNode());
        ((SelectorNode)rootNode).AddChild(new ChaseNode());
        ((SelectorNode)rootNode).AddChild(new PatrolNode());
    }

    void Update() {
        rootNode.Execute();
    }
}

Exercici Pràctic

Crea un arbre de comportament per a un NPC que pugui decidir entre "Idle", "Walking" i "Running" basant-se en la distància al jugador i altres condicions com la visibilitat.

Resum

En aquesta secció, hem après sobre les màquines d'estats finits (FSM) i els arbres de comportament, dos patrons de disseny essencials per a la programació d'IA en Unity. Les FSM són ideals per a comportaments senzills i ben definits, mentre que els arbres de comportament ofereixen més flexibilitat i escalabilitat per a comportaments complexos.

En el següent mòdul, explorarem tècniques avançades de física per millorar la interacció i el realisme en els nostres jocs.

Curs de Unity

Mòdul 1: Introducció a Unity

Mòdul 2: Programació Bàsica en Unity

Mòdul 3: Treballant amb Actius

Mòdul 4: Física i Col·lisions

Mòdul 5: Interfície d'Usuari (UI)

Mòdul 6: Àudio en Unity

Mòdul 7: Programació Avançada

Mòdul 8: Física Avançada i IA

Mòdul 9: Optimització i Rendiment

Mòdul 10: Publicació i Més Enllà

© Copyright 2024. Tots els drets reservats