Condividi tramite


Introduzione al comportamento delle entità

In questo tutorial imparerai quanto segue:

  • Come creare e utilizzare i file di comportamento per modificare il comportamento di un’entità.
  • Come utilizzare i componenti per espandere il comportamento di un’entità.
  • Come utilizzare gli eventi per modificare i componenti attivi in base a determinate condizioni.

Requisiti

Prima di iniziare questo tutorial, ti consigliamo di completare i seguenti passaggi.

Introduzione

I file di comportamento in Minecraft: Bedrock Edition ci consentono di personalizzare il comportamento di un’entità e il suo modo di interagire con il mondo. Tali file fanno parte dei pacchetti di comportamenti, i quali possono tuttavia contenere anche altri tipi di file, come per esempio funzioni e tabelle del bottino.

I file di comportamento sono stati introdotti per la prima volta insieme ai componenti aggiuntivi, per permettere di personalizzare il comportamento delle entità vanilla. I componenti sono stati creati per dividere in piccole parti la precedente meccanica a codifica fissa delle singole creature, utilizzabili dai creatori per personalizzare le entità. Ad esempio, la meccanica di addomesticamento di cani e gatti è stata trasferita al componente tameable, per permettere ai creatori di addomesticare anche altre entità.

L’obiettivo era quello di rendere personalizzabile negli anni ogni singola meccanica delle entità.

Quando è stata introdotta l'opzione Aggiungi entità, i file di comportamento hanno permesso di creare da zero nuove entità utilizzando tutti i componenti delle entità vanilla.

I file di comportamento possono essere utilizzati in due modi:

  • Per modificare le entità vanilla. L'introduzione dell'opzione Aggiungi entità è stata pensata esclusivamente per apportare piccole modifiche al gioco vanilla, e non ai contenuti aggiuntivi.
  • Per creare entità personalizzate. I file di comportamento fungono da base per le entità personalizzate.

Panoramica del formato

I file di comportamento delle entità vengono salvati nella cartella entities del tuo pacchetto di comportamenti. Il gioco carica tutti i file in quella cartella, in modo da poter utilizzare le sottocartelle per gestire le tue entità. I file usano l’estensione .json. Questa estensione è utilizzata da molti file all’interno dei componenti aggiuntivi, quindi, per evitare di confonderti, puoi utilizzare l’estensione estesa .behavior.json specifica per i file di comportamento. Per altre estensioni estese, consulta questa tabella.

I file sono scritti in JSON e la struttura di base ha questo aspetto:

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {},
        "component_groups": {},
        "events": {}
    }
}

Alcune proprietà di base all'interno del tag description definiscono in che modo il gioco registra l’entità:

Nome del parametro Tipo Descrizione
identifier Stringa Identificatore dell’entità. Se si tratta di un’entità personalizzata in un componente aggiuntivo, è necessario utilizzare un unico namespace personalizzato come mostrato nell’esempio.
runtime_identifier Stringa Identificatore utilizzato internamente dal gioco. Si può utilizzare per ereditare meccaniche personalizzate da entità vanilla non ancora disponibili come componenti. È possibile specificare un solo identificatore di runtime per ciascuna entità. Usalo solo se è veramente necessario. Se le meccaniche di un’entità vanilla vengono trasformate in componenti, affidarsi a esse tramite un identificatore di runtime potrebbe causare una perdita di funzionalità.
is_spawnable Booleano Se è true, viene aggiunto un uovo per l’entità all’inventario in modalità Creativa.
is_summonable Booleano Se è true, l’entità può essere convocata utilizzando il comando /summon.
is_experimental Booleano Se è true, l’entità può utilizzare funzionalità sperimentali. L’entità funzionerà solo in mondi sperimentali. I contenuti del marketplace non possono essere inviati se questa opzione è abilitata.
animations Oggetto Elenco di animazioni di comportamenti o controller di animazione. Possono essere usati per eseguire comandi o eventi sull’entità.
scripts Oggetto Gli script funzionano in modo simile ai file di entità client e possono essere utilizzati per riprodurre animazioni di comportamento.

Componenti e gruppi di componenti

