// 功能:更新屏幕位置 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); }
// 功能:添加一个显示的数字 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); }
// 功能:执行数字的动画效果 void PlayAnimation(HUDNumberEntry pNode, bool bFirst) { int nIndex = (int)pNode.m_nType; float currentDuration = (Time.time - pNode.m_fStartTime); if (m_bPuase) { currentDuration = m_currentDuration; } HudAnimAttibute attrib = m_aTtribute[nIndex]; bool bDirty = false; float fAlpha = attrib.AlphaCurve.Evaluate(currentDuration); //淡出效果; float fScale = attrib.ScaleCurve.Evaluate(currentDuration); //变大效果; float fPos = attrib.MoveCurve.Evaluate(currentDuration); //Y轴移动效果; float fOldAlpha = pNode.m_fAlpha; float fOldScale = pNode.m_fAniScale; float fOldMoveX = pNode.m_vMove.x; float fOldMoveY = pNode.m_vMove.y; pNode.m_fAlpha = fAlpha; pNode.m_fAniScale = fScale; if (attrib.ScreenAlign) { pNode.m_vMove.x = 0.0f; pNode.m_vMove.y = fPos * m_fScreenScaleY; } else { pNode.m_vMove.x = attrib.OffsetX * m_fScreenScaleX; pNode.m_vMove.y = (attrib.OffsetY + fPos) * m_fScreenScaleY; } pNode.m_bStop = currentDuration > m_fDurationTime; if (m_bPuase) { pNode.m_bStop = false; } int nAlpha = (int)(fAlpha * 255.0f + 0.5f); if (nAlpha < 0) { nAlpha = 0; } if (nAlpha > 255) { nAlpha = 255; } byte alpha = (byte)nAlpha; if (!bFirst) { bDirty = pNode.UpdateScreenPos(ref attrib); } else { bDirty = true; } if (!bDirty) { if (Mathf.Abs(fOldAlpha - pNode.m_fAlpha) > 0.0001f) { bDirty = true; } if (!bDirty && Mathf.Abs(fOldScale - pNode.m_fScale) > 0.0001f) { bDirty = true; } if (!bDirty && Mathf.Abs(fOldMoveX - pNode.m_vMove.x) > 0.0001f) { bDirty = true; } if (!bDirty && Mathf.Abs(fOldMoveY - pNode.m_vMove.y) > 0.0001f) { bDirty = true; } } if (!bDirty) { return; } fScale *= pNode.m_fScale; // 更新顶点数据 Vector2 vScreenPos = pNode.m_vScreenPos; Vector2 vMove = pNode.m_vMove; for (int i = pNode.m_aSprite.size - 1; i >= 0; --i) { HUDVertex v = pNode.m_aSprite[i]; v.Move = vMove; v.WorldPos = pNode.m_vPos; v.ScreenPos = vScreenPos; v.Scale = fScale; v.clrLU.a = alpha; v.clrLD.a = alpha; v.clrRU.a = alpha; v.clrRD.a = alpha; v.hudMesh.VertexDirty(); } }