Exemple #1
0
        bool m_bHideAllTalk       = false; // 是不是隐藏所有气泡
        // 一个对象的头顶只能一个气泡对话
        public void ShowTalk(Transform tf, string szTalk, float fOffsetY, float fShowTime, int nColorIndex = 0)
        {
            EraseTalk(tf);

            Camera caMain = HUDMesh.GetHUDMainCamera();

            if (fShowTime < 1f)
            {
                fShowTime = HudSetting.Instance.m_fTalkShowTime;
            }
            fOffsetY += HudSetting.Instance.m_fTalkOffsetY;

            Vector3 vPos = tf.position;
            HUDTalk talk = new HUDTalk();

            talk.m_tf         = tf;
            talk.m_vPos       = vPos;
            talk.m_fOffsetY   = fOffsetY;
            talk.m_fStartTime = Time.time;
            talk.m_fEndTime   = talk.m_fStartTime + fShowTime;
            vPos.y           += fOffsetY;
            talk.m_vScreenPos = caMain.WorldToScreenPoint(vPos);
            talk.CaleCameraScale(caMain.transform.position);
            talk.ShowTalk(szTalk, nColorIndex);
            m_TalkList.Add(talk);
            m_bMeshDirty = true;
        }
Exemple #2
0
    public HUDMesh QueryMesh(int nAtlasID)
    {
        // 先从当前有效的Mesh的找
        for (int i = m_ValidList.size - 1; i >= 0; --i)
        {
            if (m_ValidList[i].AtlasID == nAtlasID)
            {
                return(m_ValidList[i]);
            }
        }
        // 从所有的里面找
        for (int i = m_MeshList.size - 1; i >= 0; --i)
        {
            if (m_MeshList[i].AtlasID == nAtlasID)
            {
                m_ValidList.Add(m_MeshList[i]);
                m_MeshList[i].SetAtlasID(nAtlasID);
                m_bMeshDirty = true;
                return(m_MeshList[i]);
            }
        }
        HUDMesh pHudMesh = new HUDMesh();

        pHudMesh.SetAtlasID(nAtlasID);
        m_MeshList.Add(pHudMesh);
        m_ValidList.Add(pHudMesh);
        m_bMeshDirty = true;
        return(pHudMesh);
    }
Exemple #3
0
    // 功能:更新屏幕位置
    public bool UpdateScreenPos(ref HudAnimAttibute attrib)
    {
        if (attrib.ScreenAlign)
        {
            return(false);
        }

        if (m_tf != null)
        {
            Vector3 vPos = m_tf.position;
            Vector3 v    = vPos - m_vPos;
            if (v.x * v.x + v.y * v.y + v.z * v.z > 0.00001f)
            {
                Camera caMain = HUDMesh.GetHUDMainCamera();
                if (caMain != null)
                {
                    m_vPos       = vPos;
                    m_vScreenPos = caMain.WorldToScreenPoint(vPos);
                    Vector3 vCameraPos = caMain.transform.position;
                    CaleCameraScale(vCameraPos);
                    return(true);
                }
            }
        }
        return(false);
    }
Exemple #4
0
    void  CheckPos(bool bCameraDirty, Vector3 vCameraPos)
    {
        if (m_tf == null)
        {
            m_fEndTime = 0.0f;
            return;
        }
        Vector3 vPos = m_tf.position;

        vPos.y += m_fOffsetY;
        if (!bCameraDirty)
        {
            Vector3 v = vPos - m_vPos;
            if (v.x * v.x + v.y * v.y + v.z * v.z < 0.000001f)
            {
                return;
            }
        }
        m_vPos = vPos;
        CaleCameraScale(vCameraPos);
        Camera caMain = HUDMesh.GetHUDMainCamera();

        if (caMain != null)
        {
            m_vScreenPos = caMain.WorldToScreenPoint(vPos);
            OnChangeScreenPos();
        }
    }
