एकता में BillboardRenderer का उपयोग कैसे करें?


11

संस्करण 5 (?) के बाद से एकता में एक नया घटक-प्रकार है BillboardRenderer। दुर्भाग्य से प्रलेखन काफी खराब है।

इसे इंस्पेक्टर में "Add Component -> Misceallaneous -> Billboard Renderer" पर क्लिक करके जोड़ा जा सकता है लेकिन जाहिर तौर पर इसके Billboard Assetलिए कुछ भी करने की आवश्यकता होती है । एकता इंटरफ़ेस से एक बनाने के लिए कोई रास्ता नहीं प्रतीत होता है।

बिलबोर्डसेटसेट के समान रूप से खराब प्रलेखन के कुछ वाक्यों में से एक में लिखा है:

इमेज -प्री-बेक्ड इमेज की संख्या जो कि बिलबोर्ड को अलग-अलग कोणों से देखने पर स्विच की जा सकती है।

मेरी नवीनतम परियोजना में स्प्राइट / बहुभुज मिक्स ग्राफिक्स होंगे, इसलिए एक घटक जो एक अलग-अलग स्प्राइट के साथ एक बिलबोर्ड प्रदान करता है, जो देखने के कोण के आधार पर कुछ ऐसा है जिसे मैं वास्तव में उपयोग कर सकता हूं। लेकिन ऐसी छवियों को जोड़ने के लिए कोई विधि प्रतीत नहीं होती है।

इसलिए मैंने सोचा कि अगर आप एक उदाहरण पोस्ट कर सकते हैं कि यह घटक कैसे उपयोग किया जाता है।


क्या बिलबोर्ड वह करता है जिसकी मुझे उम्मीद है? या कुछ और? (मुझे उम्मीद है कि यह कैमरे के सामने छवि रखने के लिए नहीं होगा।)
Evorlor

@ एवर्लर वह है जो मैं भी उम्मीद करूंगा, लेकिन अभी तक मैं इसे कुछ भी करने में कामयाब नहीं हुआ हूं ।
फिलिप

जवाबों:


6

UPDATE (2018): जब से मैंने यह उत्तर लिखा है, तब और भी कुछ संपत्तियाँ उजागर हुई हैं। शायद हम इसे अभी बना सकते हैं, शायद नहीं। होगा शोध।

आप इसका उपयोग नहीं कर सकते।

यहाँ BillboardAssetकूट कूट है:

using System;

namespace UnityEngine
{
    /// <summary>
    ///   <para>BillboardAsset describes how a billboard is rendered.</para>
    /// </summary>
    public sealed class BillboardAsset : Object
    {
        /// <summary>
        ///   <para>Height of the billboard that is below ground.</para>
        /// </summary>
        public float bottom
        {
            [WrapperlessIcall]
            get;
            [WrapperlessIcall]
            set;
        }

        /// <summary>
        ///   <para>Height of the billboard.</para>
        /// </summary>
        public float height
        {
            [WrapperlessIcall]
            get;
            [WrapperlessIcall]
            set;
        }

        /// <summary>
        ///   <para>Number of pre-baked images that can be switched when the billboard is viewed from different angles.</para>
        /// </summary>
        public int imageCount
        {
            [WrapperlessIcall]
            get;
        }

        /// <summary>
        ///   <para>Number of indices in the billboard mesh. The mesh is not necessarily a quad. It can be a more complex shape which fits the actual image more precisely.</para>
        /// </summary>
        public int indexCount
        {
            [WrapperlessIcall]
            get;
        }

        /// <summary>
        ///   <para>The material used for rendering.</para>
        /// </summary>
        public Material material
        {
            [WrapperlessIcall]
            get;
            [WrapperlessIcall]
            set;
        }

        /// <summary>
        ///   <para>Number of vertices in the billboard mesh. The mesh is not necessarily a quad. It can be a more complex shape which fits the actual image more precisely.</para>
        /// </summary>
        public int vertexCount
        {
            [WrapperlessIcall]
            get;
        }

        /// <summary>
        ///   <para>Width of the billboard.</para>
        /// </summary>
        public float width
        {
            [WrapperlessIcall]
            get;
            [WrapperlessIcall]
            set;
        }

        /// <summary>
        ///   <para>Constructs a new BillboardAsset.</para>
        /// </summary>
        public BillboardAsset()
        {
        }

        [WrapperlessIcall]
        internal extern void MakeMaterialProperties(MaterialPropertyBlock properties, Camera camera);

        [WrapperlessIcall]
        internal extern void MakePreviewMesh(Mesh mesh);

        [WrapperlessIcall]
        internal extern void MakeRenderMesh(Mesh mesh, float widthScale, float heightScale, float rotation);
    }
}

