Як користуватися BillboardRenderer в Unity?


11

Оскільки версія 5 (?) Unity має новий тип компонентів BillboardRenderer. На жаль, документація є досить поганою.

Його можна додати в інспектора, натиснувши "Додати компонент -> різне -> рендери білборда", але, мабуть, для цього потрібно Billboard Assetзробити що-небудь. Здається, не існує жодного способу створити його з інтерфейсу Unity.

Одне з небагатьох речень з не менш поганої документації BillboardAsset гласить:

imageCount Кількість попередньо випечених зображень, які можна перемикати, коли рекламний щит переглядається з різних ракурсів.

Мій найновіший проект матиме графік спрайт / багатокутників, тому компонент, який надає рекламний щит з іншим спрайтом, залежно від кута огляду, - це те, що я міг би реально використати. Але, здається, не існує жодного способу додати подібні зображення.

Тому я задумався, чи можете ви розмістити приклад, як цей компонент використовується.


Чи робить білборд те, що я очікував? Або щось інше? (Я б очікував, що це збереже зображення перед камерою.)
Еворлор,

@Evorlor Це я теж очікував, але поки що мені не вдалося змусити його щось зробити .
Філіпп

Відповіді:


6

ОНОВЛЕННЯ (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);
    }
}

Буквально немає можливості встановити зображення, навіть за допомогою відображення. Можна подумати: «гаразд, ти не можеш це зробити безпосередньо, але, можливо, там є якась фабрика?». Я натискаю Find Usages в декомпіляторі і отримую: 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] -методів у ньому. Я не ставлю тут його код, оскільки це довгий і марний список [WraplessIcall]членів.

На відміну від вмісту UnityEngine.dll , BillboardAssetInspector(який знаходиться в UnityEditor.dll ) є в ньому реальний код. Знову ж таки, я не ставлю його код тут, бо з його назви зрозуміло, що це не що інше все одно інспектор .

Така ж ситуація і з BillboardAssetInspector .


Зрозумів, це для внутрішнього використання; але де саме він використовується?

У системі SpeedTree (див. Зокрема останнє зображення).

Чому документація пояснює непотрібні речі замість того, щоб попереджати про її використання відразу?

Напевно, просто скопіюйте все, що стосується внутрішньої розробки документації, удосконалених деталей, важливих для новачків та загального користування; тоді був надто зайнятий участю у галасуванні на VR, щоб не турбуватися про полірування таких темних куточків документації.

Що ми можемо з цим зробити?

Скажіть їм, що вони не помітили цього "темного кута" в документації, наприклад: у Unity Editor, відкрийте Help → Report a bug..., What is problem related toвиберіть documentationтощо.

Що можна використовувати замість цього?

Можливі варіанти включають:


2
Як інша альтернатива: часто, коли мені потрібно розмістити купу білбордів, я використовую систему частинок, її випромінювання та анімація вимкнено, щоб я міг розташувати вручну кожен квадроцикл, де я хочу.
DMGregory

@DMGregory Не можу погодитись, система частинок Unity чудово підходить для багатьох речей, які навіть віддалено не близькі до "частинок". Ще краще, оскільки Unity 5 явно покращила / оптимізувала підтримку налаштування системи частинок. Чи варто додати цю відповідь до відповіді, або цих коментарів достатньо, як ви думаєте?
Максим Камалов

Я думаю, що це добре залишити в коментарях. Якщо хтось хоче детальніше про це, я думаю, що це досить м'ясно, щоб задати нове запитання.
DMGregory

Я не вірю в це для внутрішнього використання, доктор сказав: "Ви також можете створити свій власний, коли дізнаєтесь, як описано рекламний щит". - docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamking А тепер відкриті більше властивостей. Так, так, можливо, їх зараз можна безпосередньо використовувати.
Максим Камалов

1

Для використання BillboardRenderer вам потрібен актив Billboard Asset, ви можете сконструювати Billboard Asset за допомогою сценарію C #. Перевірте цю публікацію .

Актив Billboard має такий вміст: 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}

Ось код 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.