Exemple #5
0
    public void RenderTo(CommandBuffer cmdBuffer)
    {
        m_bMeshDirty = false;
        if (m_ValidList.size == 0)
        {
            return;
        }
        Matrix4x4 matWorld = Matrix4x4.identity;

        for (int i = 0, nSize = m_ValidList.size; i < nSize; ++i)
        {
            HUDMesh mesh = m_ValidList[i];
            if (mesh.SpriteNumb > 0 && mesh.AtlasID != 0)
            {
                cmdBuffer.DrawMesh(mesh.m_Mesh, matWorld, mesh.m_mat);
            }
        }
        for (int i = 0, nSize = m_ValidList.size; i < nSize; ++i)
        {
            HUDMesh mesh = m_ValidList[i];
            if (mesh.SpriteNumb > 0 && mesh.AtlasID == 0)
            {
                cmdBuffer.DrawMesh(mesh.m_Mesh, matWorld, mesh.m_mat);
            }
        }
    }
Exemple #6
0
 // 功能:更新模型顶点(每帧更新)
 public void FillMesh()
 {
     for (int i = m_ValidList.size - 1; i >= 0; --i)
     {
         HUDMesh mesh = m_ValidList[i];
         if (mesh.IsDirty())
         {
             int nOldSpriteNumb = mesh.OldSpriteNumb;
             mesh.UpdateLogic();
             int nCurSpriteNumb = mesh.SpriteNumb;
             if (nOldSpriteNumb != 0 && nCurSpriteNumb == 0)
             {
                 m_bMeshDirty = true;
             }
             else if (nOldSpriteNumb == 0 && nCurSpriteNumb != 0)
             {
                 m_bMeshDirty = true;
             }
             if (nCurSpriteNumb == 0)
             {
                 m_ValidList.RemoveAt(i);
                 if (m_MeshFont == mesh)
                 {
                     m_curFontMesh = null;
                 }
                 else
                 {
                     mesh.CleanAllVertex();
                 }
             }
         }
     }
 }
Exemple #7
0
 void  OnPush(HUDNumberEntry pNode)
 {
     for (int i = 0; i < pNode.m_aSprite.size; ++i)
     {
         HUDMesh hudMesh = m_MeshRender.QueryMesh(pNode.m_aSprite[i].AtlasID);
         pNode.m_aSprite[i].hudMesh = hudMesh;
         hudMesh.PushHUDVertex(pNode.m_aSprite[i]);
     }
 }
Exemple #8
0
 // 功能:快速清队模型的顶点
 public void FastClearVertex()
 {
     m_curFontMesh = null;
     for (int i = m_ValidList.size - 1; i >= 0; --i)
     {
         HUDMesh mesh = m_ValidList[i];
         mesh.FastClearVertex();
     }
     m_ValidList.Clear();
 }
        public int RegisterTitle(Transform tf, float fOffsetY, bool bIsMain)
        {
            Camera caMain = HUDMesh.GetHUDMainCamera();

            if (bIsMain)
            {
                m_tfMain = tf;
            }

            Vector3      vPos  = tf.position;
            HUDTitleInfo title = new HUDTitleInfo();

            title.m_tf       = tf;
            title.m_bIsMain  = bIsMain;
            title.m_vPos     = vPos;
            title.m_fOffsetY = fOffsetY;
            if (caMain != null)
            {
                vPos.y            += fOffsetY + HudSetting.Instance.m_fTitleOffsetY;
                title.m_vScreenPos = caMain.WorldToScreenPoint(vPos);
                title.CaleCameraScale(caMain.transform.position);
            }
            int nID = ++m_nHudID;

            title.m_nTitleID = nID;
            m_HudTitles[nID] = title;

            if (bIsMain)
            {
                title.m_pBatcher = m_StaticBatcher;
            }
            else
            {
                title.m_pBatcher = m_DynamicBatcher;
            }
            title.m_fLastMoveTime = Time.time;
            title.m_pBatcher.PushTitle(title);

            if (!m_bAddUpdate)
            {
                m_bAddUpdate = true;
                UpdateManager.AddLateUpdate(null, 0, UpdateLogic);
            }
            if (!m_bInitFontCallback)
            {
                m_bInitFontCallback = true;

                UIFont uiFont = HUDTitleInfo.GetHUDTitleFont();
                Font.textureRebuilt += OnAllFontChanged;
            }

            return(nID);
        }
