not possible to set the layer in script

void SetLayer(GameObject clone)
    {
        clone.layer = this.gameObject.layer;        //set soldier layer (worked)
        Unit u = clone.GetComponent<Unit>();      

        u.opponentLayer = opponentUnitLayer; //worked
        foreach(Weapon w in u.weapons) 
        {
            w.layerOfBullet = myProjectileLayer;        //set weapon script projectile layer (not worked)
            w.layerOfOpponent = opponentUnitLayer;      //set weapon script opponent (not worked)
        }
    }

How are you copying the values from line 9 and 10 into an actual .layer property on a Weapon GameObject? You did not post that code.