I componenti sono proprietà o meccaniche che puoi aggiungere alla tua entità. Ci sono due modi per aggiungere componenti: direttamente al tag del componente o mediante un gruppo di componenti.

  • I componenti aggiunti alla base del tag del componente sono sempre attivi, a meno che non vengano rimossi mediante un gruppo di componenti in un evento.
  • I gruppi di componenti sono insiemi di uno o più componenti non attivi per impostazione predefinita, quali possono però essere abilitati o disabilitati mediante eventi. Ad esempio, si possono utilizzare per creare una variante dell’entità, come un bambino.

In questo esempio, viene utilizzato un gruppo di componenti per creare una variante bambino dell’entità. I componenti definiti nella sezione dei componenti principali sono sempre attivi, mentre i componenti nel gruppo di componenti baby sono attivi solo quando viene aggiunto quel determinato gruppo.

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {
            "minecraft:physics":{}
        },
        "component_groups": {
            "baby": {
               "minecraft:behavior.follow_parent": {},
               "minecraft:is_baby": {}
            }
        },
        "events": {}
    }
}

Tutti i componenti di Minecraft utilizzano il namespace minecraft:.

Quasi tutti i componenti sono definiti come oggetto JSON. La maggior parte dei componenti dispone di opzioni specificabili all’interno di questo oggetto, ma alcuni componenti funzionano senza opzioni, come mostrato nell’esempio precedente.

Come conoscere i componenti

Un elenco completo dei componenti è disponibile qui.

Un buon modo per conoscere un componente e scoprirne l'utilizzo pratico è quello di consultare i file di comportamento delle entità Minecraft predefinite. Puoi sempre trovare l’ultimo pacchetto di comportamenti predefinito a questo URL: https://aka.ms/behaviorpacktemplate.

Nota

A volte, il modo in cui funziona un componente può variare a seconda delle versioni. Quindi, se un componente di un’entità vanilla non funziona sulla tua entità, controlla se entrambi i file utilizzano la stessa versione del formato. Ti invitiamo a utilizzare sempre l’ultima versione del componente, poiché è stata perfezionata e potrebbe includere correzioni.

Componenti essenziali

Nome del componente Opzioni Descrizione
minecraft:physics has_collision
has_gravity
Avrai bisogno di questo componente sul 99% delle entità personalizzate. Permette all’entità di rimanere a terra e reagire a interazioni e pugni nel modo in cui ti aspetteresti.
minecraft:scale value Imposta le dimensioni dell’entità.
minecraft:collision_box width height Imposta la casella di collisione dell’entità. Solo width e height possono essere modificati. La casella di collisione ha sempre una base quadrata allineata agli assi del mondo.
minecraft:type_family family Imposta un elenco di famiglie tipo in cui si trova l’entità. Le famiglie tipo possono essere testate da altre entità. Ad esempio, per testare con quali creature potrebbero nascere ostilità.
minecraft:movement value Imposta la velocità di movimento dell’entità. La maggior parte degli animali in Minecraft ha una velocità di 0,25.
minecraft:movement.basic Consulta la documentazione Consente all’entità di muoversi sul terreno.
minecraft:navigation.walk Consulta la documentazione Consente all’entità di esplorare il mondo camminando. Esistono anche altri modi di esplorare il mondo, ad esempio in volo.
minecraft:is_baby
minecraft:is_ignited
minecraft:is_saddled
minecraft:is_sheared
minecraft:is_tamed
minecraft:is_illager_captain
:--- Questi componenti non agiscono autonomamente, ma possono essere richiamati in animazioni, controller di animazione o controller di resa, consentendoti di controllare animazioni e altri elementi visivi dal comportamento dell’entità.
minecraft:variant
minecraft:mark_variant
minecraft:skin_id
value Questi componenti funzionano come quelli descritti sopra, ma, invece di memorizzare esclusivamente uno stato on/off, possono memorizzare un valore intero.

Priorità

L’opzione priority può essere utilizzata su tutti i componenti di comportamento (obiettivi AI). 0 è la priorità più alta e la priorità predefinita di tutti i componenti di comportamento. Più alto è il valore numerico, minore è la priorità. Se l’entità è impegnata a eseguire un comportamento a bassa priorità e si verifica un comportamento ad alta priorità, l’entità passerà immediatamente al comportamento con priorità più alta.

Nell’esempio seguente, il componente hurt_by_target ha una priorità più alta. Se l’entità viene attaccata mentre passeggia, essa mirerà immediatamente all'avversario.

"minecraft:behavior.random_stroll": {
    "priority": 4
},
"minecraft:behavior.hurt_by_target": {
    "priority": 1
}

