【Unity游戏】系列_UI_2d转3d小工具Billboard

Billboard面板

很多时候需要展示一些战斗内的UI

是用UI做呢,还是3D_Camera做呢

举个例子,你开着一辆车,前面突然一辆劳斯莱斯,你是撞墙,还是撞他呢

 当然,我会马上踩刹车

所以,很多时候都是有第三选择的

一般,很多游戏都会用一个中间态的UI,特别在UNITY世界里

既是ui in Canvas,又是 ,当然性能问题这里暂时不说

首先我们需要一个Canvas,选World Space

整体结构如下

 加上我们的主力Script,试试

public class SimpleBillboard : MonoBehaviour 
{
    Camera m_OverrideCamera;

    void Start()
    {
        var canvas = GetComponentInParent<Canvas>();
        if (canvas != null)
        {
            m_OverrideCamera = canvas.worldCamera;
        }
    }
    
    void LateUpdate()
    {
        var camera = m_OverrideCamera;
        if (camera == null)
        {
            camera = Camera.main;
        }
        if (camera == null)
        {
            camera = Camera.current;
        }
        if (camera != null)
        {
            transform.LookAt(transform.position + camera.transform.forward, camera.transform.up);
        }
    }
}

最后结果就如前面第一个图

无论镜头如何转动,朝向如何,text都在合理范围适配,并不会发生变形

这个有点相当于2D转3D了

之后有机会再说说3D转2D的实现

另一种BillBoard实现

frustum = 锥体

using UnityEngine;

public class QuadAdjustCamera : MonoBehaviour
{
    public Camera camera3d;
    public float distance = 10;
    Vector3 oldScale;
    // Start is called before the first frame update
    void Start()
    {
        oldScale = transform.localScale;
    }
    Vector2 CalcWidthAndHeight()
    {
        float frustumHeight = 2.0f * distance * Mathf.Tan(camera3d.fieldOfView * 0.5f * Mathf.Deg2Rad);
        float frustumWidth = frustumHeight * camera3d.aspect;
        return new Vector2(frustumWidth, frustumHeight);
    }
    void SetQuadScale()
    {
        Vector2 furstum = CalcWidthAndHeight();
        transform.localScale = new Vector3(furstum.x* oldScale.x, furstum.y* oldScale.y, 1);
        transform.localPosition = new Vector3(0, 0, distance);
    }
    // Update is called once per frame
    void FixedUpdate()
    {
        SetQuadScale();
    }
}


版权声明:本文为avi9111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。