ऐनिमेशन सिर्फ़ बोन हिलाने से कहीं ज़्यादा कर सकते हैं। ऐनिमेशन के किसी भी पल पर आप पार्टिकल निकाल सकते हैं, साउंड बजा सकते हैं, कोई variable बदल सकते हैं, या एक कमांड भी चला सकते हैं। इस गाइड में हमारे Ruby golem के हर कदम पर लाल चमक निकलेगी और भारी धमक सुनाई देगी, और बुरी तरह घायल होने पर वह गुस्से में आ जाएगा।
यह गाइड एंटिटी ऐनिमेशन और ऐनिमेशन कंट्रोलर पर आगे बढ़ती है।
फ़ाइलें
RP/
animations/
ruby_golem.animation.json
entity/
ruby_golem.entity.json
models/
entity/
ruby_golem.geo.json
BP/
animations/
ruby_golem.animation.json
animation_controllers/
ruby_golem.animation_controllers.json
entities/
ruby_golem.jsonहाँ, बिहेवियर पैक में भी ऐनिमेशन हो सकते हैं। भाग 3 में बताया गया है कि क्यों।
कौन सा पैक क्या कर सकता है
| इवेंट | रिसोर्स पैक | बिहेवियर पैक |
|---|---|---|
पार्टिकल (particle_effects) | हाँ | नहीं |
साउंड (sound_effects) | हाँ | नहीं |
Molang, जैसे variable.x = 1; | हाँ | हाँ |
कमांड, जैसे /say hi | नहीं | हाँ |
एंटिटी इवेंट्स, जैसे @s wiki:enrage | नहीं | हाँ |
सीधा नियम: रिसोर्स पैक हर खिलाड़ी की स्क्रीन पर दिखने और सुनाई देने वाली चीज़ों के लिए है। बिहेवियर पैक गेम में असली बदलावों के लिए है, जो सबके लिए एक जैसे होते हैं।
भाग 1: पार्टिकल
पार्टिकल को एक छोटा नाम दें
क्लाइंट एंटिटी उन पार्टिकल की लिस्ट रखती है जिन्हें मॉब इस्तेमाल कर सकता है, हर एक का एक छोटा नाम होता है:
"particle_effects": {
"sparkle": "wiki:ruby_sparkle",
"dust": "minecraft:villager_happy"
}दाईं तरफ़ किसी पार्टिकल इफ़ेक्ट का identifier है। यह vanilla वाला भी हो सकता है या आपका खुद बनाया हुआ भी (देखें पार्टिकल)।
इसे ऐनिमेशन से निकालें
ऐनिमेशन में particle_effects जोड़ें। keys सेकंड में समय हैं, बिल्कुल keyframes की तरह:
"animation.ruby_golem.walk": {
"loop": true,
"animation_length": 1.0,
"bones": { },
"particle_effects": {
"0.0": { "effect": "sparkle", "locator": "left_foot" },
"0.5": { "effect": "sparkle", "locator": "right_foot" }
}
}हर बार जब walk ऐनिमेशन loop होता है, पहले बाएँ पैर के नीचे चमक दिखती है, फिर दाएँ पैर के नीचे।
| फ़ील्ड | यह क्या करता है |
|---|---|
effect | क्लाइंट एंटिटी वाला छोटा नाम। ज़रूरी है। |
locator | मॉडल पर पार्टिकल कहाँ से शुरू होगा। इसे छोड़ दें तो मॉब की पोज़िशन इस्तेमाल होगी। |
bind_to_actor | false होने पर पार्टिकल मॉब के साथ चलने के बजाय दुनिया में वहीं रहता है |
pre_effect_script | Molang जो पार्टिकल शुरू होने से ठीक पहले चलता है, ताकि वे variables सेट हो सकें जिन्हें पार्टिकल पढ़ता है |
एक ही समय पर कई पार्टिकल निकालने के लिए लिस्ट इस्तेमाल करें: "0.0": [ { ... }, { ... } ]।
लोकेटर
लोकेटर आपके मॉडल के किसी बोन के अंदर एक नाम वाला पॉइंट होता है। इन्हें geometry फ़ाइल में जोड़ें:
{
"name": "left_leg",
"parent": "body",
"pivot": [3, 12, 0],
"locators": {
"left_foot": [3, 0, 0]
},
"cubes": [ ]
}क्योंकि लोकेटर एक बोन में होता है, बोन हिलने पर वह भी हिलता है। left_foot पर बना पार्टिकल झूलते पैर के साथ चलता है।
भाग 2: साउंड
साउंड भी इसी तरह काम करते हैं। पहले, क्लाइंट एंटिटी में छोटे नाम:
"sound_effects": {
"thud": "mob.wiki.ruby_golem.step"
}दाईं तरफ़ RP/sounds/sound_definitions.json से एक sound event का नाम है। फिर ऐनिमेशन में sound_effects जोड़ें:
"sound_effects": {
"0.0": { "effect": "thud" },
"0.5": { "effect": "thud" }
}हर साउंड एंट्री में effect और एक optional locator होता है, बिल्कुल पार्टिकल की तरह।
क़दमों की आवाज़ सही समय पर
साउंड keys को उन पलों पर रखें जब आपके ऐनिमेशन में पैर ज़मीन को छूता है। अगर walk में query.modified_distance_moved के साथ anim_time_update इस्तेमाल हुआ है, तो क़दम अपने आप golem के साथ तेज़ और धीमे होंगे।
कंट्रोलर स्टेट से
कंट्रोलर स्टेट्स में भी particle_effects और sound_effects हो सकते हैं। इनमें समय नहीं होता, क्योंकि स्टेट की कोई timeline नहीं होती। इसके बजाय ये तब शुरू होते हैं जब मॉब उस स्टेट में प्रवेश करता है:
"alert": {
"animations": ["fists_up"],
"particle_effects": [{ "effect": "sparkle", "locator": "head" }],
"sound_effects": [{ "effect": "roar" }],
"transitions": [{ "idle": "!query.has_target" }]
}टाइमलाइन
पार्टिकल और साउंड के अलावा, ऐनिमेशन में एक timeline भी हो सकती है: तय समय पर चलने वाली चीज़ों की लिस्ट। रिसोर्स पैक में timeline Molang चलाती है:
"animation.ruby_golem.blink": {
"animation_length": 4.0,
"loop": true,
"timeline": {
"0.0": "variable.eyes_closed = 0;",
"3.8": "variable.eyes_closed = 1;"
}
}हर चार सेकंड में golem एक पल के लिए आँखें बंद करता है। कोई रेंडर कंट्रोलर variable.eyes_closed पढ़कर अलग texture दिखा सकता है या आँखों के बोन छिपा सकता है (देखें रेंडर कंट्रोलर)।
एक key में एक string या strings की लिस्ट हो सकती है: "1.0": ["variable.a = 1;", "variable.b = 2;"]।
भाग 3: बिहेवियर पैक ऐनिमेशन
अब आता है मज़ेदार हिस्सा। सर्वर भी ऐनिमेशन और कंट्रोलर चला सकता है। वह बोन नहीं हिला सकता (सर्वर के पास हिलाने के लिए कोई मॉडल नहीं होता), लेकिन timelines और कंट्रोलर स्टेट्स चला सकता है। इससे ये आपके मॉब के अंदर एक छोटा सा scripting टूल बन जाते हैं, बिना किसी JavaScript के।
बिहेवियर पैक में इवेंट्स तीन तरह के हो सकते हैं:
| इवेंट string | यह क्या करता है |
|---|---|
"/say Hello" | एक कमांड चलाता है, जैसे मॉब ने खुद टाइप की हो। @s खुद मॉब है। |
"@s wiki:enrage" | मॉब की अपनी events लिस्ट से एक इवेंट चलाता है |
"variable.rage = 1;" | Molang चलाता है |
एंटिटी इवेंट्स सिर्फ़ मॉब को ही target कर सकते हैं, इसलिए हमेशा @s के बाद इवेंट का नाम आता है।
स्टेप 1: health पर नज़र रखने वाला कंट्रोलर
चलिए golem को ऐसा बनाते हैं कि उसकी health 20 से नीचे जाने पर वह गुस्से में आ जाए, और ठीक होने पर फिर शांत हो जाए:
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.ruby_golem.rage": {
"initial_state": "calm",
"states": {
"calm": {
"transitions": [
{ "enraged": "query.health < 20" }
]
},
"enraged": {
"on_entry": [
"/say The ruby golem is cracking!",
"/particle minecraft:lava_particle ~ ~1 ~",
"@s wiki:enrage"
],
"on_exit": [
"@s wiki:calm_down"
],
"transitions": [
{ "calm": "query.health >= 20" }
]
}
}
}
}
}on_entry लिस्ट एक बार चलती है जब golem enraged में प्रवेश करता है। कमांड golem की जगह से चलती हैं, इसलिए ~ ~1 ~ का मतलब है उससे एक ब्लॉक ऊपर।
स्टेप 2: बार-बार चलने वाला timer ऐनिमेशन
Loop होने वाला बिहेवियर पैक ऐनिमेशन एक काम का timer है। यह वाला हर 10 सेकंड के loop की शुरुआत में golem को थोड़ा heal करता है:
{
"format_version": "1.10.0",
"animations": {
"animation.ruby_golem.regen": {
"loop": true,
"animation_length": 10.0,
"timeline": {
"0.0": "/effect @s regeneration 3 0 true"
}
}
}
}स्टेप 3: इन्हें एंटिटी में चालू करें
बिहेवियर पैक की एंटिटी फ़ाइल में, इन्हें description के नीचे लिखें और scripts.animate से चलाएँ, बिल्कुल वैसे ही जैसे क्लाइंट एंटिटी करती है:
{
"format_version": "1.21.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:ruby_golem",
"is_spawnable": true,
"is_summonable": true,
"animations": {
"rage": "controller.animation.ruby_golem.rage",
"regen": "animation.ruby_golem.regen"
},
"scripts": {
"animate": ["rage", "regen"]
}
},
"component_groups": {
"wiki:enraged": {
"minecraft:movement": { "value": 0.35 },
"minecraft:attack": { "damage": 12 }
}
},
"components": { },
"events": {
"wiki:enrage": {
"add": { "component_groups": ["wiki:enraged"] }
},
"wiki:calm_down": {
"remove": { "component_groups": ["wiki:enraged"] }
}
}
}
}अब घायल golem तेज़ चलता है और ज़्यादा ज़ोर से मारता है, और जैसे ही regeneration उसकी health को 20 से ऊपर ले आता है, वह फिर सामान्य हो जाता है।
कमांड बहुत बार चलती हैं
on_entry में रखी कमांड हर बार चलती है जब स्टेट में प्रवेश होता है, और दुनिया के हर golem के लिए। बीस golem स्टेट बदलें तो बीस /say मैसेज आएँगे। चैट वाली कमांड सिर्फ़ टेस्टिंग के लिए रखें और तैयार ऐड-ऑन में शांत कमांड इस्तेमाल करें।
जब कुछ गड़बड़ हो
| आपको क्या दिखता है | सबसे संभावित कारण |
|---|---|
| कोई पार्टिकल नहीं | छोटा नाम क्लाइंट एंटिटी के particle_effects में नहीं है, या पार्टिकल identifier गलत है |
| पार्टिकल लोकेटर के बजाय मॉब के पैरों पर दिखते हैं | लोकेटर के नाम में typo है या वह किसी दूसरे बोन में है |
| कोई साउंड नहीं | sound event का नाम sound_definitions.json में मौजूद नहीं है |
| रिसोर्स पैक में कमांड कुछ नहीं करती | कमांड सिर्फ़ बिहेवियर पैक ऐनिमेशन में काम करती हैं |
| बिहेवियर पैक कंट्रोलर कभी नहीं चलता | यह description.animations में है लेकिन description.scripts.animate में नहीं |
@s wiki:enrage कुछ नहीं करता | इवेंट एंटिटी के events में नहीं है, या उसके नाम में typo है |
और मदद Troubleshooting में है।
आगे क्या
- timeline से चलाई जा सकने वाली कमांड कमांड में सीखें।
- अपने खुद के इफ़ेक्ट पार्टिकल में बनाएँ।
- health, targets और बहुत कुछ Molang queries से पढ़ें।