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
oderminecraft:variant
ändern - Listenkomponenten wie
minecraft:interact
,minecraft:environment_sensor
oderminecraft: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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für