您的位置:首页 > 移动开发 > Unity3D

Unity角色血条等信息制作

2017-03-20 12:37 459 查看
第一种方法可以使用NGUI控件,但是要注意近大远小

using UnityEngine;
using System.Collections;

public class DriverInfoNGUI : MonoBehaviour {

private Transform mFollowingObject = null;
public float mOffsetY = 2f;
private Camera m3DCamera = null;
private Camera m2DCamera = null;

private Transform mSceneCameraTransform;

private Transform mUICameraTransform;

private Transform mTransform;

private float mCameraNear = 5;

private float mCameraFar = 80;

private float mNFD;

private float mFactor = 0.9f;

private bool mInvisible = true;

private bool mDestroyed = false;
public void SetVisible()
{
mInvisible = true;
}

public void SetOffsetY(float offset)
{
mOffsetY = offset;
}

public float GetOffsetY()
{
return mOffsetY;
}

void OnDestroy()
{
mDestroyed = true;
}

public void SetInVisible()
{
if (mDestroyed)
return;
mInvisible = false;
SetLabelScale(0);

}

public void SetFollowingObject(Transform trs)
{
mFollowingObject = trs;
// CheckCarInCamera check = trs.FindChild("Body").gameObject.AddComponent<CheckCarInCamera>();
// check.driverName = this;
}

private void SetLabelScale(float scale)
{
mTransform.localScale = new Vector3(scale, scale, scale);
}

void Start()
{
mTransform = transform;
m3DCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
mSceneCameraTransform = m3DCamera.transform;
m2DCamera = GameObject.Find("UI").transform.FindChild("Camera").GetComponent<Camera>();
mUICameraTransform = m2DCamera.transform;
mNFD = mCameraFar - mCameraNear;
}
void Update()
{

Vector3 vPos = TransPos(mFollowingObject.position + new Vector3(0, mOffsetY, 0));
mTransform.position = new Vector3(vPos.x, vPos.y, 0);
mTransform.rotation = mUICameraTransform.rotation;
float camD = (mFollowingObject.position - mSceneCameraTransform.position).magnitude;
if (camD <= mCameraNear)
{
camD = mCameraNear;
}
float scale = Mathf.Clamp((mCameraFar - camD) / mNFD, 0f, 1) * mFactor;
mTransform.localScale = new Vector3(scale, scale, scale);
}

//Transform WorldPos in 3DCamera to new WorldPos in 2DCamera. They share the same ScreenPos
Vector3 TransPos(Vector3 worldpos)
{
if (m3DCamera == null || m2DCamera == null)
{
return Vector3.zero;
}
Vector3 screenPos = m3DCamera.WorldToScreenPoint(worldpos);
Vector3 newWorldPos = m2DCamera.ScreenToWorldPoint(screenPos);
return newWorldPos;
}
}


第二种方法是在场景中创建UIPanel,然后将展示控件挂载在控件下面,此时控件将由场景中camera负责渲染
using UnityEngine;
using System.Collections;

public class DriverInfoDisplay : MonoBehaviour {

private Transform mFollowingObject = null;
public float mOffsetY = 2f;
private Camera m3DCamera = null;
private Camera m2DCamera = null;

private Transform mSceneCameraTransform;

private Transform mUICameraTransform;

private Transform mTransform;

private float mCameraNear = 5;

private float mCameraFar = 80;

private float mNFD;

private float mFactor = 0.9f;

private bool mInvisible = true;

private bool mDestroyed = false;
public void SetVisible()
{
mInvisible = true;
}

public void SetOffsetY(float offset)
{
mOffsetY = offset;
}

public float GetOffsetY()
{
return mOffsetY;
}

void OnDestroy()
{
mDestroyed = true;
}

public void SetInVisible()
{
if (mDestroyed)
return;
mInvisible = false;
SetLabelScale(0);

}

public void SetFollowingObject(Transform trs)
{
mFollowingObject = trs;
// CheckCarInCamera check = trs.FindChild("Body").gameObject.AddComponent<CheckCarInCamera>();
// check.driverName = this;
}

private void SetLabelScale(float scale)
{
mTransform.localScale = new Vector3(scale, scale, scale);
}

void Start()
{
mTransform = transform;
m3DCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
mSceneCameraTransform = m3DCamera.transform;
m2DCamera = GameObject.Find("UI").transform.FindChild("Camera").GetComponent<Camera>();
mUICameraTransform = m2DCamera.transform;

mNFD = mCameraFar - mCameraNear;
}
void Update()
{

//Vector3 vPos = TransPos(m_goFollowing.position + new Vector3(0, m_fOffset, 0));
//mTransform.position = new Vector3(vPos.x, vPos.y, 0);
//mTransform.rotation = mUICameraTransform.rotation;
//float camD = (m_goFollowing.position - mSceneCameraTransform.position).magnitude;
//if (camD <= mCameraNear)
//{
// camD = mCameraNear;
//}
//float scale = Mathf.Clamp((mCameraFar - camD) / mNFD, 0f, 1) * mFactor;
//mTransform.localScale = new Vector3(scale, scale,scale);

mTransform.position = mFollowingObject.position;
mTransform.position += new Vector3(0,mOffsetY,0);
Vector3 vecUp = mSceneCameraTransform.rotation * Vector3.up;

mTransform.LookAt(mTransform.position + mSceneCameraTransform.rotation * Vector3.back, vecUp);
mTransform.Rotate(Vector3.up * 180);
}

//Transform WorldPos in 3DCamera to new WorldPos in 2DCamera. They share the same ScreenPos
Vector3 TransPos(Vector3 worldpos)
{
if (m3DCamera == null || m2DCamera == null)
{
return Vector3.zero;
}
Vector3 screenPos = m3DCamera.WorldToScreenPoint(worldpos);
Vector3 newWorldPos = m2DCamera.ScreenToWorldPoint(screenPos);
return newWorldPos;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: