Share via


Einführung in das Verhalten von Objekten

In diesem Tutorial wird Folgendes beschrieben:

  • Erstellen und Verwenden von Verhaltensdateien zum Ändern des Verhaltens eines Objekts
  • Verwenden von Komponenten zum Erweitern des Verhaltens eines Objekts
  • Verwenden von Ereignissen zum Ändern aktiver Komponenten basierend auf einer Bedingung

Voraussetzungen

Es wird empfohlen, vor Beginn dieses Tutorials Folgendes abzuschließen:

Einführung

Verhaltensdateien in Minecraft: Bedrock Edition ermöglichen uns, anzupassen, wie sich ein Objekt verhält und mit der Welt interagiert. Sie sind Teil von Verhaltenspaketen, aber Verhaltenspakete können auch andere Dateitypen wie Funktionen und Beutetabellen enthalten.

Verhaltensdateien wurden zusammen mit Add-Ons eingeführt, um das Verhalten von Vanilla-Objekten anzupassen. Komponenten wurden erstellt, um die zuvor fest eingebaute Mechanik einzelner Kreaturen in kleine Teile aufzuteilen, die von Erstellern verwendet werden konnten, um Objekte anzupassen. Zum Beispiel wurde die Zähmungsmechanik für Katzen und Hunde in die tameable-Komponente übertragen, so dass Ersteller auch andere Objekte zähmbar machen konnten.

Dabei ging es darum, jede einzelne Mechanik von Objekten im Laufe der Jahre anpassbar zu machen.

Als „Objekt hinzufügen“ eingeführt wurde, wurden Verhaltensdateien zu einer Möglichkeit, neue Objekte von Grund auf zu erstellen, die die Komponenten aus Vanilla-Objekten verwenden.

Es gibt zwei Möglichkeiten, Verhaltensdateien zu verwenden:

  • Modifizieren von Vanilla-Objekten. Seit der Einführung von „Objekt hinzufügen“ sollte dies nur für kleinere Anpassungen am Vanilla-Spiel verwendet werden, nicht zur Erstellung zusätzlicher Inhalte.
  • Erstellen benutzerdefinierter Objekte. Verhaltensdateien dienen als Grundlage für benutzerdefinierte Objekte.

Formatübersicht

Verhaltensdateien für Objekte werden im entities-Ordner deines Verhaltenspakets gespeichert. Das Spiel lädt alle Dateien in diesen Ordner, so dass du Unterordner verwenden kannst, um deine Objekte zu verwalten. Die Dateien verwenden die Erweiterung .json. Diese Erweiterung wird von vielen Dateien in Add-Ons verwendet. Wenn du Verwirrung vermeiden möchtest, kannst du die erweiterte Endung .behavior.json speziell für Verhaltensdateien verwenden. Andere erweiterte Endungen findest du in dieser Tabelle.

Die Dateien sind in JSON geschrieben und die Grundstruktur sieht wie folgt aus:

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

Innerhalb des description-Tags definieren einige grundlegende Eigenschaften, wie das Spiel das Objekt registriert:

Parametername Typ Beschreibung
identifier Zeichenfolge Bezeichner des Objekts. Wenn es sich um ein benutzerdefiniertes Objekt in einem Add-On handelt, solltest du einen benutzerdefinierten eindeutigen Namespace verwenden, wie im Beispiel gezeigt.
runtime_identifier Zeichenfolge Bezeichner, der intern vom Spiel verwendet wird. Dies kann verwendet werden, um benutzerdefinierte Mechaniken von Vanilla-Objekten zu übernehmen, die noch nicht als Komponente verfügbar sind. Pro Objekt darf nur ein Laufzeitbezeichner angegeben werden Verwende dies nur, wenn es wirklich notwendig ist. Wenn die Mechanik eines Vanilla-Objekts in Komponenten umgewandelt wird, kann Funktionalität verloren gehen, wenn du diese Mechanik über einen Laufzeitbezeichner beziehst.
is_spawnable Boolesch Bei true wird dem Kreativmodusinventar ein Spawn-Ei für das Objekt hinzugefügt.
is_summonable Boolesch Bei true kann das Objekt mit dem /summon-Befehl aufgerufen werden.
is_experimental Boolesch Bei true kann das Objekt experimentelle Funktionen verwenden. Das Objekt funktioniert dann nur in experimentellen Welten. Marketplace-Inhalte können nicht veröffentlicht werden, wenn diese Option aktiviert ist.
animations Objekt Eine Liste von Verhaltensanimationen oder Animationscontrollern. Diese können verwendet werden, um Befehle oder Ereignisse für das Objekt auszuführen.
scripts Objekt Skripts funktionieren ähnlich wie in Client-Objektdateien und können zum Abspielen von Verhaltensanimationen verwendet werden.

