public override void Apply(Entity caster, int skillLevel)
    {
        // consume ammo if needed
        ConsumeRequiredWeaponsAmmo(caster);

        // spawn the skill effect. this can be used for anything ranging from
        // blood splatter to arrows to chain lightning.
        // -> we need to call an RPC anyway, it doesn't make much of a diff-
        //    erence if we use NetworkServer.Spawn for everything.
        // -> we try to spawn it at the weapon's projectile mount
        if (projectile != null)
        {
            GameObject            go     = Instantiate(projectile.gameObject, caster.skills.effectMount.position, caster.skills.effectMount.rotation);
            ProjectileSkillEffect effect = go.GetComponent <ProjectileSkillEffect>();
            effect.target     = caster.target;
            effect.caster     = caster;
            effect.damage     = damage.Get(skillLevel);
            effect.stunChance = stunChance.Get(skillLevel);
            effect.stunTime   = stunTime.Get(skillLevel);
            NetworkServer.Spawn(go);
        }
        else
        {
            Debug.LogWarning(name + ": missing projectile");
        }
    }
    // -----------------------------------------------------------------------------------
    // Apply
    // -----------------------------------------------------------------------------------
    public override void Apply(Entity caster, int skillLevel)
    {
        if (projectile != null)
        {
            // ---- Deduct Ammunition
            Player player = caster.GetComponent <Player>();
            if (player)
            {
                if (player.inventory.Count(new Item(requiredAmmo)) >= ammoAmount)
                {
                    player.inventory.Remove(new Item(requiredAmmo), ammoAmount);
                }
            }

            GameObject            go     = Instantiate(projectile.gameObject, caster.skills.effectMount.position, caster.skills.effectMount.rotation);
            ProjectileSkillEffect effect = go.GetComponent <ProjectileSkillEffect>();
            effect.target = caster.target;
            effect.caster = caster;
            effect.damage = damage.Get(skillLevel);
            NetworkServer.Spawn(go);
        }
        else
        {
            Debug.LogWarning(name + ": missing projectile");
        }
    }
    public override void Apply(Entity caster, int skillLevel)
    {
        //消耗弹药
        ConsumeRequiredWeaponsAmmo(caster);

        //显示技能效果
        if (projectile != null)
        {
            GameObject            go     = Instantiate(projectile.gameObject, caster.EffectMount.position, caster.EffectMount.rotation);
            ProjectileSkillEffect effect = go.GetComponent <ProjectileSkillEffect>();
            effect.target     = caster.Target;
            effect.caster     = caster;
            effect.damage     = damage.Get(skillLevel);
            effect.stunChance = stunChance.Get(skillLevel);
            effect.stunTime   = stunTime.Get(skillLevel);
            NetworkServer.Spawn(go);
        }
        else
        {
            Debug.LogWarning(name + ": missing projectile");
        }
    }