वस्तुतः परावर्तन द्वारा, छवियों को सेट करने का कोई तरीका नहीं है। कोई सोच सकता है: "ठीक है, आप इसे सीधे नहीं कर सकते हैं, लेकिन शायद किसी तरह का कारखाना प्रदान किया गया है?"। मैं डिकम्प्रेसर में फाइंड यूसेज दबाता हूं और मिलता हूं : BillboardAssetInspectorऔर BillboardRenderer

यहाँ है BillboardRenderer:

using System;

namespace UnityEngine
{
    /// <summary>
    ///   <para>Renders a billboard.</para>
    /// </summary>
    public sealed class BillboardRenderer : Renderer
    {
        /// <summary>
        ///   <para>The BillboardAsset to render.</para>
        /// </summary>
        public BillboardAsset billboard
        {
            [WrapperlessIcall]
            get;
            [WrapperlessIcall]
            set;
        }

        /// <summary>
        ///   <para>Constructor.</para>
        /// </summary>
        public BillboardRenderer()
        {
        }
    }
}

वाह, यह वर्ग और भी कमज़ोर है। यह सिर्फ लॉजिक-कम डेटा धारक है। जाहिर है, सभी काम के द्वारा किया जाता है Renderer। अधिक सटीक रूप से, इसमें से एक या जोड़े द्वारा [WraplessIcall]-methods। मैं इसका कोड यहां नहीं [WraplessIcall]रखूंगा क्योंकि यह लंबी और बेकार सूची है ।

UnityEngine.dll सामग्री के विपरीत , BillboardAssetInspector(जो UnityEditor.dll में स्थित है ) में वास्तविक कोड है। दोबारा, मैं इसका कोड यहां नहीं रखूंगा, क्योंकि इसके नाम से ही स्पष्ट है कि यह इंस्पेक्टर से ज्यादा कुछ भी नहीं है।

साथ ही स्थिति BillboardAssetInspector


मिल गया, यह आंतरिक उपयोग के लिए है; लेकिन इसका उपयोग कहाँ किया जाता है?

स्पीडट्री सिस्टम में (विशेष रूप से अंतिम छवि देखें)।

दस्तावेज़ीकरण बेकार के सामानों को स्पष्ट रूप से उपयोग करने के खिलाफ चेतावनी के बजाय क्यों समझाता है?

संभवतः, आंतरिक विकास प्रलेखन से सब कुछ कॉपी-पेस्ट किया, बेहतर भागों जो नए लोगों के लिए और सामान्य उपयोग में महत्वपूर्ण हैं; तब वीआर प्रचार में भाग लेने में बहुत व्यस्त था, ऐसे प्रलेखन के अंधेरे कोनों को चमकाने के लिए।

हम इसके बारे में क्या कर सकते हैं?

उन्हें बताएं कि उन्होंने दस्तावेज में इस "अंधेरे कोने" को अनदेखा किया है, उदाहरण के लिए: एकता संपादक में, खुला Help → Report a bug..., What is problem related toचयन में documentation, आदि।

इसके बजाय कोई क्या उपयोग कर सकता है?

संभावित विकल्पों में शामिल हैं:


2
एक अन्य विकल्प के रूप में: अक्सर जब मुझे होर्डिंग का एक गुच्छा लगाने की आवश्यकता होती है, तो मैं एक कण प्रणाली का उपयोग करता हूं, जिसके उत्सर्जन और एनीमेशन को बंद कर दिया जाता है, इसलिए मैं प्रत्येक बिलबोर्ड वाले क्वाड को मैन्युअल रूप से रख सकता हूं जहां मैं चाहता हूं।
DMGregory

@DMGregory असहमत नहीं हो सकती, एकता की कण प्रणाली कई चीजों के लिए महान है जो "कण" के भी दूर नहीं हैं। यूनिटी 5 के बाद से और भी बेहतर, कण प्रणाली के अनुकूलन के लिए समर्थन में स्पष्ट रूप से सुधार / अनुकूलित किया गया था। क्या मुझे इस विकल्प को उत्तर में जोड़ना चाहिए, या ये टिप्पणियां पर्याप्त हैं, आपको क्या लगता है?
मैक्सिम कमालोव

मुझे लगता है कि टिप्पणियों में छोड़ना ठीक है। यदि कोई इस पर अधिक विवरण चाहता है, तो मुझे लगता है कि यह एक नया प्रश्न पूछने के लिए पर्याप्त है।
DMGregory

मैं इसे आंतरिक उपयोग के लिए विश्वास नहीं करता, डॉक्टर ने कहा: "बिलबोर्ड का वर्णन कैसे किया जाता है, यह जानने के बाद आप अपना स्वयं का निर्माण भी कर सकते हैं।" - docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamking और अब अधिक गुण उजागर हैं। तो, हाँ, यह संभव है कि अब उन्हें सीधे उपयोग करें।
मैक्सिम कमालोव

1

