public override void  OnMsg(int msgID, object args)
    {
        if (!isActive)
        {
            return;
        }
        if (msgID == (int)Const_Util.UNIT_MSG.COLLIDER_OCCUR)
        {
            colliderCD = TestConfig.ColliderHeroHitBaseCD + TestConfig.ColliderHeroHitBaseCD * TestConfig.ColliderHeroHitCDRate * speed.y;
        }
        else if (msgID == (int)Const_Util.UNIT_MSG.GAS_ACC)
        {
            if (gasMoveEvent != null)
            {
                return;
            }
            gasMoveEvent = new SeqEvent();
            OneTimerEvent oneEvent     = new OneTimerEvent(GasMoveSpeedChgUp);
            TimerEvent    continueTime = new TimerEvent(TestConfig.NitragenStayTime + TestConfig.NitragenMoveTime);
            gasMoveEvent.AddEvent(oneEvent);
            gasMoveEvent.AddEvent(continueTime);

            OneTimerEvent moveDownEvent = new OneTimerEvent(MoveSpeedChgDown);
            TimerEvent    stayTime      = new TimerEvent(TestConfig.NitragenMoveTime);
            gasMoveEvent.AddEvent(moveDownEvent);
            gasMoveEvent.AddEvent(stayTime);
            gasMoveEvent.Begin();
        }
        else if (msgID == (int)Const_Util.UNIT_MSG.SKILL_DESC)
        {
            if (skillMoveEvent != null)
            {
                return;
            }
            mSkillHitInfo  = (BattleMsgDef.SkillHitInfo)args;
            skillMoveEvent = new SeqEvent();
            OneTimerEvent chgEvent     = new OneTimerEvent(SkillMoveSpeedChgDown);
            TimerEvent    continueTime = new TimerEvent(mSkillHitInfo.chgTime + mSkillHitInfo.continueTime);
            skillMoveEvent.AddEvent(chgEvent);
            skillMoveEvent.AddEvent(continueTime);

            OneTimerEvent resetSpeedEvent = new OneTimerEvent(SkillMoveSpeedReset);
            TimerEvent    stayTime        = new TimerEvent(mSkillHitInfo.resetTime);
            skillMoveEvent.AddEvent(resetSpeedEvent);
            skillMoveEvent.AddEvent(stayTime);
            skillMoveEvent.Begin();
        }
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (skillCom == null)
        {
            skillCom = GetCom("SkillCom") as SkillCom;
        }

        if (skillCom == null)
        {
            return;
        }

        if (other.transform.tag == "SkillDrop" && this.transform.tag == "Player")
        {
            if (getRandomSkillCD <= 0.0f && !skillCom.HasSkill())
            {
                SkillBrushMgr.instance.ReleaseItemByID(other.transform.parent.gameObject.GetInstanceID());
                SendMsg((int)Const_Util.UNIT_MSG.GET_SKILL, null);
                getRandomSkillCD = 1.0f;
            }
        }
        else if (other.transform.tag == "Skill" && this.transform.tag == "Player")
        {
            if (skillEfxHitCD > Const_Util.FLT_EPSILON)
            {
                return;
            }
            SkillBaseInfoCom skillInfoCom = other.transform.parent.GetComponent <SkillBaseInfoCom>();
            if (!CheckSKillHitValid(this.transform, skillInfoCom))
            {
                return;
            }
            // disable skill efx obj
            if (other.transform.parent != null)
            {
                other.transform.parent.gameObject.SetActive(false);
            }
            int   skillID = skillInfoCom.mSkillID;
            SKILL skill   = DataCfgMgr.instance.GetSkill(skillID);
            // play hit efx
            SendMsg((int)Const_Util.UNIT_MSG.SKILL_HIT_EFX, skillID);

            BattleMsgDef.SkillHitInfo skillHitEfx = new BattleMsgDef.SkillHitInfo((int)skill.type, skill.speed_scale,
                                                                                  skill.chg_time, skill.continue_time, skill.reset_time);
            switch (skill.type)
            {
            case (uint)Const_Util.SKILL_TYPE.SPEED_DESC:
            {
                SendMsg((int)Const_Util.UNIT_MSG.SKILL_DESC, skillHitEfx);
                break;
            }

            case (uint)Const_Util.SKILL_TYPE.SPEED_STOP:
            {
                break;
            }

            case (uint)Const_Util.SKILL_TYPE.SCREEN_PIC:
            {
                break;
            }

            case (uint)Const_Util.SKILL_TYPE.SELF_BUFF:
            {
                break;
            }

            default:
            {
                Debug.LogError("ColliderCom OnTriggerEnter2D undefine (int)skill.type:" + skill.type.ToString());
                break;
            }
            }

            skillEfxHitCD = 1.0f;
        }

        if (collisionCD > Const_Util.FLT_EPSILON)
        {
            return;
        }
        if (other.transform.tag == "Player")
        {
            StatusCom             statusCom = other.gameObject.GetComponent <StatusCom>();
            Const_Util.UnitStatus status    = statusCom.GetStatus();
            if (status != Const_Util.UnitStatus.FLY)
            {
                if (this.transform.tag == "Enemy")
                {
                    DoOnDestroy();
                }
                else
                {
                    SendMsg((int)Const_Util.UNIT_MSG.COLLIDER_OCCUR, null);
                }
            }
            collisionCD = 1.0f;
        }
        else if (other.transform.tag == "Enemy")
        {
            SendMsg((int)Const_Util.UNIT_MSG.COLLIDER_OCCUR, null);
            collisionCD = 1.0f;
        }
    }