ইউনিটিতে বিলবোর্ডরেন্ডারার কীভাবে ব্যবহার করবেন?


11

সংস্করণ 5 (?) ইউনিটির একটি নতুন উপাদান-ধরনের রয়েছে BillboardRenderer। দুর্ভাগ্যক্রমে ডকুমেন্টেশন বেশ দুর্বল।

এটিকে পরিদর্শকটিতে "যোগ সংযোজন -> বিবিধ -> বিলবোর্ড রেন্ডারার" ক্লিক করে যোগ করা যেতে পারে তবে দৃশ্যত এর জন্য Billboard Assetকিছু করার দরকার পড়ে। ইউনিটি ইন্টারফেস থেকে এটি তৈরির কোনও উপায় বলে মনে হচ্ছে না।

বিলবোর্ডসেটের সমানভাবে দুর্বল ডকুমেন্টেশনগুলির কয়েকটি বাক্যগুলির মধ্যে একটি :

ইমেজকাউন্ট প্রাক-বেকড চিত্রগুলির সংখ্যা যা যখন বিলবোর্ডটি বিভিন্ন কোণ থেকে দেখা হয় তখন স্যুইচ করা যায়।

আমার নতুন প্রজেক্টে স্প্রিট / বহুভুজ মিক্স গ্রাফিক্স থাকবে, সুতরাং এমন একটি উপাদান যা ভিউ এঙ্গেলের উপর নির্ভর করে ভিন্ন স্প্রাইটের সাথে একটি বিলবোর্ড সরবরাহ করে এমন কিছু যা আমি সত্যিই ব্যবহার করতে পারি। তবে এ জাতীয় চিত্র যুক্ত করার কোনও পদ্ধতি বলে মনে হচ্ছে না।

সুতরাং আমি অবাক হয়েছি আপনি কীভাবে এই উপাদানটি ব্যবহার করা হয় তা উদাহরণ পোস্ট করতে পারেন।


বিলবোর্ডটি আমি যা প্রত্যাশা করে তা করে? অথবা অন্য কিছু? (আমি এটি চিত্রটি ক্যামেরার সামনে রাখার আশা করব))
ইভোরর

@ এভেরলর আমি এটিই প্রত্যাশা করবো তবে এখন পর্যন্ত আমি এটিকে কিছু করতে পেরেছি না ।
ফিলিপ

উত্তর:


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

প্রতিবিম্ব দ্বারা এমনকি চিত্রগুলি সেট করার কোনও উপায় নেই। কেউ ভাবতে পারেন: "ঠিক আছে, আপনি সরাসরি এটি করতে পারবেন না, তবে সম্ভবত কোনও ধরণের কারখানা সরবরাহ করা হয়েছে?" আমি টিপতে রীতিনীতি খুঁজুন এবং decompiler মধ্যে পাবেন: 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(এটি ইউনিটিএডিটার.ডিল থাকছে ) এর আসল কোড রয়েছে। আবার, আমি এটির কোডটি এখানে রাখব না, কারণ এটির নাম থেকে এটি পরিষ্কার হয়ে গেছে যে এটি যাইহোক, পরিদর্শকের চেয়ে বেশি কিছু নয় ।

একই অবস্থা BillboardAssetInspector


বুঝেছি, এটি অভ্যন্তরীণ ব্যবহারের জন্য; কিন্তু এটি ঠিক কোথায় ব্যবহৃত হয়?

স্পিডট্রি সিস্টেমে (বিশেষ করে শেষ চিত্রটি দেখুন)।

ডকুমেন্টেশন এখনই এটি ব্যবহার করার বিরুদ্ধে সতর্কতার পরিবর্তে অকেজো জিনিসগুলি কীভাবে ব্যাখ্যা করে?

সম্ভবত, কেবলমাত্র অভ্যন্তরীণ বিকাশের ডকুমেন্টেশন থেকে সমস্ত কিছু অনুলিপি করা হয়েছে, উন্নত অংশগুলি যা আগতদের জন্য এবং সাধারণ ব্যবহারের জন্য গুরুত্বপূর্ণ; এরপরে ডকুমেন্টেশনের অন্ধকার কোণগুলিকে পোলিশ করতে বিরক্ত করতে ভিআর হাইপে অংশ নেওয়া খুব ব্যস্ত ছিল।

আমরা এটা সম্পর্কে কি করতে পারি?

তাদের বলুন যে তারা এই "অন্ধকার কোণ" ডকুমেন্টেশন উপেক্ষিত, উদাহরণস্বরূপ: মধ্যে একতা সম্পাদক, খোলা Help → Report a bug..., এ What is problem related toনির্বাচন documentation, ইত্যাদি

পরিবর্তে কেউ কী ব্যবহার করতে পারে?

সম্ভাব্য বিকল্পগুলির মধ্যে রয়েছে:


2
অন্য বিকল্প হিসাবে: প্রায়শই যখন আমাকে একগুচ্ছ বিলবোর্ড রাখার দরকার হয় তখন আমি একটি কণার সিস্টেম ব্যবহার করি যার সাথে এর নির্গমন এবং অ্যানিমেশন বন্ধ থাকে তাই আমি যেখানে চাই সেখানে প্রতিটি বিলবোর্ডযুক্ত কোয়াড ম্যানুয়ালি রাখতে পারি।
ডিএমগ্রিগরি

@ ডিএমজিগ্ররি একমত হতে পারে না, ityক্যের কণা সিস্টেম এমন অনেক কিছুর জন্য দুর্দান্ত যা "কণা" থেকে খুব দূরেও নয়। আরও ভাল, ইউনিটি ৫ এর পর থেকে, কণা সিস্টেম কাস্টমাইজ করার জন্য সমর্থনটি সুস্পষ্টভাবে উন্নত / অনুকূলিত হয়েছিল। উত্তরের এই বিকল্পটি আমার যুক্ত করা উচিত, বা এই মন্তব্যগুলি যথেষ্ট, আপনি কী ভাবেন?
ম্যাক্সিম কমলভ

আমি মন্তব্যগুলিতে ছেড়ে দেওয়া ভাল বলে মনে করি। যদি কেউ এ সম্পর্কে আরও বিশদ জানতে চান তবে আমি মনে করি এটি একটি নতুন প্রশ্ন জিজ্ঞাসা করার মতো যথেষ্ট মাংসপুস্তক।
ডিএমগ্রিগরি

অভ্যন্তরীণ ব্যবহারের জন্য আমি এটি বিশ্বাস করি না, ডক বলেছেন: "বিলবোর্ডটি কীভাবে বর্ণনা করা হয় তা জানার পরে আপনি নিজের তৈরিও করতে পারেন।" - ডকস.উইনিটিটিডি 3
স্ক্রিপ্ট

@ 123iamking এবং এখন আরও সম্পত্তি প্রকাশিত হয়েছে। সুতরাং, হ্যাঁ, সম্ভবত এখন এগুলি সরাসরি ব্যবহার করা সম্ভব।
ম্যাক্সিম কমলভ

1

বিলবোর্ডরেন্ডারারের ব্যবহার করতে আপনার বিলবোর্ড সম্পদ প্রয়োজন, আপনি সি # স্ক্রিপ্টের সাহায্যে বিলবোর্ড সম্পদ তৈরি করতে পারেন। পরীক্ষা করে দেখুন এই পোস্টে

বিলবোর্ড অ্যাসেটে এর মতো সামগ্রী রয়েছে: বিলবোর্ড.সেট

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

এখানে সি # কোড যা উপরের ফাইলটি তৈরি করতে ব্যবহৃত হয়েছিল

 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.