Komponenten und Komponentengruppen

Komponenten sind Eigenschaften oder Mechaniken, die du deinem Objekt hinzufügen kannst. Es gibt zwei Möglichkeiten, Komponenten hinzuzufügen: Direkt zum Komponenten-Tag oder mit einer Komponentengruppe.

  • Komponenten, die dem grundlegenden Komponenten-Tag hinzugefügt werden, sind immer aktiv, es sei denn, sie werden in einem Ereignis über eine Komponentengruppe entfernt.
  • Komponentengruppen sind Sätze von jeweils einer oder mehreren Komponenten, die standardmäßig nicht aktiv sind, aber durch Ereignisse aktiviert oder deaktiviert werden können. Dies kann beispielsweise verwendet werden, um eine Variante des Objekts zu erstellen, z.B. ein Baby.

In diesem Beispiel wird eine Komponentengruppe verwendet, um eine Babyvariante eines Objekts zu erstellen. Die im Hauptkomponentenabschnitt definierten Komponenten sind immer aktiv, während die Komponenten in der baby-Komponentengruppe nur aktiv sind, wenn diese Gruppe hinzugefügt wird.

{
    "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": {}
    }
}

Alle Minecraft-Komponenten verwenden den minecraft:-Namespace.

Fast alle Komponenten sind als JSON-Objekte definiert. Die meisten Komponenten beinhalten Optionen, die innerhalb des Objekts definiert werden können, einige Komponenten funktionieren jedoch ohne Optionen, wie im vorherigen Beispiel gezeigt.

Komponenten erlernen

Eine vollständige Liste der verfügbaren Komponenten findest du hier.

Eine gute Möglichkeit, mehr über eine Komponente zu erfahren und zu sehen, wie sie in der Praxis verwendet wird, besteht darin, sich die Verhaltensdateien der Standard-Minecraft-Objekte anzusehen. Du findest das neueste Standardverhaltenspaket immer unter dieser URL: https://aka.ms/behaviorpacktemplate.

Hinweis

Die Funktionsweise einer Komponente kann sich manchmal zwischen den Versionen ändern. Wenn also eine Komponente aus einem Vanilla-Objekt für dein Objekt nicht funktioniert, solltest du überprüfen, ob beide Dateien die selbe Formatversion verwenden. Es wird empfohlen, immer die neueste Version der Komponente zu verwenden, da sie möglicherweise verbessert wurde und Korrekturen enthalten kann.

Wichtige Komponenten

Komponentenname Optionen Beschreibung
minecraft:physics has_collision
has_gravity
Du benötigst diese Komponente für 99 % der benutzerdefinierten Objekte. Sie ermöglicht dem Objekt, auf dem Boden zu bleiben und auf Interaktionen und Schläge in einer Weise zu reagieren, die man es erwarten würde.
minecraft:scale value Legt die Skalierung des Objekts fest.
minecraft:collision_box width height Legt das Kollisionsfeld des Objekts fest. Nur width und height können geändert werden. Das Kollisionsfeld hat immer eine quadratische Grundfläche, die an den Weltachsen ausgerichtet ist.
minecraft:type_family family Legt eine Liste der Typfamilien fest, in denen sich das Objekt befindet. Typfamilien können durch andere Objekte getestet werden. So kann beispielsweise getestet werden, welchen Kreaturen gegenüber sie feindlich eingestellt sind.
minecraft:movement value Legt die Bewegungsgeschwindigkeit des Objekts fest. 0,25 ist die reguläre Geschwindigkeit der meisten Tiere in Minecraft.
minecraft:movement.basic Vgl. Dokumentation Ermöglicht dem Objekt, sich auf dem Boden zu bewegen.
minecraft:navigation.walk Vgl. Dokumentation Ermöglicht dem Objekt, gehend durch die Welt zu navigieren. Es gibt noch weitere andere Arten der Navigation, etwa das Schweben.
minecraft:is_baby
minecraft:is_ignited
minecraft:is_saddled
minecraft:is_sheared
minecraft:is_tamed
minecraft:is_illager_captain
:--- Diese Komponenten tun nichts von sich aus, können jedoch in Animationen, Animationscontrollern oder Rendercontrollern abgefragt werden, so dass du Animationen und andere visuelle Elemente des Objektverhaltens steuern kannst.
minecraft:variant
minecraft:mark_variant
minecraft:skin_id
value Diese Komponenten funktionieren wie die oben genannten. Anstatt nur einen Ein-/Aus-Zustand zu speichern, können sie jedoch einen ganzzahligen Wert speichern.

Prioritäten

