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; }
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); }
// 功能:更新屏幕位置 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); }
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(); } }
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); } } }
// 功能:更新模型顶点(每帧更新) 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(); } } } } }
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]); } }
// 功能:快速清队模型的顶点 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); }
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(); }
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(); }
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(); } } }
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); }
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; } } }
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); } }
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(); }
void OnDestory() { HUDMesh.OnLeaveGame(); }
void Start() { HUDMesh.OnEnterGame(); // 启动游戏场景后调用 }
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(); } }
// 功能:添加一个显示的数字 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); }