Unity에서 BillboardRenderer를 사용하는 방법은 무엇입니까?


11

버전 5 (?)부터 Unity에는 새로운 component-type이 BillboardRenderer있습니다. 불행히도 문서 는 매우 열악합니다.

"컴포넌트 추가-> 기타-> 빌보드 렌더러"를 클릭하여 인스펙터에 추가 할 수 있지만 분명히해야 Billboard Asset할 일이 있습니다. Unity 인터페이스에서 생성 할 방법이없는 것 같습니다.

BillboardAsset 의 똑같이 가난한 문서 에서 나온 몇 가지 문장 중 하나는 다음 과 같습니다.

imageCount 빌보드를 다른 각도에서 볼 때 전환 할 수있는 사전 구운 이미지 수입니다.

내 최신 프로젝트에는 스프라이트 / 폴리곤 믹스 그래픽이 있으므로 시야각에 따라 다른 스프라이트로 빌보드를 렌더링하는 구성 요소는 실제로 사용할 수 있습니다. 그러나 그러한 이미지를 추가하는 방법은 없습니다.

따라서이 구성 요소가 어떻게 사용되는지 예를 게시 할 수 있는지 궁금합니다.


빌보드가 내가 기대하는대로 작동합니까? 또는 다른 것? (이미지가 카메라를 향하도록 유지해야합니다.)
Evorlor

@Evorlor 저도 그렇게 기대하지만 지금까지는 아무것도 할 수 없었습니다 .
Philipp

답변:


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

말 그대로 반사로 이미지를 설정할 수있는 방법은 없습니다. “좋아요, 직접 할 수는 없지만 어떤 종류의 공장이 있습니까?”라고 생각할 수도 있습니다. 나는 눌러 용도를 찾기 디 컴파일러에서 얻을 : 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. 더 정확하게 말하면, 하나 또는 몇 개의- [WraplessIcall]방법에 의해 . 길고 쓸모없는 [WraplessIcall]멤버 목록이 있으므로 여기에 코드를 넣지 않습니다 .

UnityEngine.dll 콘텐츠 와 달리 ( UnityEditor.dllBillboardAssetInspector상주 ) 실제 코드가 있습니다. 다시 말하지만, 코드에서 Inspector 이상이라는 것은 분명하지 않기 때문에 코드를 여기에 넣지 않습니다 .

와 같은 상황 BillboardAssetInspector.


내부 사용을위한 것입니다. 그러나 정확히 어디에 사용됩니까?

SpeedTree 시스템에서 (특히 마지막 이미지를보십시오).

문서가 왜 즉시 사용하지 말라고 경고하는 대신 쓸모없는 내용을 설명합니까?

아마도 내부 개발 문서, 초보자에게 중요한 개선 된 부분 및 일반적인 사용법에서 모든 것을 복사하여 붙여 넣은 것 같습니다. 그런 다음 VR 문서에 참여하는 데 너무 바빠서 문서의 어두운 부분을 연마하는 것을 귀찮게했습니다.

우리는 그것에 대해 무엇을 할 수 있습니까?

그들은 예를 들어, 문서에서이 "어두운 구석"을 간과 것을 그들에게 알려주기 :에서 유니티 에디터 오픈 Help → Report a bug...에서 What is problem related to선택 documentation

대신 무엇을 사용할 수 있습니까?

가능한 옵션은 다음과 같습니다.


2
또 다른 대안 : 종종 빌보드를 배치해야 할 때 방출 및 애니메이션이 꺼진 파티클 시스템을 사용하므로 원하는 각 빌보드 쿼드를 수동으로 배치 할 수 있습니다.
DMGregory

@DMGregory 동의 할 수 없다. Unity의 파티클 시스템은 원격으로 "입자"에 가깝지 않은 많은 것들에 적합하다. Unity 5부터 파티클 시스템 커스터마이징에 대한 지원이 명시 적으로 개선 / 최적화되었습니다. 이 옵션을 답변에 추가해야합니까, 아니면이 의견이 충분하다면 어떻게 생각하십니까?
Maxim Kamalov

의견을 남기는 것이 좋다고 생각합니다. 누군가가 그것에 대해 더 자세한 정보를 원한다면, 새로운 질문을하기에 충분하다고 생각합니다.
DMGregory

의사는 내부 사용에 대해서는 믿지 않는다고 전했다. "광고판이 어떻게 설명되는지 알고 나면 직접 만들 수도 있습니다." - docs.unity3d.com/ScriptReference/BillboardAsset.html
123iamking

@ 123iamking 그리고 더 많은 속성이 노출되었습니다. 예, 아마도 그것들을 지금 바로 활용하는 것이 가능할 것입니다.
Maxim Kamalov

1

BillboardRenderer를 사용하려면 Billboard Asset이 필요합니다. C # 스크립트로 Billboard Asset을 구성 할 수 있습니다. 이 게시물을 확인하십시오 .

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.