Unity'de BillboardRenderer nasıl kullanılır?


11

Sürüm 5'ten beri (?) Unity'nin yeni bir bileşen türü vardır BillboardRenderer. Ne yazık ki belgeler oldukça zayıf.

Müfettişe "Bileşen Ekle -> Çeşitli -> Billboard Oluşturucu" tıklanarak eklenebilir, ancak görünüşe göre bir Billboard Assetşey yapmak için a gerekir. Unity arayüzünden bir tane oluşturmanın bir yolu yok gibi görünüyor.

BillboardAsset'in eşit derecede zayıf dokümantasyonundan birkaç cümleden biri şöyle:

imageCount Pano farklı açılardan görüntülendiğinde değiştirilebilen önceden pişirilmiş görüntü sayısı.

En yeni projemde sprite / çokgen karışımı grafikler olacak, bu yüzden görünüm açısına bağlı olarak farklı bir sprite ile bir pano oluşturan bir bileşen gerçekten kullanabileceğim bir şey. Ancak bu tür görüntüleri eklemek için herhangi bir yöntem yok gibi görünüyor.

Bu bileşenin nasıl kullanıldığına dair bir örnek gönderebilir misiniz diye merak ettim.


Reklam panosu beklediğim şeyi yapıyor mu? Veya başka bir şey? (Görüntüyü kameraya
bakmasını beklerim

@Evorlor Ben de öyle bekliyordum ama şimdiye kadar hiçbir şey yapmayı başaramadım .
Philipp

Yanıtlar:


6

GÜNCELLEME (2018): Bu cevabı yazdığımdan bu yana daha fazla özellik gösteriliyor. Belki şimdi yaratabiliriz, belki değil. Araştırmam lazım.

Kullanamazsınız.

İşte BillboardAssetkodu çözülmüş kod:

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);
    }
}

Kelimenin tam anlamıyla, yansıma ile bile ayarlamanın bir yolu yoktur. Birisi şöyle düşünebilir: “tamam, doğrudan yapamazsın, ama belki bir çeşit fabrika var mı?”. Decompiler'da Kullanımları Bul'a basıyorum ve şunu alıyorum : BillboardAssetInspectorve BillboardRenderer.

İşte 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()
        {
        }
    }
}

Vay be, bu sınıf daha da saçma. Sadece mantıksız veri tutucudur. Açıkçası, tüm işler tarafından yapılır Renderer. Daha doğrusu, içinde bir veya birkaç [WraplessIcall]yöntemle. Kodunu buraya koymayacağım çünkü uzun ve işe yaramaz- [WraplessIcall]üyeler listesi .

UnityEngine.dll içeriğinin aksine , BillboardAssetInspector( UnityEditor.dll'de bulunan ) gerçek kod içeriyor . Yine, kodunu buraya koymayacağım, çünkü isminden zaten Müfettiş'ten başka bir şey olmadığı açık .

İle aynı durum BillboardAssetInspector.


Anladım, dahili kullanım için; ama tam olarak nerede kullanılır?

SpeedTree sisteminde (özellikle son görüntüye bakın).

Belgeler neden hemen kullanmaya karşı uyarı yerine işe yaramaz şeyleri açıklıyor?

Muhtemelen, iç geliştirme belgelerinden, yeni gelenler için önemli olan ve genel kullanımda önemli olan parçalardan her şeyi kopyalayıp yapıştırdık; daha sonra, bu tür karanlık belgelerin parlatılmasını rahatsız etmek için VR hype'a katılmakla çok meşguldü.

Bunun hakkında ne yapabiliriz?

Onlar örneğin belgelerinde bu “karanlık köşesini” gözden kaçan söyleyin: Unity Editör, açık Help → Report a bug..., içinde What is problem related toseçim documentationvs.

Bunun yerine ne kullanılabilir?

Olası seçenekler şunları içerir:


2
Başka bir alternatif olarak: genellikle bir grup reklam panosu yerleştirmem gerektiğinde, emisyon ve animasyonu kapalıyken bir parçacık sistemi kullanıyorum, böylece her reklam panosunu istediğim yere manuel olarak yerleştirebiliyorum.
DMGregory

@DMGregory Katılmıyorum, Unity'nin parçacık sistemi uzaktan “parçacıklara” bile yakın olmayan birçok şey için harikadır. Daha da iyisi, Unity 5'ten bu yana, partikül sistemi özelleştirme desteği açıkça geliştirildi / optimize edildi. Bu seçeneği cevaba eklemem gerekir mi yoksa bu yorumlar yeterlidir, ne düşünüyorsunuz?
Maxim Kamalov

Ben yorumlarda bırakmak iyi olduğunu düşünüyorum. Birisi daha fazla ayrıntı istiyorsa, yeni bir soru sormak için yeterince etli olduğunu düşünüyorum.
DMGregory

Dahili kullanım için buna inanmıyorum, dedi doktor: "Reklam panosunun nasıl tanımlandığını öğrendikten sonra kendiniz de oluşturabilirsiniz." - docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamking Ve şimdi maruz kalan daha fazla özellik var. Yani, evet, muhtemelen şimdi doğrudan onları kullanmak mümkündür.
Maxim Kamalov

1

BillboardRenderer'ı kullanmak için Billboard Varlığı'na ihtiyacınız var, C # komut dosyasıyla Billboard Varlığı oluşturabilirsiniz. Bu gönderiyi kontrol edin .

Billboard Varlığı'nın içeriği şöyledir: Billboard.asset

 %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}

Yukarıdaki dosyayı oluşturmak için kullanılan C # kodu

 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
     }

daha fazla bilgi için lütfen cevabın başında verdiğim gönderiyi kontrol edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.