एक प्रेत का एक अनुगामी, भूत प्रभाव बनाएँ


15

मैं एक अनुगामी बनाना चाहता हूं, एक प्रेत के प्रभाव की तरह, जो तेजी से आगे बढ़ रहा है। सोनिक की इस छवि के समान कुछ (खराब गुणवत्ता की क्षमायाचना, यह एकमात्र उदाहरण है जो मैं उस प्रभाव को पा सकता हूं जिसे मैं प्राप्त करना चाहता हूं)

भूत का निशान

हालांकि, मैं स्प्राइट शीट स्तर पर ऐसा नहीं करना चाहता, ताकि मेरे एटलस में स्प्राइट्स की मात्रा को अनिवार्य रूप से दोगुना (या संभवतः चौगुनी) करने से बचा जा सके। यह बहुत श्रम साध्य भी है।

तो क्या इस प्रभाव को प्राप्त करने का कोई और तरीका है? संभवतः कुछ shader जादू जादू द्वारा? मैं एकता और 2D टूलकिट का उपयोग कर रहा हूँ, अगर यह मदद करता है।

जवाबों:


21

आप आसानी से एक कण प्रणाली और एक shader के साथ ऐसा कर सकते हैं। अधिकतम 3 कणों के साथ प्रत्येक X मिलीसेकंड 1 कण जारी करने के लिए कण प्रणाली सेट करें। (एक X चुनें कि आप कितनी दूर तक फैले हुए स्प्राइट्स को चाहते हैं, इसके आधार पर।) कण के लिए, चरित्र के वर्तमान स्प्राइट के समान छवि का उपयोग करें, लेकिन एक अलग सामग्री के साथ। प्रभाव पर प्राप्त करने के लिए सामग्री पर अल्फा मिश्रित मिश्रणों में से कुछ को आज़माएं जो आपको अनुगामी कणों पर चाहिए।

यदि आप कट्टर होना चाहते हैं, तो आप वर्ण की वर्तमान गति के आधार पर अधिकतम # कणों और अन्य सेटिंग्स को समायोजित कर सकते हैं।

यहाँ एक उदाहरण है कि मैं सिर्फ 1 क्वाड, 1 स्प्राइट, 2 सामग्री और एक कण प्रणाली के साथ करने में सक्षम था।

मैंने कण प्रणाली को क्वाड से जोड़ा और सोनिक स्प्राइट का उपयोग करने के लिए क्वाड सेट किया। मैं केवल एमिशन, कलर ओवर लाइफ टाइम और रेंडरर पार्टिकल सिस्टम का उपयोग कर रहा हूं।

अधिकतम कण: 5

सिमुलेशन अंतरिक्ष: दुनिया

लाइफटाइम शुरू करें: 1

प्रारंभ गति: 0

जीवन भर रंग: सफेद से फीका (अल्फा 255) से काला (अल्फा 0)

रेंडरर सामग्री: मूल के रूप में एक ही छवि का उपयोग करना, लेकिन "कण / अल्फा मिश्रित" शेडर के साथ।

ट्रेलिंग पार्टिकल इफेक्ट के साथ सोनिक


1
यह पूरी तरह से काम करता है। केवल एक चीज जो मुझे काम करने की ज़रूरत है वह यह है कि कैसे प्रोग्राम सिस्टम को कण प्रणाली रेंडरर पर वर्तमान स्प्राइट छवि से मिलान करने के लिए सेट किया जाए (फिर से, मैं 2D टूलकिट का उपयोग कर रहा हूं ताकि यह यूनिटी के स्प्राइट सिस्टम से अलग हो)।
कूपर

4

कण प्रणाली समाधान की तरह, आप एक ही प्रभाव बनाने के लिए 2dtoolkit का उपयोग कर सकते हैं। चरित्र के 3 बच्चों के खेल को केवल उनके साथ जुड़े एक प्रेत के साथ जोड़ें। आवश्यकतानुसार अल्फा और रंग बदलें। फिर आप वर्ण की गति के आधार पर स्प्राइट के स्थानीय पदों को अलग-अलग कर सकते हैं:

myTransform.localPosition = characterSpeed * distanceFactor;

यह ड्रॉ कॉल (कणों की तुलना में) बचाता है और आपको प्रभाव के प्रसार पर कुल नियंत्रण प्रदान करता है, यदि आप इसे सुचारू या कंपित करना चाहते हैं।


यह वास्तव में मुझे एक बेहतर समाधान की ओर ले जाता है जो 2D टूलकिट का उपयोग करते समय बहुत अधिक अनुकूल है, लेकिन मैं स्वीकृत उत्तर के रूप में चिह्नित करने के लिए अनिच्छुक हूं। कण प्रणाली विधि एक बहुत अधिक "एकता जेनेरिक" तरीका है जो शायद सबसे एकता डेवलपर्स के लिए सबसे अच्छा फिट है। मैं अपने द्वारा उपयोग किए गए समाधान को पोस्ट करूंगा।
कूपर

3

जबकि LVBen द्वारा प्रदान किया गया कण प्रणाली समाधान काम करता है, यह आपके स्प्राइट्स के लिए 2D टूलकिट का उपयोग करते समय सबसे उपयुक्त समाधान नहीं है। प्राथमिक कारण यह है कि मुख्य प्रीफैब के वर्तमान स्प्राइट एनीमेशन में कण प्रणाली में भूत ट्रेल सामग्री को सिंक करना असंभव है।

यहाँ 2 डी टूलकिट अनुकूल समाधान है जिसका मैंने उपयोग किया है।

उस प्रीफैब के लिए जिसमें आप चाहते हैं कि भूत का निशान आए, एक खाली गेम ऑब्जेक्ट को रूट के रूप में कार्य करने के लिए संलग्न करें। इस रूट के तहत, tk2dSprite या tk2dSpriteAnimator (यदि आप एनिमेटेड स्प्राइट चाहते हैं या नहीं) गेम ऑब्जेक्ट (मैंने 4 जोड़ा) के अनुसार किसी भी संख्या को संलग्न करें और भूत के प्रभाव को दूर करने के लिए उपयुक्त के रूप में उनके रंग अल्फा मूल्यों को समायोजित करें।

शीर्ष जनक अद्यतन में

// AmountToMove is a Vector3 of the amount we will translate this gameobject.
float y = (int)AmountToMove.y == 0 ? 0 : -AmountToMove.y;
float distanceFactor = 0.05f;
for (int i = 0; i < GhostingRoot.childCount; ++i) {
    // Based on the player's current speed and movement along the x and y axes,
    // position the ghost sprites to trail behind.
    Vector3 ghostSpriteLocalPos = Vector3.Lerp(
                                      GhostingRoot.GetChild(i).localPosition,
                                      new Vector3((-CurrentSpeed * distanceFactor * i),
                                                  (y * distanceFactor * i), 0),
                                      10f * Time.deltaTime);
    // GhostingRoot is the root gameobject that's parent to the ghost sprites.
    GhostingRoot.GetChild(i).localPosition = ghostSpriteLocalPos;
    // Sync the animations.
    // _ghostSprites is a List of the tk2dSpriteAnimator ghost sprites.
    _ghostSprites[i].Play(SpriteAnimator.CurrentClip.name);
    _ghostSprites[i].Sprite.FlipX = Sprite.FlipX;
}

यह समाधान मुख्य प्रेत के साथ भूत प्रेत के एनिमेशन को सिंक्रनाइज़ करते हुए अनुगामी भूत प्रभाव पैदा करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.