Die Option priority kann für alle Verhaltenskomponenten (KI-Ziele) verwendet werden. 0 ist die höchste Priorität und die Standardpriorität aller Verhaltenskomponenten. Je höher die Zahl, umso niedriger die Priorität. Wenn das Objekt mit einem Verhalten mit niedriger Priorität beschäftigt ist und ein Verhalten mit hoher Priorität aktiviert wird, wechselt das Objekt sofort zu dem Verhalten mit höherer Priorität.

Im folgenden Beispiel hat die hurt_by_target-Komponente eine höhere Priorität. Wenn das Objekt beim Umhergehen angegriffen wird, greift sie den Angreifer sofort an.

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

Entfernen von Komponenten

Wenn eine Komponentengruppe von einem Objekt entfernt wird, wird auch die Wirkung der Komponenten entfernt. In den meisten Fällen verursacht dies keine Probleme. In manchen Fällen ist es jedoch wichtig zu berücksichtigen, dass sich Komponenten gegenseitig überschreiben. Daher wird durch das Entfernen einer Komponente nicht zum vorherigen Zustand dieser Komponente zurückgekehrt, und es wird nicht dieselbe Komponente aus einer anderen Komponentengruppe oder den Basiskomponenten verwendet. Stattdessen wird die Komponente vollständig entfernt und auf ihre Standardwerte zurückgesetzt.

Ein Beispiel: Nehmen wir an, du hast ein Objekt mit einem Maßstab von 2 definiert im grundlegenden components-Tag. Du fügst eine Babykomponentengruppe mit einer Skalierungskomponente hinzu, die den Maßstab auf 1.5 festlegt. Dadurch wird der Maßstab korrekt zu 1.5 aktualisiert. Jetzt entfernst du diese Komponentengruppe wieder. Anstatt zu 2 zurückzuwechseln, wird der Maßstab jetzt auf 1 zurückgesetzt. Dies geschieht, weil durch das Entfernen der Komponentengruppe auch die Skalierungskomponente vollständig entfernt wird. Der Maßstab wird auf den Standardwert von 1 zurückgesetzt.

Es gibt einige Komponenten, bei denen es wichtig ist, dies zu berücksichtigen:

  • Komponenten, die einen Wert des Objekts wie minecraft:scale, minecraft:collision_box oder minecraft:variant ändern
  • Listenkomponenten wie minecraft:interact, minecraft:environment_sensor oder minecraft:damage_sensor
  • Alle anderen Komponenten, die du möglicherweise mit unterschiedlichen Status wie etwa minecraft:rideable (unterschiedliche Sitzanzahl oder Positionen) haben möchtest.

Um dieses Verhalten zu vermeiden, musst du eine neue Komponentengruppe mit dem aktualisierten Status der Komponente hinzufügen. Im Fall des Skalierungsbeispiels kann dies so einfach sein wie die Verwendung von zwei verschiedenen Komponentengruppen für die verschiedenen Zustände, zwischen denen du wechseln kannst:

        "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"]}
            }
        }

Ereignisse

Ereignisse werden verwendet, um Komponentengruppen zu einem Objekt hinzuzufügen und davon zu entfernen. In diesem Beispiel wird eine alte Komponentengruppe entfernt, während zwei neue hinzugefügt werden:

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

Ereignisse können durch viele Komponenten ausgelöst werden, wie etwa minecraft:interact oder minecraft:environment_sensor, durch Verhaltensanimationen oder durch den Rufbefehl. Durch den folgenden Befehl wird das Objekt gespawnt, während das obige Ereignis ausgeführt wird.

/summon compass:example_entity ~ ~ ~ compass:example_event

Integrierte Ereignisse

Einige Ereignisse sind in Minecraft integriert und werden ausgeführt, wenn das Objekt unter bestimmten Bedingungen gespawnt wird.

Name des Ereignisses Beschreibung
minecraft:entity_born Das Ereignis wird ausgeführt, wenn das Objekt durch Zucht gespawnt wird.
minecraft:entity_spawned Das Ereignis wird immer dann ausgeführt, wenn das Objekt gespawnt wird. Beachte, dass dies nicht ausgeführt wird, wenn du es manuell durch /summon aufrufst.
minecraft:entity_transformed Das Ereignis wird ausgeführt, wenn ein anderes Objekt in dieses Objekt umgewandelt wird.
minecraft:on_prime Das Ereignis wird ausgeführt, wenn das Objekt „scharf geschaltet“ und bereit ist, zu explodieren.

Zufallsgeneratoren

Wenn du dafür sorgen möchtest, dass zufällig ausgewählt wird, welche Komponentengruppe einem Objekt hinzugefügt wird, kannst du dazu die Zufallsgeneratorfunktion verwenden. Dazu gibst du ein Array von Objekten an, von denen jedes Komponentengruppen hinzufügen und entfernen kann. Das Spiel wählt dann zufällig eines dieser Objekte aus und führt es aus.

Du kannst den Optionen auch eine Gewichtungsoption hinzufügen, um die Wahrscheinlichkeit jeder Option zu ändern. Alle Gewichtungen zusammen ergeben 100%. Im folgenden Beispiel wird das Objekt als Baby mit einer Wahrscheinlichkeit von 20% (1:4) gespawnt, während in den anderen Fällen keine Komponentengruppe hinzugefügt wird:

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

Sequenzen

Manchmal musst du mehrere Ereignisinstanzen nacheinander im selben Ereignis ausführen. Beispielsweise kann es sein, dass du zwei Aspekte des Objekts, etwa Farbe und Markierungsmuster, zufällig auswählen lassen möchtest. In solchen Fällen kannst du eine Sequenz verwenden. Sequenzen sind ähnlich wie Zufallsgeneratoren strukturiert, jedes Element in der Liste wird jedoch in der vorgegebenen Reihenfolge ausgeführt. Dies ist auch in Kombination mit Filtern sehr nützlich, was im folgenden Abschnitt beschrieben wird.

Sequenzen und Zufallsgeneratoren können unbegrenzt verschachtelt werden.

In diesem Beispiel wird die Gruppe initial hinzugefügt, wenn das Objekt gespawnt wird. Danach wird die Babykomponente wie im vorherigen Abschnitt per Zufallsgenerator ausgewählt.

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

Filter

Filter unterwerfen ein Ereignis oder einen Teil eines Ereignisses Bedingungen, indem sie eine bestimmte Eigenschaft des aktuellen Objekts – des interagierenden Objekts oder der Welt – prüfen. Filter können in jedem Ereignis verwendet werden, dies ist aber auch direkt in einigen Komponenten möglich.

Ein Ereignis besteht aus bis zu fünf Parametern. Die Parameter test und value sind erforderlich, die übrigen sind optional:

Testtyp Die zu testende Eigenschaft.
value Der zu testende Wert. Dies kann je nach Testart eine Zeichenfolge, eine Zahl oder ein boolescher Wert sein.
subject Das Objekt, für die der Test ausgeführt wird. Standardmäßig ist dies self, es kann sich aber auch um das andere Objekt handeln, das an einer Interaktion beteiligt ist.
operator Die Art und Weise, in der der Wert verglichen wird. Dies ist standardmäßig equals, es kann aber auch auf kleinere oder größere Werte (bei numerischen Werten) oder auf Ungleichheit getestet werden.
domain Dies wird nur von wenigen Tests verwendet, um zusätzlichen Kontext bereitzustellen, z.B. den Inventarslot beim has_equipment-Test.

Hinweis

Eine vollständige Liste der Filter und der Interaktionen dieser Parameter findest du im technischen Dokument „Objekte“.

Ein minimales Beispiel für einen Filter innerhalb eines Ereignisses könnte wie folgt aussehen: Die Komponentengruppe kann nur hinzugefügt werden, wenn das Objekt das Tag event_allowed hat.

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

Wenn du mehrere Filter verwenden möchtest, kannst du diese mithilfe der Listen all_of, any_of oder none_of gruppieren. Tests sind damit nur dann erfolgreich, wenn alle Filter darin, einer der Filter darin oder keiner der darin enthaltenen Filter erfolgreich waren/war. Diese Listen können unbegrenzt verschachtelt werden.

Im folgenden Beispiel fügen wir dem Filter eine zweite Bedingung hinzu. Das Ereignis wird nur ausgeführt, wenn das Objekt das Tag aus dem vorherigen Beispiel hat und weniger als 10 Blöcke vom nächsten Spieler entfernt ist.

"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"]
        }
    }
}

Wie geht es weiter?

Wenn du nicht weiter weist oder ein besseres Verständnis der Funktionsweise einer Komponente benötigst, kannst du dir immer die Vanilla-Verhaltensdateien ansehen, um gute funktionierende Beispiele zu erhalten. Ein Vanilla-Objekt „auseinanderzunehmen“ und auf ein anderes Objekt anzuwenden, ist ein guter Anfangspunkt. Nimm die minecraft:teleport-Komponente von einem Endermen und wende sie auf einen Creeper an. Sorge dafür, dass ein Zombie von einem Spieler geritten werden kann. Erstelle Baby-Creeper.

Das Komponentensystem ermöglicht es, anzupassen, was dein Objekt tut und wie es mit der Welt interagiert. Wenn du mehr über die Gestaltung des Erscheinungsbilds und der Bewegung deines Objekts erfahren möchtest, informiere dich dazu im Tutorial zum Thema Objektmodellierung und -animation.