BillboardRenderer का उपयोग करने के लिए, आपको बिलबोर्ड एसेट की आवश्यकता है, आप C # स्क्रिप्ट के साथ बिलबोर्ड एसेट का निर्माण कर सकते हैं। चेक इस पोस्ट

बिलबोर्ड एसेट में इस तरह की सामग्री है: बिलबोर्ड.सेट

 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
 --- !u!226 &22600000
 BillboardAsset:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_Name: Billboard_Original
   serializedVersion: 2
   width: 10.350581
   bottom: -0.2622106
   height: 7.172371
   imageTexCoords:
   - {x: 0.230981, y: 0.33333302, z: 0.230981, w: -0.33333302}
   - {x: 0.230981, y: 0.66666603, z: 0.230981, w: -0.33333302}
   - {x: 0.33333302, y: 0, z: 0.33333302, w: 0.23098099}
   - {x: 0.564314, y: 0.23098099, z: 0.23098099, w: -0.33333302}
   - {x: 0.564314, y: 0.564314, z: 0.23098099, w: -0.33333403}
   - {x: 0.66666603, y: 0, z: 0.33333302, w: 0.23098099}
   - {x: 0.89764804, y: 0.23098099, z: 0.230982, w: -0.33333302}
   - {x: 0.89764804, y: 0.564314, z: 0.230982, w: -0.33333403}
   vertices:
   - {x: 0.47093, y: 0.020348798}
   - {x: 0.037790697, y: 0.498547}
   - {x: 0.037790697, y: 0.976744}
   - {x: 0.52906996, y: 0.020348798}
   - {x: 0.95930207, y: 0.498547}
   - {x: 0.95930207, y: 0.976744}
   indices: 040003000000010004000000050004000100020005000100
   material: {fileID: 2100000, guid: 6e680dda9368db5418f19388474277a2, type: 2}

यहाँ C # कोड दिया गया है जो ऊपर फ़ाइल को उत्पन्न करने के लिए उपयोग किया जाता है

 using System.Collections;
 using System.Collections.Generic;
 using UnityEditor;
 using UnityEngine;

     public class BillboardBaker : MonoBehaviour
     {
 #if UNITY_EDITOR
         public BillboardAsset m_outputFile;
         public Material m_material;

         [ContextMenu("Bake Billboard")]
         void BakeBillboard()
         {
             BillboardAsset billboard = new BillboardAsset();

             billboard.material = m_material;
             Vector4[] texCoords = new Vector4[8];
             ushort[] indices = new ushort[12];
             Vector2[] vertices = new Vector2[6];
             texCoords[0].Set(0.230981f, 0.33333302f, 0.230981f, -0.33333302f);
             texCoords[1].Set(0.230981f, 0.66666603f, 0.230981f,-0.33333302f);
             texCoords[2].Set(0.33333302f, 0.0f, 0.33333302f,0.23098099f);
             texCoords[3].Set(0.564314f, 0.23098099f, 0.23098099f,-0.33333302f);
             texCoords[4].Set(0.564314f, 0.564314f, 0.23098099f,-0.33333403f);
             texCoords[5].Set(0.66666603f, 0.0f, 0.33333302f,0.23098099f);
             texCoords[6].Set(0.89764804f, 0.23098099f, 0.230982f,-0.33333302f);
             texCoords[7].Set(0.89764804f, 0.564314f, 0.230982f,-0.33333403f);

             indices[0] = 4;
             indices[1] = 3;
             indices[2] = 0;
             indices[3] = 1;
             indices[4] = 4;
             indices[5] = 0;
             indices[6] = 5;
             indices[7] = 4;
             indices[8] = 1;
             indices[9] = 2;
             indices[10] = 5;
             indices[11] = 1;

             vertices[0].Set(0.47093f, 0.020348798f);
             vertices[1].Set(0.037790697f, 0.498547f);
             vertices[2].Set(0.037790697f, 0.976744f);
             vertices[3].Set(0.52906996f, 0.020348798f);
             vertices[4].Set(0.95930207f, 0.498547f);
             vertices[5].Set(0.95930207f, 0.976744f);

             billboard.SetImageTexCoords(texCoords);
             billboard.SetIndices(indices);
             billboard.SetVertices(vertices);

             billboard.width = 10.35058f;
             billboard.height = 7.172371f;
             billboard.bottom = -0.2622106f;

             if (m_outputFile != null)
             {
                 EditorUtility.CopySerialized(billboard, m_outputFile);
             }
             else
             {
                 string path;
                 path = AssetDatabase.GetAssetPath(m_material) + ".asset";
                 AssetDatabase.CreateAsset(billboard, path);
             }
         }
 #endif
     }

अधिक जानकारी के लिए, कृपया उत्तर की शुरुआत में मेरे द्वारा दिए गए पोस्ट को देखें।

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