Làm cách nào để sử dụng BillboardRenderer trong Unity?


11

Vì phiên bản 5 (?) Unity có loại thành phần mới BillboardRenderer. Thật không may , tài liệu khá nghèo nàn.

Nó có thể được thêm vào trình kiểm tra bằng cách nhấp vào "Thêm Thành phần -> Linh tinh -> Trình kết xuất Billboard" nhưng rõ ràng nó yêu cầu Billboard Assetphải làm bất cứ điều gì. Dường như không có cách nào để tạo một cái từ giao diện Unity.

Một trong số ít câu từ tài liệu nghèo nàn không kém của BillboardAsset đọc:

imageCount Số lượng hình ảnh được nung sẵn có thể được chuyển đổi khi bảng quảng cáo được xem từ các góc khác nhau.

Dự án mới nhất của tôi sẽ có đồ họa trộn sprite / đa giác, vì vậy một thành phần biểu hiện một bảng quảng cáo với một sprite khác nhau tùy thuộc vào góc nhìn là thứ tôi thực sự có thể sử dụng. Nhưng dường như không có bất kỳ phương pháp nào để thêm những hình ảnh như vậy.

Vì vậy, tôi tự hỏi nếu bạn có thể đăng một ví dụ về cách thành phần này được sử dụng.


Bảng quảng cáo có làm những gì tôi mong đợi không? Hay cái gì khác? (Tôi hy vọng nó sẽ giữ hình ảnh đối diện với máy ảnh.)
Evorlor

@Evorlor Đó là những gì tôi mong chờ quá, nhưng cho đến nay tôi đã không được quản lý để có được nó để làm bất cứ điều gì .
Philipp

Câu trả lời:


6

CẬP NHẬT (2018): Có nhiều tài sản được tiếp xúc kể từ khi tôi viết câu trả lời này. Có lẽ chúng ta có thể tạo ra nó bây giờ, có thể không. Phải nghiên cứu.

Bạn không thể sử dụng nó.

Đây là BillboardAssetmã dịch ngược :

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

Theo nghĩa đen không có cách nào để thiết lập hình ảnh, ngay cả bằng sự phản chiếu. Mọi người có thể nghĩ: không sao, bạn không thể làm điều đó trực tiếp, nhưng có thể có một số loại nhà máy được cung cấp? Tôi nhấn Find Usages trong dịch ngược và nhận: BillboardAssetInspectorBillboardRenderer.

Đây là 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()
        {
        }
    }
}

Wow, lớp học này thậm chí còn bẩn thỉu. Đó chỉ là người giữ dữ liệu không logic. Rõ ràng, tất cả các công việc được thực hiện bởi Renderer. Chính xác hơn, bởi một hoặc một vài đối [WraplessIcall]tượng trong đó. Tôi sẽ không đặt mã của nó ở đây vì nó là danh sách dài và vô dụng [WraplessIcall].

Không giống như nội dung UnityEngine.dll , BillboardAssetInspector(đang cư trú trong UnityEditor.dll ) có mã thực sự trong đó. Một lần nữa, tôi sẽ không đặt mã của nó ở đây, vì rõ ràng từ tên của nó , dù sao nó cũng không phải là Thanh tra .

Cùng hoàn cảnh với BillboardAssetInspector.


Có nó, nó để sử dụng nội bộ; nhưng nó được sử dụng chính xác ở đâu?

Trong hệ thống SpeedTree (đặc biệt là nhìn vào hình ảnh cuối cùng).

Tại sao tài liệu giải thích những thứ vô dụng thay vì cảnh báo không sử dụng nó ngay lập tức?

Có lẽ, chỉ cần sao chép mọi thứ từ tài liệu phát triển nội bộ, các phần được cải thiện rất quan trọng đối với người mới sử dụng và trong sử dụng chung; sau đó quá bận rộn khi tham gia vào sự cường điệu VR để bận tâm đánh bóng những góc tối của tài liệu như vậy.

Những gì chúng tôi có thể làm gì về nó?

Nói với họ rằng họ đã bỏ qua góc tối này của người Viking trong tài liệu, ví dụ: Trong Unity Editor, mở Help → Report a bug..., What is problem related tochọn documentation, v.v.

Những gì người ta có thể sử dụng thay thế?

Các tùy chọn có thể bao gồm:


2
Một cách khác: thường khi tôi cần đặt một loạt các biển quảng cáo, tôi sử dụng một hệ thống hạt, với sự phát xạ và hoạt hình của nó bị tắt để tôi có thể đặt thủ công từng ô vuông mà tôi muốn.
DMGregory

@DMGregory Không thể không đồng ý, hệ thống hạt của Unity rất tuyệt vời đối với nhiều thứ thậm chí không ở gần với các hạt Hạt. Thậm chí tốt hơn, kể từ Unity 5, hỗ trợ tùy chỉnh hệ thống hạt đã được cải thiện / tối ưu hóa rõ ràng. Tôi nên thêm tùy chọn này vào câu trả lời, hoặc những bình luận này là đủ, bạn nghĩ sao?
Maxim Kamalov

Tôi nghĩ rằng nó tốt để lại trong các ý kiến. Nếu ai đó muốn biết thêm chi tiết về nó, tôi nghĩ rằng nó đủ để hỏi một câu hỏi mới.
DMGregory

Tôi không tin nó để sử dụng nội bộ, tài liệu nói: "Bạn cũng có thể tự tạo một khi bạn biết cách mô tả bảng quảng cáo." - docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamking Và bây giờ có nhiều tài sản tiếp xúc. Vì vậy, yeah, có lẽ có thể sử dụng chúng trực tiếp ngay bây giờ.
Maxim Kamalov

1

Để sử dụng BillboardRenderer, bạn cần Tài sản Billboard, bạn có thể xây dựng Tài sản Billboard với tập lệnh C #. Kiểm tra bài này .

Tài sản Billboard có nội dung như thế này: 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}

Đây là mã C # được sử dụng để tạo tệp ở trên

 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
     }

để biết thêm chi tiết, xin vui lòng kiểm tra bài tôi đã đưa ra trong phần đầu của câu trả lời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.