Rimuovere i componenti

Quando un gruppo di componenti viene rimosso da un’entità, verrà rimosso anche l’effetto dei componenti. Nella maggior parte dei casi, ciò non causerà alcun problema. Tuttavia, in altri casi, sarà importante considerare che i componenti si sovrascrivono l’uno sull’altro. Pertanto, la rimozione di un componente non lo farà tornare allo stato precedente e non utilizzerà lo stesso componente di un altro gruppo di componenti o dei componenti di base. Il componente sarà invece rimosso completamente e ripristinato ai valori predefiniti.

Ecco un esempio: supponiamo che tu abbia un’entità con una grandezza di 2 definita nel tag di base components. Aggiungi un gruppo di componenti bambino con il componente della grandezza impostato su 1.5. Questo aggiornerà correttamente la grandezza a 1.5. Ora, rimuovi nuovamente quel gruppo di componenti. Invece di tornare a 2, la grandezza verrà ora reimpostata su 1. Ciò accade perché la rimozione del gruppo di componenti rimuoverà completamente anche il componente della grandezza. La grandezza verrà ripristinata al valore predefinito di 1.

Per alcuni componenti, è importante considerare il seguente punto:

  • Componenti che modificano un valore dell’entità come minecraft:scale, minecraft:collision_box o minecraft:variant.
  • Elenco di componenti come minecraft:interact, minecraft:environment_sensor o minecraft:damage_sensor
  • Qualsiasi altro componente di cui potresti volere a disposizione diversi stati, come minecraft:rideable (diverso numero di posti o posizioni).

Per evitare questo comportamento, è necessario aggiungere un nuovo gruppo di componenti con lo stato del componente aggiornato. Nel caso della grandezza, ciò può avvenire in maniera semplice, come per esempio quando si dispone di due diversi gruppi di componenti per i diversi stati selezionabili:

        "components": {
            "minecraft:scale":{
               "value": 2
            }
        },
        "component_groups": {
            "baby": {
               "minecraft:scale": {
                   "value": 1.5
               }
            },
            "adult": {
               "minecraft:scale": {
                   "value": 2
               }
            }
        },
        "events": {
            "set_baby":{
               "remove": {"component_groups": ["adult"]},
               "add": {"component_groups": ["baby"]}
            },
            "set_adult":{
               "remove": {"component_groups": ["baby"]},
               "add": {"component_groups": ["adult"]}
            }
        }

Eventi

Gli eventi vengono utilizzati per aggiungere e rimuovere gruppi di componenti dall’entità. In questo esempio, si rimuove un vecchio gruppo di componenti e se ne aggiungono due nuovi:

"events": {
    "compass:example_event": {
        "remove": {
            "component_groups": ["compass:group_a"]
        },
        "add": {
            "component_groups": ["compass:group_b","compass:group_c"]
        }
    }
}

Gli eventi possono essere attivati da molti componenti come minecraft:interact o minecraft:environment_sensor, dalle animazioni del comportamento o dal comando di convocazione. Il seguente comando genererà l’entità durante l’esecuzione dell’evento precedente.

/summon compass:example_entity ~ ~ ~ compass:example_event

Eventi integrati

Alcuni eventi sono integrati in Minecraft e vengono eseguiti se l’entità viene generata in determinate condizioni.

Nome dell’evento Descrizione
minecraft:entity_born L’evento viene eseguito quando l’entità viene generata tramite allevamento.
minecraft:entity_spawned L’evento viene eseguito ogni volta che l’entità viene generata. Nota che ciò non avviene se esegui manualmente /summon su di esso.
minecraft:entity_transformed L’evento viene eseguito quando un’altra entità si trasforma in questa entità.
minecraft:on_prime L’evento viene eseguito quando l’entità è innescata e pronta per esplodere.

Casualizzatori

Se vuoi aggiungere un gruppo di componenti all’entità in maniera casuale, puoi usare la funzione casualizza. Tu specifichi una serie di oggetti, ognuno dei quali può aggiungere e rimuovere gruppi di componenti, e il gioco sceglierà ed eseguirà casualmente uno di questi oggetti.

Si può scegliere aggiungere un’opzione di peso a quelle per modificare la probabilità di ciascuna opzione. Il totale dei pesi ammonta al 100%. Nell’esempio seguente, c'è una probabilità del 20% (da 1 a 4) che l'entità generata sarà un bambino, mentre negli altri casi non viene aggiunto alcun gruppo di componenti:

"events": {
    "minecraft:entity_spawned": {
        "randomize": [
            {
               "weight": 40
            },
            {
               "weight": 10,
               "add": {
                   "component_groups": ["baby"]
               }
            }
        ]
    }
}

Sequenze

A volte è necessario eseguire più istanze di eventi una dopo l’altra nello stesso evento. Ad esempio, potresti voler randomizzare due aspetti dell’entità, come il colore e il motivo. In questo caso, puoi usare una sequenza. Le sequenze sono strutturate in modo simile ai randomizzatori, ma ogni elemento nell’elenco viene eseguito in ordine. Questa funzione è molto utile anche se usata in combinazione con i filtri, che verranno descritti nella sezione seguente.

Le sequenze e i randomizzatori possono essere annidati in maniera indefinita.

In questo esempio, il gruppo initial verrà aggiunto quando l’entità viene generata. Successivamente, il componente bambino verrà randomizzato come nella sezione precedente.

        "events": {
            "minecraft:entity_spawned":{
               "sequence": [
                   {
                       "add": {
                           "component_groups": ["initial"]
                       }
                    },
                   {
                       "randomize": [
                           {
                               "weight": 40
                           },
                           {
                               "weight": 10,
                               "add": {
                                   "component_groups": ["baby"]
                               }
                           }
                       ]
                    }
               ]
            }
        }

Filtri

I filtri condizionano un evento o una parte di esso testando una proprietà specifica sull’entità corrente: quella che interagisce o il mondo. I filtri possono essere impiegati in qualsiasi evento, ma puoi anche usarli direttamente in alcuni componenti.

Un evento è composto da un massimo di cinque parametri. I parametri test e value sono obbligatori, gli altri facoltativi:

Tipo di test Proprietà da testare
value Il valore da testare. Si può trattare di una stringa durante il test delle stringhe, di un numero durante il test dei valori numerici, o di un valore booleano.
subject L’entità su cui viene eseguito il test. Per impostazione predefinita è self, ma può anche rivolgersi all’altra entità coinvolta in un’interazione.
operator Il modo in cui viene confrontato il valore. Per impostazione predefinita è equals, ma può anche servire a testare valori minori o maggiori (su valori numerici) o un'eventuale disuguaglianza.
domain Viene utilizzata solo da alcuni test per fornire un contesto aggiuntivo, come il vano dell’inventario da testare con il test has_equipment.

Nota

Un elenco completo dei filtri, e di come questi parametri interagiscono con essi, è disponibile nella scheda tecnica delle Entità.

Un esempio di filtro all’interno di un evento potrebbe essere il seguente: il gruppo di componenti può essere aggiunto solo se l’entità presenta il tag event_allowed.

"events": {
    "compass:example_event": {
        "filters": {
            "test": "has_tag",
            "value":"event_allowed"
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

Se desideri utilizzare più filtri, puoi raggrupparli utilizzando gli elenchi all_of, any_of o none_of: il test potrà considerarsi superato solo se tutti i filtri, uno dei filtri o nessuno dei filtri interni avranno superato il test. Questi elenchi possono essere nidificati in maniera indefinita.

Nell’esempio seguente, aggiungiamo una seconda condizione al filtro. L’evento verrà eseguito solo se l’entità ha il tag dell’esempio precedente e dista meno di 10 blocchi dal giocatore più vicino.

"events": {
    "compass:example_event": {
        "filters": {
            "all_of":[
               {"test": "has_tag", "value": "event_allowed"},
               {"test": "distance_to_nearest_player", "operator": "<", "value": 10}
            ]
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

E adesso?

Se non sai come proseguire o desideri comprendere meglio il funzionamento di un componente, potrai avvalerti di alcuni esempi pratici consultando il file di comportamento vanilla. Decostruire un’entità vanilla e applicarla a un’altra entità è un ottimo modo per iniziare. Prendi il componente minecraft:teleport di un Enderman e applicalo a un creeper. Rendi uno zombi cavalcabile dal giocatore. Crea creeper bambini.

Il sistema dei componenti ti consente di personalizzare le azioni della tua entità e il suo modo di interagire con il mondo. Se vuoi saperne di più in merito alla progettazione dell’aspetto e dei movimenti della tua entità, dai un’occhiata al tutorial sulla modellazione e l’animazione delle entità.