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版权协议,转载请附上原文出处链接和本声明。