Exemple #10
0
 public void Release()
 {
     for (int i = 0; i < m_MeshList.size; ++i)
     {
         m_MeshList[i].Release();
         m_MeshList[i] = null;
     }
     m_MeshFont    = null;
     m_curFontMesh = null;
     m_MeshList.Clear();
     m_ValidList.Clear();
 }
Exemple #11
0
 public void OnLeaveGame()
 {
     foreach (var v in m_HudTitles)
     {
         HUDTitleInfo title = v.Value;
         title.m_pBatcher.EraseTitle(title);
         title.m_pBatcher = null;
     }
     HUDMesh.OnLeaveGame();
     HUDNumberRender.Instance.OnLeaveGame();
     m_DynamicBatcher.m_MeshRender.Release();
     m_StaticBatcher.m_MeshRender.Release();
     ReleaseCmmmandBuffer();
 }
Exemple #12
0
        public void OnEnterGame()
        {
            HUDMesh.OnEnterGame();
            m_nUpdateVer       = 0;
            m_nBaseUpdateVer   = 0;
            m_nCameraUpdateVer = 0;

            foreach (var v in m_HudTitles)
            {
                HUDTitleInfo title = v.Value;
                if (title.m_pBatcher == null)
                {
                    title.m_pBatcher = m_StaticBatcher;
                    title.m_pBatcher.PushTitle(title);
                    title.RebuildFontUI();
                }
            }
        }
Exemple #13
0
    public HUDMesh FontMesh()
    {
        if (m_curFontMesh != null)
        {
            return(m_curFontMesh);
        }
        if (m_MeshFont == null)
        {
            m_MeshFont = new HUDMesh();
            m_MeshList.Add(m_MeshFont);
        }
        m_curFontMesh = m_MeshFont;
        m_ValidList.Add(m_MeshFont);
        m_bMeshDirty = true;

        UIFont uiFont = HUDTitleInfo.GetHUDTitleFont();

        m_MeshFont.SetFont(uiFont);
        return(m_MeshFont);
    }
Exemple #14
0
    void  FillMeshRender()
    {
        m_MeshRender.FillMesh();
        if (m_MeshRender.m_bMeshDirty)
        {
            m_bMeshDirty = true;
        }
        if (!m_bMeshDirty)
        {
            Camera caMain = HUDMesh.GetHUDMainCamera();
            if (caMain != m_oldCamera)
            {
                m_oldCamera  = caMain;
                m_bMeshDirty = true;
            }
        }

        if (m_bMeshDirty)
        {
            m_bMeshDirty = false;
            if (m_renderCamera != null)
            {
                m_renderCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffects, s_cmdBuffer);
                m_renderCamera      = null;
                m_bAddCommandBuffer = false;
            }
            Camera caMain = HUDMesh.GetHUDMainCamera();
            s_cmdBuffer.Clear();
            if (caMain == null || m_bOpenUI || m_bStartDark || m_bStartMovie)
            {
                return;
            }
            m_MeshRender.RenderTo(s_cmdBuffer);
            if (s_cmdBuffer.sizeInBytes > 0 && caMain != null)
            {
                m_renderCamera = caMain;
                caMain.AddCommandBuffer(CameraEvent.AfterImageEffects, s_cmdBuffer);
                m_bAddCommandBuffer = true;
            }
        }
    }
