您的位置:首页 > 产品设计 > UI/UE

ugui物体随着摄像机跟随3d场景物体显示

2017-10-19 16:34 465 查看
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InScreenFollowScene : MonoBehaviour
{
    private Transform mFollowTrans;
    private RectTransform mRectTrans;

    private void Awake ()
    {
        mRectTrans = this.GetComponent<RectTransform> ();
    }

    public void InitFollow (Transform followTrans)
    {
        mFollowTrans = followTrans;
        CalculateFollowPosAndScale ();
    }

    // Update is called once per frame
    void Update ()
    {
        if (null == mFollowTrans)
            return;
        UpdateTitlePosition ();
    }

    private Vector2 mAnchorMin;
    private Vector2 mAnchorMax;
    private Vector3 mLocalPos;

    const float OriginSize = 1.6f;
    const float FarSize = 0.5f;
    const float InvisibaleSize = 0.8f;

    private void UpdateTitlePosition ()
    {
        //  if (Time.frameCount % 5 != 0)
        //      return;
        if (null == mFollowTrans)
            return;

        CalculateFollowPosAndScale ();
    }

    private void CalculateFollowPosAndScale ()
    {
        Vector3 screenPos = InfraredFightController.Instance.mainCamera.WorldToScreenPoint (mFollowTrans.position);
        mAnchorMin.x = screenPos.x / InfraredFightController.Instance.mainCamera.pixelWidth;
        mAnchorMin.y = screenPos.y / InfraredFightController.Instance.mainCamera.pixelHeight;

        float scaleZ = screenPos.z;
        Camera cam = InfraredFightController.Instance.mainCamera;
        float sz = OriginSize - (OriginSize - FarSize) * (scaleZ - cam.nearClipPlane) / (cam.farClipPlane - cam.nearClipPlane);
        if (scaleZ < cam.nearClipPlane || sz < InvisibaleSize) {
            if (gameObject.activeSelf)
                gameObject.SetActive (false);
        } else {
            if (!gameObject.activeSelf)
                gameObject.SetActive (true);

            transform.localScale = Vector3.one * sz * 5f;//CalculateScaleFactorByCameraFov ();
        }
        mAnchorMax.x = mAnchorMin.x;
        mAnchorMax.y = mAnchorMin.y;
        mRectTrans.anchorMin = mAnchorMin;
        mRectTrans.anchorMax = mAnchorMax;
        mRectTrans.anchoredPosition = Vector2.zero;
        mLocalPos = transform.localPosition;
        mLocalPos.z = 0;
        transform.localPosition = mLocalPos;
    }

    private const float MaxZoomScaleFactor = 0.6f;
    private const float MinZoomScaleFactor = 1f;

    //private float CalculateScaleFactorByCameraFov ()
    //{
    //    float max = UIManager.Instance.MoblieTouchScript.CamZoomMax;
    //    float f = Mathf.Clamp01 ((max - UIManager.Instance.MoblieTouchScript.CamZoom) / (max - UIManager.Instance.MoblieTouchScript.CamZoomMin));
    //    return Mathf.Lerp (MaxZoomScaleFactor, MinZoomScaleFactor, f);
    //}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: