// 依照部件啟動傷害特效
    public string ActiveDamageEffect( GameObject _Attacker , string _ComponentObjName )
    {
        // Debug.Log( "ActiveDamageEffect() " + _ComponentObjName ) ;

        UnitData unitData = this.gameObject.GetComponent<UnitData>() ;

        // find correct effect object

        DamageEffect newDamage = null ;

        string [] strVec = ConstName.GetSplitVec( _ComponentObjName ) ;
        if( strVec.Length > 1 &&
            strVec[1] != ConstName.UnitDataComponentUnitIntagraty )
        {
            // it's a component ,
            // active shield effect
            string ShieldComponentName = strVec[ 1 ] ;

            if( null != unitData &&
                true == unitData.componentMap.ContainsKey( ShieldComponentName ) &&
                true == unitData.m_ShieldDataSet.ContainsKey( ShieldComponentName )
                 )
            {
                UnitComponentData componentData = unitData.componentMap[ ShieldComponentName ] ;
                ComponentDataSet shieldSet = unitData.m_ShieldDataSet[ ShieldComponentName ] ;
                if( false == componentData.IsOffline() )
                {
                    newDamage = new DamageEffect() ;
                    newDamage.m_EffectObj.Setup( shieldSet.Effect3DObject ) ;
                    newDamage.IsDestroyAtEnd = false ;
                    newDamage.Start() ;
                    ObjectShakeEffect shake = shieldSet.Effect3DObject.GetComponent<ObjectShakeEffect>() ;
                    if( null != shake )
                    {
                        shake.Active( true ) ;
                    }
                }
            }

        }
        else
        {
            // it's unit
            // active sparks effect
            string sparksTemplateName = ConstName.EffectSparksTemplateName ;
            string effectObjName = ConstName.CreateEffectName( this.gameObject.name , sparksTemplateName , true ) ;
            GameObject effectObj = PrefabInstantiate.CreateByInit( sparksTemplateName ,
                                                                   effectObjName ,
                                                                   this.gameObject.transform.position ,
                                                                   this.gameObject.transform.rotation ) ;
            // Debug.Log( "ActiveDamageEffect() effectObjName" + effectObjName ) ;
            if( null == effectObj )
            {
                Debug.Log( "ActiveDamageEffect() null == effectObj=" + sparksTemplateName ) ;
                return "" ;
            }

            // parent
            effectObj.transform.parent = this.gameObject.transform ;

            newDamage = new DamageEffect() ;
            newDamage.m_EffectObj.Setup( effectObj ) ;
            newDamage.IsDestroyAtEnd = true ;
            newDamage.Start() ;
        }

        string retEffectName = "" ;

        if( null != newDamage )
        {
            this.m_DamageEffects.Add( newDamage ) ;
            retEffectName = newDamage.EffectName() ;
        }

        // push effect
        // try add shift effect
        if( null != unitData )
        {
            Vector3 ToAttacker = this.gameObject.transform.position - _Attacker.transform.position ;
            ToAttacker.y = 0 ;// do not move in y direction
            ToAttacker.Normalize() ;
            // Debug.Log( ToAttacker ) ;

            ShiftEffect shiftDamage = new ShiftEffect() ;
            shiftDamage.m_ShiftVec = ToAttacker ;

            shiftDamage.m_TargetObject = this.gameObject ;
            shiftDamage.StartByTime(1.0f) ;
            this.m_DamageEffects.Add( shiftDamage ) ;
            //*/
        }

        return retEffectName ;
    }