UnityでBillboardRendererを使用するには?


11

バージョン5(?)以降、Unityには新しいコンポーネントタイプがありBillboardRendererます。残念ながら、ドキュメントはかなり貧弱です。

「コンポーネントの追加->その他->ビルボードレンダラー」をクリックすることでインスペクターに追加できますが、Billboard Asset何もする必要がないようです。Unityインターフェースから作成する方法はないようです。

同様に不十分な BillboardAssetのドキュメントからの数少ない文章の1つは次のとおりです。

imageCount ビルボードをさまざまな角度から見たときに切り替えることができるプリベーク画像の数。

私の最新のプロジェクトにはスプライト/ポリゴンミックスグラフィックスがあるので、ビューアングルに応じて異なるスプライトでビルボードをレンダリングするコンポーネントは、私が実際に利用できるものです。しかし、そのような画像を追加する方法はないようです。

したがって、このコンポーネントの使用例を投稿できるかどうか疑問に思いました。


看板は私が期待することをしますか?または、他の何か?(私はそれが画像をカメラに向け続けることを期待します。)
Evorlor '28 / 02/28

@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を押してget:BillboardAssetInspectorBillboardRenderer

ここにあり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ます。より正確には、その中の1つまたはいくつかの[WraplessIcall]メソッドによって。[WraplessIcall]メンバーの長くて役に立たないリストなので、ここではそのコードを記述しません。

UnityEngine.dllのコンテンツBillboardAssetInspectorUnityEditor.dllにある)とは異なり、実際のコードが含まれています。繰り返しになりますが、ここではそのコードを記述しません。とにかく、それがInspectorにすぎないことはその名前から明らかであるためです。

と同じ状況BillboardAssetInspector


了解しました。内部で使用するためのものです。しかし、それはどこで正確に使用されていますか?

SpeedTreeシステム(特に最後の画像を見てください)。

なぜドキュメントはすぐにそれを使用することに対して警告するのではなく、役に立たないものを説明するのですか?

おそらく、内部開発ドキュメントのすべてをコピーして貼り付けただけで、新規参入者や一般的な使用法にとって重要な改善されたパーツです。その後、VRの誇大宣伝に参加するのに忙しくて、ドキュメントのそのような暗いコーナーを磨くのに苦労しました。

それについて私たちは何ができますか?

たとえば、ドキュメントのこの「暗いコーナー」を見落としていたことを伝えます。たとえば、Unityエディターで、を開いHelp → Report a bug...たり、What is problem related to選択したりしますdocumentation

代わりに何を使用できますか?

可能なオプションは次のとおりです。


2
別の方法として、多くのビルボードを配置する必要がある場合は、パーティクルシステムを使用します。その際、放出とアニメーションをオフにして、ビルボードされた各クワッドを手動で配置できるようにします。
DMGregory

@DMGregory反対することはできません。Unityのパーティクルシステムは、「パーティクル」に遠く離れていない多くのことに適しています。さらに良いことに、Unity 5以降、パーティクルシステムのカスタマイズのサポートが明示的に改善/最適化されました。このオプションを回答に追加する必要がありますか、それともこれらのコメントで十分ですか、どう思いますか?
Maxim Kamalov 2016年

コメント欄に書いてもいいと思います。誰かがそれについてもっと詳しく知りたいのであれば、私は新しい質問をするのに十分な量だと思います。
DMGregory

私はそれを内部で使用することは信じていません、と文書は言った:「看板がどのように記述されているかを知ったら、あなたはあなた自身のものを作成することもできる。」- docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamkingそして、より多くのプロパティが公開されました。ですから、そうですね、おそらく今すぐにそれらを直接利用することは可能でしょう。
Maximカマロフ2018

1

BillboardRendererを使用するには、Billboard Assetが必要です。C#スクリプトを使用してBillboard Assetを構築できます。この投稿を確認してください。

ビルボードアセットには次のようなコンテンツがあります: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
     }

詳細については、回答の冒頭で示した投稿を確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.