ऐनिमेशन मॉब को हिलाते हैं। रेंडर कंट्रोलर तय करता है कि मॉब किस चीज़ से बनाकर दिखाया जाए: कौन सा मॉडल, कौन सा texture और कौन सा material। यह मॉडल के हिस्से छिपा भी सकता है। इस गाइड में हमारे Ruby golem को तीन रत्न-रंग मिलेंगे और एक ताज जिसे वह कभी-कभी ही पहनता है।
रेंडर कंट्रोलर रिसोर्स पैक में रहते हैं। ऐनिमेशन की तरह, ये भी सिर्फ़ यह बदलते हैं कि मॉब कैसा दिखता है।
फ़ाइलें
RP/
entity/
ruby_golem.entity.json
render_controllers/
ruby_golem.render_controllers.json
textures/
entity/
ruby_golem/
red.png
pink.png
dark.pngक्या आपको इसकी ज़रूरत भी है?
कई मॉब का एक ही मॉडल और एक ही skin होता है। उनके लिए vanilla कंट्रोलर controller.render.default इस्तेमाल करें। यह क्लाइंट एंटिटी में default नाम वाली geometry, texture और material को दिखाता है, और आपको कोई फ़ाइल लिखनी नहीं पड़ती। आपका पहला कस्टम मॉब ठीक यही करता है।
आपको अपना रेंडर कंट्रोलर तब चाहिए जब:
- मॉब के पास चुनने के लिए कई textures हों, जैसे रंग या skins,
- मॉब का मॉडल बदलता हो, जैसे ऊन खो देने वाली भेड़,
- मॉडल के हिस्से दिखने या गायब होने चाहिए, जैसे काठी या armor,
- मॉब को किसी रंग में tint करना हो।
छोटे नाम क्लाइंट एंटिटी से आते हैं
रेंडर कंट्रोलर कभी file paths इस्तेमाल नहीं करता। वह वे छोटे नाम इस्तेमाल करता है जो आपने क्लाइंट एंटिटी में दिए थे, आगे एक prefix लगाकर:
| क्लाइंट एंटिटी में | रेंडर कंट्रोलर में |
|---|---|
"geometry": { "default": "geometry.wiki.ruby_golem" } | geometry.default |
"textures": { "red": "textures/entity/ruby_golem/red" } | texture.red |
"materials": { "default": "entity_alphatest" } | material.default |
तो texture.red का मतलब है "वह texture जिसे मैंने क्लाइंट एंटिटी में red नाम दिया था"।
स्टेप 1: सबसे सरल कंट्रोलर
रेंडर कंट्रोलर फ़ाइलें render_controllers फ़ोल्डर में जाती हैं:
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.ruby_golem": {
"geometry": "geometry.default",
"materials": [{ "*": "material.default" }],
"textures": ["texture.red"]
}
}
}तीन मुख्य हिस्से:
| फ़ील्ड | इसमें क्या होता है |
|---|---|
geometry | एक मॉडल। एक ही value, लिस्ट नहीं। |
materials | एक लिस्ट जो बोन्स को materials से जोड़ती है। * का मतलब है हर बोन। |
textures | textures की लिस्ट। ज़्यादातर मॉब को सिर्फ़ एक चाहिए। |
नाम controller.render. से शुरू होना चाहिए। फिर इसे क्लाइंट एंटिटी में लिखें:
"render_controllers": ["controller.render.ruby_golem"]स्टेप 2: तीन रत्न-रंग
अब मज़ेदार हिस्सा। पहले, तीनों textures क्लाइंट एंटिटी में लिखें:
"textures": {
"red": "textures/entity/ruby_golem/red",
"pink": "textures/entity/ruby_golem/pink",
"dark": "textures/entity/ruby_golem/dark"
}फिर इन्हें रेंडर कंट्रोलर में एक array में रखें और Molang से एक चुनें:
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.ruby_golem": {
"arrays": {
"textures": {
"array.gem_colors": [
"texture.red",
"texture.pink",
"texture.dark"
]
}
},
"geometry": "geometry.default",
"materials": [{ "*": "material.default" }],
"textures": ["array.gem_colors[query.variant]"]
}
}
}array.gem_colors[query.variant] का मतलब है "लिस्ट से नंबर query.variant वाला आइटम लो"। गिनती 0 से शुरू होती है, तो variant 0 लाल है, 1 गुलाबी और 2 गहरा।
query.variant कहाँ से आता है?
बिहेवियर पैक से। minecraft:variant कंपोनेंट मॉब पर एक नंबर रखता है, और query.variant उसे पढ़ता है। यहाँ हर golem spawn होते समय एक random रंग चुनता है:
"component_groups": {
"wiki:color_red": { "minecraft:variant": { "value": 0 } },
"wiki:color_pink": { "minecraft:variant": { "value": 1 } },
"wiki:color_dark": { "minecraft:variant": { "value": 2 } }
},
"events": {
"minecraft:entity_spawned": {
"randomize": [
{ "weight": 2, "add": { "component_groups": ["wiki:color_red"] } },
{ "weight": 1, "add": { "component_groups": ["wiki:color_pink"] } },
{ "weight": 1, "add": { "component_groups": ["wiki:color_dark"] } }
]
}
}लाल का weight 2 है, इसलिए यह बाकी दोनों में से हर एक से दोगुना बार दिखता है।
सीमा से बाहर होना error नहीं है
अगर नंबर लिस्ट से बड़ा है, तो वह घूमकर शुरू में आ जाता है: 3 आइटम की लिस्ट में नंबर 3 फिर से आइटम 0 चुनता है। Negative नंबर आइटम 0 चुनते हैं। यानी गलत variant से गलत रंग दिखेगा, crash नहीं होगा।
मॉडल और materials के लिए भी arrays
arrays में तीन तरह की लिस्ट हो सकती हैं। हर लिस्ट में सिर्फ़ एक ही तरह की चीज़ हो सकती है:
| arrays के अंदर key | इसमें क्या होता है | उदाहरण आइटम |
|---|---|---|
textures | Textures | texture.red |
materials | Materials | material.default |
geometries | मॉडल | geometry.default |
आपको हमेशा array की ज़रूरत नहीं होती। दो चीज़ों के बीच आसान चुनाव के लिए Molang ternary काफ़ी है:
"geometry": "query.is_baby ? geometry.small : geometry.default"स्टेप 3: हिस्से छिपाएँ और दिखाएँ
part_visibility बोन्स को चालू और बंद करता है। हमारे golem के पास एक crown बोन है जो सिर्फ़ tame होने पर दिखता है:
"part_visibility": [
{ "*": true },
{ "crown": "query.is_tamed" }
]- हर एंट्री एक बोन का नाम और एक value है।
trueया 0 के अलावा कुछ भी उसे दिखाता है,falseया 0 उसे छिपाता है। - किसी बोन को छिपाने से उसके children भी छिप जाते हैं।
- एंट्रीज़ क्रम से लागू होती हैं, इसलिए बाद वाली जीतती हैं। यहाँ पहले सब कुछ दिखाया जाता है, फिर ताज query से सेट होता है।
*wildcard की तरह काम करता है:"gem_*"सेgem_left,gem_rightवगैरह मैच होते हैं।
materials लिस्ट भी ऐसे ही काम करती है: सब कुछ के लिए { "*": ... } से शुरू करें, फिर उसके बाद अलग-अलग बोन्स को override करें।
"materials": [
{ "*": "material.default" },
{ "core": "material.glow" }
]इसके काम करने के लिए, glow क्लाइंट एंटिटी के materials में एक छोटा नाम होना चाहिए, जो किसी असली चमकने वाले material की तरफ़ इशारा करे, जैसे entity_emissive_alpha।
रंग और इफ़ेक्ट
रेंडर कंट्रोलर रंग भी बदल सकता है। ये सभी optional हैं:
| फ़ील्ड | यह क्या करता है |
|---|---|
color | मॉब को tint करता है। ऐसा material चाहिए जो tinting सपोर्ट करे। |
overlay_color | पूरे मॉब के ऊपर एक रंग चढ़ाता है, a उसकी ताक़त है |
is_hurt_color | मॉब को चोट लगने पर होने वाली चमक। Vanilla में लाल। |
on_fire_color | जलते समय का tint |
ignore_lighting | true होने पर मॉब पूरी रोशनी में दिखता है, रात में भी |
uv_anim | offset और scale से समय के साथ texture को खिसकाता है, बहते इफ़ेक्ट के लिए |
हर रंग में 0 से 1 तक r, g, b और a होते हैं, और हर एक Molang हो सकता है:
"overlay_color": {
"r": 1.0,
"g": 1.0,
"b": 1.0,
"a": "variable.is_shouting ? 0.5 : 0.0"
}एक से ज़्यादा कंट्रोलर
क्लाइंट एंटिटी में render_controllers एक लिस्ट है। हर कंट्रोलर अपने मॉडल के साथ मॉब को एक बार बनाता है, इसलिए आप इन्हें एक के ऊपर एक रख सकते हैं। Vanilla इसका इस्तेमाल armor या चमकती आँखों जैसी layers के लिए करता है।
आप एक condition भी जोड़ सकते हैं ताकि कोई कंट्रोलर सिर्फ़ कभी-कभी बने:
"render_controllers": [
"controller.render.ruby_golem",
{ "controller.render.ruby_golem_shine": "query.is_powered" }
]जब कुछ गड़बड़ हो
| आपको क्या दिखता है | सबसे संभावित कारण |
|---|---|
| मॉब दिखता ही नहीं | क्लाइंट एंटिटी में रेंडर कंट्रोलर के नाम में typo है, या फ़ाइल render_controllers में नहीं है |
| काले और बैंगनी चेकर | texture का छोटा नाम या उसका path गलत है, या path .png पर खत्म होता है |
| हर golem लाल है | बिहेवियर पैक कभी minecraft:variant सेट नहीं करता, इसलिए query.variant 0 है |
| छिपा हुआ हिस्सा फिर भी दिखता है | बाद वाली कोई part_visibility एंट्री उसे फिर चालू कर देती है, जैसे आख़िर में रखा * |
| रंग का tint कुछ नहीं करता | material tinting सपोर्ट नहीं करता। इसके लिए बना कोई vanilla material आज़माएँ |
और मदद Troubleshooting में है।
आगे क्या
- एंटिटी ऐनिमेशन से मॉब को हिलाएँ।
- ऐनिमेशन इवेंट्स से ऐनिमेशन में साउंड और पार्टिकल चलाएँ।
- Pixel textures से बेहतर skins बनाएँ।