Exemple #15
0
        void FillMeshRender()
        {
            Camera caMain = HUDMesh.GetHUDMainCamera();

            if (m_cmdBuffer == null)
            {
                m_cmdBuffer = new CommandBuffer();
            }
            else
            {
                if (m_renderCameara != null)
                {
                    m_renderCameara.RemoveCommandBuffer(CameraEvent.AfterImageEffects, m_cmdBuffer);
                }
            }
            m_cmdBuffer.Clear();
            m_renderCameara = null;
            if (m_bOpenUI || m_bStartDark)
            {
                return;
            }

            if (!m_bHideAllTitle)
            {
                m_DynamicBatcher.m_MeshRender.RenderTo(m_cmdBuffer);
                m_StaticBatcher.m_MeshRender.RenderTo(m_cmdBuffer);
            }
            else
            {
                m_DynamicBatcher.m_MeshRender.OnCacelRender();
                m_StaticBatcher.m_MeshRender.OnCacelRender();
            }
            // 添加对话
            HUDTalk.HUDTalkRender.Instance.TryRenderTalk(m_cmdBuffer);

            if (m_cmdBuffer.sizeInBytes > 0)
            {
                m_renderCameara = caMain;
                caMain.AddCommandBuffer(CameraEvent.AfterImageEffects, m_cmdBuffer);
            }
        }
Exemple #16
0
    void ApplyMove(bool bCameraDirty, Vector3 vCameraPos)
    {
        Camera  caMain = HUDMesh.GetHUDMainCamera();
        Vector3 vPos   = m_tf.position;
        Vector3 vScale = m_tf.localScale;

        vPos.y += (m_fOffsetY + HudSetting.Instance.m_fTitleOffsetY) * vScale.y;
        if (!bCameraDirty && !m_bDirty)
        {
            float dx     = vPos.x - m_vPos.x;
            float dz     = vPos.z - m_vPos.z;
            float dy     = vPos.y - m_vPos.y;
            bool  bDirty = !m_bInitHUDMesh;
            if (dx * dx + dz * dz + dy * dy > 0.00001f)
            {
                bDirty = true;
            }
            if (!bDirty)
            {
                return;
            }
            if (m_pBatcher != null)
            {
                m_pBatcher.m_bTitleMove = true;
            }
            m_fLastMoveTime = Time.time;
        }
        m_bDirty     = false;
        m_vPos       = vPos;
        m_vScreenPos = caMain.WorldToScreenPoint(vPos);

        m_fDistToCamera = Vector3.Distance(vCameraPos, m_vPos);
        if (m_bIsMain)
        {
            m_fDistToCamera -= 1000.0f;
        }
        CaleCameraScale(vCameraPos);
        OnChangeScreenPos();
    }
Exemple #17
0
 void OnDestory()
 {
     HUDMesh.OnLeaveGame();
 }
Exemple #18
0
 void Start()
 {
     HUDMesh.OnEnterGame();  // 启动游戏场景后调用
 }
Exemple #19
0
        void BaseUpdateLogic(float delta)
        {
            m_nBaseUpdateVer++;
            Camera caMain = HUDMesh.GetHUDMainCamera();

            if (caMain == null)
            {
                return;
            }
            HUDTalk.HUDTalkRender talkRender = HUDTalk.HUDTalkRender.Instance;
            Vector3 vCameraPos   = caMain.transform.position;
            Vector3 vOffset      = vCameraPos - m_vLastCameraPos;
            bool    bCameraDirty = vOffset.x * vOffset.x + vOffset.y * vOffset.y + vOffset.z * vOffset.z > 0.000001f;

            if (!bCameraDirty)
            {
                vOffset = caMain.transform.localEulerAngles - m_vLastEulerAngles;
                if (vOffset.x * vOffset.x + vOffset.y * vOffset.y + vOffset.z * vOffset.z > 0.000001f)
                {
                    bCameraDirty = true;
                }
            }
            bool bMeshDirty = m_bMeshDirty;

            if (caMain != m_oldCamera)
            {
                m_oldCamera  = caMain;
                bCameraDirty = true;
                bMeshDirty   = true;
            }
            if (bCameraDirty)
            {
                m_vLastCameraPos     = vCameraPos;
                m_vLastEulerAngles   = caMain.transform.localEulerAngles;
                m_fLastCheckMoveTime = Time.time;
                float fScaleX = Screen.width / 1280.0f;
                float fScaleY = Screen.height / 720.0f;
                float fScale  = fScaleX > fScaleY ? fScaleX : fScaleY;
                HUDMesh.s_fCameraScaleX = HUDMesh.s_fCameraScale * fScale;
                HUDMesh.s_fCameraScaleY = HUDMesh.s_fCameraScale * fScale;
                CaleNumberScale(vCameraPos);
            }
            else
            {
                // 切换
                float fNow = Time.time;
                if (m_fLastCheckMoveTime + 2.0f < fNow)
                {
                    m_fLastCheckMoveTime = fNow;
                    SwitchDynamieStatic(); // 这个不可以转换是什么鬼,有BUG
                }
            }

            // NPC对话
            talkRender.UpdateLogic(bCameraDirty, vCameraPos);
            if (talkRender.IsMeshDirty())
            {
                bMeshDirty = true;
            }

            if (m_bHideAllTitle != HudSetting.Instance.HideAllTitle)
            {
                m_bHideAllTitle = HudSetting.Instance.HideAllTitle;
                bMeshDirty      = true;
            }

            // 静态批
            m_StaticBatcher.UpdateLogic(bCameraDirty, vCameraPos);
            if (m_StaticBatcher.m_MeshRender.m_bMeshDirty)
            {
                bMeshDirty = true;
            }

            // 动态批
            m_DynamicBatcher.UpdateLogic(bCameraDirty, vCameraPos);
            if (m_DynamicBatcher.m_MeshRender.m_bMeshDirty)
            {
                bMeshDirty = true;
            }

            // 处理二级面板开启
            if (m_bOpenUI != m_bOldOpenUI)
            {
                m_bOldOpenUI = m_bOpenUI;
                bMeshDirty   = true;
            }
            else if (m_bOpenUI)
            {
                //if (caMain.cullingMask != 0)
                //{
                //    m_bNpcTalk = false; // 强制隐藏(界面上层的错误)
                //}
            }

            // 屏幕变黑后的处理
            if (m_bStartDark != m_bOldStartDark)
            {
                m_bOldStartDark = m_bStartDark;
                bMeshDirty      = true;
            }
            else if (m_bStartDark)
            {
                if (m_fStartDarkTime + m_fDarkTime < Time.time)
                {
                    m_bStartDark = false;
                }
            }
            if (m_bMeshDirty)
            {
                m_bMeshDirty = false;
                bMeshDirty   = true;
            }

            // 写和缓冲BUFF
            if (bMeshDirty)
            {
                FillMeshRender();
            }
        }
Exemple #20
0
    // 功能:添加一个显示的数字
    public void  AddHudNumber(Transform tf, HUDNumberRenderType nType, int nNumber, bool bShowHead, bool bShowAdd, bool bShowSub)
    {
        if (m_bOpenUI || m_bStartDark || m_bStartMovie)
        {
            return;
        }

        Vector3 vPos   = tf.position;
        int     nIndex = (int)nType;
        //if (nIndex < 0 || nIndex > (int)HUDNumberRenderType.HUD_SHOW_NUMBER)
        //    return;
        Camera caMain = HUDMesh.GetHUDMainCamera();

        if (caMain == null)
        {
            return;
        }
        if (!m_bInit)
        {
            m_bInit = true;
            InitHUD();
        }
        if (!m_bAddUpdateLogic)
        {
            m_bMeshDirty = true;
            UpdateManager.AddLateUpdate(null, 0, UpdateLogic);
        }
        HudAnimAttibute attrib = m_aTtribute[nIndex];

        HUDNumberEntry pNode = QueryHudNumber(nType);

        pNode.m_nType = nType;
        pNode.m_pNext = m_ValidList;
        m_ValidList   = pNode;

        if (nNumber < 0)
        {
            bShowSub = true;
            nNumber  = -nNumber;
        }

        pNode.reset();

        // 初始化
        pNode.m_nSpriteGap = attrib.SpriteGap;
        pNode.m_fStartTime = Time.time;
        pNode.m_tf         = tf;
        pNode.m_vPos       = vPos;

        if (caMain != null)
        {
            // 如果按屏幕对齐
            if (attrib.ScreenAlign)
            {
                Vector3 v1 = caMain.WorldToScreenPoint(vPos);
                v1.x = attrib.OffsetX;
                v1.y = attrib.OffsetY;
                float fScaleX = (float)Screen.width / 1280.0f;
                float fScaleY = (float)Screen.height / 1280.0f;

                if (attrib.ScreenAlignType == HUDAlignType.align_left)
                {
                    v1.x = attrib.OffsetX;
                    v1.y = attrib.OffsetY;
                }
                else if (attrib.ScreenAlignType == HUDAlignType.align_right)
                {
                    v1.x = 1280.0f - attrib.OffsetX;
                    v1.y = attrib.OffsetY;
                }
                else
                {
                    v1.x = Screen.width / 2.0f + attrib.OffsetX;
                    v1.y = attrib.OffsetY;
                }
                v1.x *= fScaleX;
                v1.y *= fScaleY;

                pNode.m_vScreenPos = v1;
                vPos         = caMain.ScreenToWorldPoint(v1);
                pNode.m_vPos = vPos;

                Vector3 vCameraPos = caMain.transform.position;
                pNode.CaleCameraScale(vCameraPos);
            }
            else
            {
                pNode.m_vScreenPos = caMain.WorldToScreenPoint(vPos);
                Vector3 vCameraPos = caMain.transform.position;
                pNode.CaleCameraScale(vCameraPos);
            }
        }

        float            y        = 0.0f;
        HUDSprtieSetting pSetting = m_Settings[nIndex];

        if (bShowHead && pSetting.m_nHeadID != 0)
        {
            pNode.PushSprite(y, pSetting.m_nHeadID);
        }
        bool bHaveNumber = true;

        if (nType == HUDNumberRenderType.HUD_SHOW_ABSORB ||
            nType == HUDNumberRenderType.HUB_SHOW_DODGE)
        {
            bHaveNumber = false;
        }
        if (bHaveNumber)
        {
            if (bShowAdd && pSetting.m_nAddID != 0)
            {
                pNode.PushSprite(y, pSetting.m_nAddID);
            }
            else if (bShowSub && pSetting.m_nSubID != 0)
            {
                pNode.PushSprite(y, pSetting.m_nSubID);
            }
            m_tempNumb.Clear();
            int nI = 0;
            do
            {
                nI       = nNumber % 10;
                nNumber /= 10;
                m_tempNumb.Add(nI);
            } while (nNumber > 0);
            // 反转数组
            m_tempNumb.Reverse();
            for (int i = 0, nSize = m_tempNumb.size; i < nSize; ++i)
            {
                nI = m_tempNumb[i];
                pNode.PushSprite(y, pSetting.m_NumberID[nI]);
            }
        }
        // 居中处理吧
        switch (attrib.AlignType)
        {
        case HUDAlignType.align_right:
            pNode.MakeRight();
            break;

        case HUDAlignType.align_center:
            pNode.MakeCenter();
            break;

        default:
            pNode.MakeLeft();
            break;
        }

        // 申请纹理
        OnPush(pNode);

        if (!m_bCaleScreenScale)
        {
            CaleScreenScale();
        }
        PlayAnimation(pNode, true);
    }