/// <summary>
    /// 技能是否正在CD中, 考虑自身CD和公共CD
    /// </summary>
    /// <param name="skillID"></param>
    /// <returns></returns>
    public bool IsOnCD(int skillID)
    {
        Debug.Assert(m_SkillIDToSkill.ContainsKey(skillID));
        if (!m_SkillIDToSkill.ContainsKey(skillID))
        {
            return(false);
        }

        PlayerSkillVO skill = m_SkillIDToSkill[skillID];

        // 如果是武器技能, 则不考虑公共CD
        return(skill.GetRemainingCD() > 0 ||
               Time.time < m_SkillTypeToGlobalCDEndTime[GetSkillType(skillID)]);
    }
    public float GetRemainingCD(int skillID)
    {
        Debug.Assert(m_SkillIDToSkill.ContainsKey(skillID));
        if (!m_SkillIDToSkill.ContainsKey(skillID))
        {
            return(0f);
        }

        PlayerSkillVO skill             = m_SkillIDToSkill[skillID];
        float         skillCD           = skill.GetRemainingCD();
        float         remainingGlobalCD = Mathf.Clamp(m_SkillTypeToGlobalCDEndTime[(SkillType)skill.GetSkillGrow().SkillType] - Time.time, 0, 99999f);

        if (remainingGlobalCD > skillCD)
        {
            skillCD = remainingGlobalCD;
        }

        return(skillCD);
    }