之前在网上看了很多人物血条跟随的方式,都不是很顺手..包括各种偏移的计算啊什么的都不是很完美,于是仔细去看了一篇RectTransform属性的详解,又了解了一下坐标转换的原理,最终得到了一个比较完美而且很简单的方案:
基本实现:
void Start ()
{
Bar = Instantiate(BarPrefab, BarPrefab.transform);
rectBloodPos = Bar.GetComponent<RectTransform>();
rectBloodPos.anchoredPosition = new Vector2 (x, y);//控制偏移量
}
private void Update()
{
Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);
rectBloodPos.anchorMax = Camera.main.ScreenToViewportPoint(vec2);
rectBloodPos.anchorMin = Camera.main.ScreenToViewportPoint(vec2);
}
随物体缩放的实现
如果只实现上面,那么血条的大小只是固定的,如果有多个物体要显示血条,就需要近大远小的效果
public GameObject BarPrefab;
public GameObject BarAnchor;
private GameObject Bar;
public float limit;//与摄像头的距离,超出这个距离就消失
private bool visible;
private void Update()
{
Vector2 vec2 = Camera.main.WorldToScreenPoint (BarAnchor.transform.position);
vec2.y);//控制偏移量
rectBloodPos.anchorMax = Camera.main.ScreenToViewportPoint(vec2);
rectBloodPos.anchorMin = Camera.main.ScreenToViewportPoint(vec2);
float dist = Vector3.Distance(transform.position, CameraAction.instance.camera.transform.position);
if (dist > limit || !visible)
{
Bar.SetActive(false);
}
else
{
Bar.SetActive(true);
}
float one = dist/limit;
float sc = 1.4f - 1f * one;//缩放系数
rectBloodPos.localScale = Vector3.one * sc;
}
private void OnBecameVisible()
{
Debug.Log("Visible");
visible = true;
}
private void OnBecameInvisible()
{
Debug.Log("Invisible");
visible = false;
}
另外第一次接触
OnBecameInvisible()
这两个方法的朋友们注意一下,在编辑器模式中需要确保在Game
和Scene
两个场景下该物体都不可见,以及包含MeshRender
组件才会被调用到