Inheritance: MonoBehaviour
示例#1
0
    public MagicProjectile Launch(Grimiore _grimiore, Vector3 spawnPoint, Transform target)
    {
        if (!_movingToTarget)
        {
            _target  = target;
            grimiore = _grimiore;

            _magicEffectSpawned = grimiore.OnParticleEffectSpawn;
            _halfwayToTarget    = grimiore.OnParticleEffectHalfway;
            _reachedTarget      = grimiore.OnParticleEffectLanded;

            _projectileInstance = Instantiate(this, spawnPoint, Quaternion.Euler(0, 0, 0));
            _projectileInstance.transform.LookAt(_target.transform);

            _halfway   = false;
            _hitTarget = false;

            _movingToTarget = true;

            _magicEffectSpawned.Invoke();
            OnEffectSpawn.Invoke();

            return(_projectileInstance);
        }

        throw new UnityException("Unable to spawn Projectile");
    }
    private void LaunchProjectile()
    {
        ManaManager launcher = GetComponentInParent <ManaManager>();

        float chargeNormalized = 1f;

        if (maxChargeTime != 0f)
        {
            chargeNormalized = currentChargeTime / maxChargeTime;
        }

        float realManaCost = manaCost * (1 + ManaChargeScale * chargeNormalized);

        if (CanLaunch(launcher, realManaCost))
        {
            GameObject projectile = Instantiate <GameObject>(projectilePrefab);

            MagicProjectile magic = projectile.GetComponent <MagicProjectile>();

            magic.Launcher = launcher;
            magic.Power    = chargeNormalized;
            magic.Damage   = minDamages + ((maxDamages - minDamages) * chargeNormalized);

            magic.OnKill = delegate(IDamageable target)
            {
                if (OnKill != null)
                {
                    OnKill(this, new OnKillArgs(target));
                }
            };

            launcher.RemoveMana(realManaCost);
        }
    }
    public void Cast(EnemyController caster, Vector3 hotspot, Vector3 target, int layer)
    {
        MagicProjectile projectile = Instantiate(ProjectilePrefab, hotspot, Quaternion.identity);

        projectile.Launch(caster, target, ProjectileSpeed, Range);
        Helpers.RecursiveLayerChange(projectile.gameObject.transform, layer);
        projectile.ProjectileCollided += OnProjectileCollided;
    }
示例#4
0
    void LaunchMagicProjectile()
    {
        MagicProjectile projectile = grimiore.magicEffect.GetComponent <MagicProjectile>();

        projectileInstance = projectile.Launch(
            grimiore,
            projectileLaunchPoint.transform.position,
            projectileTarget.transform
            );
    }
示例#5
0
    public void Fire(Transform target)
    {
        OnRelease ();

        if (projectile == null) return;
        projectile.transform.forward = transform.forward;

        projectile.target = getRawTarget ? target : target.GetTarget();
        projectile.Fire ();
        projectile = null;
    }
示例#6
0
        public MagicWeapon(World world, WeaponType type, Target target, Actor origin, uint id) : base(world, type, target, origin, id)
        {
            projectile = (MagicProjectile)type.Projectile;

            Angle = (Position - TargetPosition).FlatAngle;
            calculateSpeed();

            TargetPosition += getInaccuracy(projectile.Inaccuracy);

            rayPhysics = new RayPhysics(world);
        }
示例#7
0
    public void Load()
    {
        generatedPositionNoise = positionNoise.GenerateRandom ();

        projectile = PoolManager.Instance.GetInstance (instanceName).GetComponent<MagicProjectile>();
        projectile.gameObject.SetTag(gameObject.tag, true);
        projectile.Initialize ();

        projectile.Load ();

        OnHold ();
    }
示例#8
0
        public MagicWeapon(World world, WeaponInit init) : base(world, init)
        {
            projectile = (MagicProjectile)Type.Projectile;

            speed     = init.Convert("Speed", Vector.Zero);
            speedLeft = init.Convert("SpeedLeft", Vector.Zero);
            if (speed == Vector.Zero)
            {
                calculateSpeed();
            }

            rayPhysics = new RayPhysics(world);
        }
示例#9
0
        public void useAbility(short type)
        {
            TestScene scene = entity.scene as TestScene;
            Vector2   pos   = new Vector2(entity.position.X, entity.position.Y);
            Sprite    sprite;
            //Get relative direction of mouse
            float theta = InputHandler.getMouseDirectionInRad(scene.camera.worldToScreenPoint(pos));

            switch (type)
            {
            case 0:
                sprite = new Sprite(musicAttack_1);
                sprite.setRenderLayer(1);
                ProjectileWave projectileWave = new ProjectileWave(theta, 8f, 5f);
                if (!_animations.isAnimationPlaying(Animations.ATTACK_RUN))
                {
                    _animations.play(Animations.ATTACK_RUN);
                }
                createProjectile("Wave_Projectile", projectileWave, pos, ref sprite);
                break;

            case 1:
                sprite = new Sprite(musicAttack_1);
                sprite.setRenderLayer(1);
                ProjectileLinear projectileLinear = new ProjectileLinear(theta, 8f, 5f);

                if (!_animations.isAnimationPlaying(Animations.ATTACK_RUN))
                {
                    _animations.play(Animations.ATTACK_RUN);
                }
                createProjectile("Linear_Projectile", projectileLinear, pos, ref sprite);
                break;

            case 2:
                sprite = new Sprite(musicAttack_1);
                sprite.setRenderLayer(1);
                MagicProjectile magicProjectile = new MagicProjectile(theta, 8f, 5f, _mover.tiledMap.getLayer <TiledTileLayer>("Ground"));

                if (!_animations.isAnimationPlaying(Animations.ATTACK_RUN))
                {
                    _animations.play(Animations.ATTACK_RUN);
                }
                createProjectile("Magic_Projectile", magicProjectile, pos, ref sprite);
                break;
            }
        }
示例#10
0
    void Update()
    {
        if (isFiring)
        {
            counter -= Time.deltaTime;
            if (counter <= 0)
            {
                counter = delay;
                MagicProjectile newMagicMissle = Instantiate(MagicMissle, Wand.position, Wand.rotation);
                newMagicMissle.speed = missleSpeed;
            }
        }

        else
        {
            counter = 0;
        }
    }
    private void UpdateAttacks()
    {
        if (this.attack1Timer <= 0)
        {
            if (Input.GetButtonDown("Action1"))
            {
                MagicAttack attack         = Instantiate(MagicAttackPrefab, this.transform.position, Quaternion.AngleAxis(Random.Range(0, 360), Vector3.forward));
                float       damageModifier = Mathf.Max(0.5F, this.stats.Attack1Strength / 5F);
                float       sizeModifier   = Mathf.Max(0.5F, this.stats.Attack1Size / 10F);
                attack.Initialise(damageModifier, sizeModifier);

                // Play audio
                this.audioPlayer.PlayClipRandom(this.blastAttackAudio);

                // Reset attack timer
                this.attack1Timer = 1.0F / this.attack1RateOfFire;
            }
        }
        else
        {
            // Count down attack timer
            this.attack1Timer -= Time.deltaTime;
        }

        if (this.attack2Timer <= 0)
        {
            if (Input.GetButtonDown("Action2"))
            {
                // Find direction based on player's current facing direction
                float     projectileSpeed     = 15F;
                Direction projectileDirection = (Direction)this.spriteAnimator.GetInteger("Direction");
                Vector2   baseVelocity        = Vector2.zero;
                if (projectileDirection == Direction.Right)
                {
                    baseVelocity = Vector2.right * projectileSpeed;
                }
                else if (projectileDirection == Direction.Down)
                {
                    baseVelocity = Vector2.down * projectileSpeed;
                }
                else if (projectileDirection == Direction.Left)
                {
                    baseVelocity = Vector2.left * projectileSpeed;
                }
                else if (projectileDirection == Direction.Up)
                {
                    baseVelocity = Vector2.up * projectileSpeed;
                }

                // Create N projectiles scattered across a range
                float damageModifier = Mathf.Max(0.5F, this.stats.Attack2Strength / 5F);
                int   numProjectiles = this.stats.Attack2NumberOfProjectiles;

                // Scatter range is wider for more projectiles
                float scatterAngle = Mathf.Min(90, 9F * numProjectiles);

                for (int i = 0; i < numProjectiles; i++)
                {
                    MagicProjectile projectile = Container.InstantiatePrefab(MagicProjectilePrefab).GetComponent <MagicProjectile>();
                    projectile.transform.position = this.transform.position;
                    projectile.transform.rotation = Quaternion.AngleAxis(Random.Range(0, 360), Vector3.forward);

                    float angle = Random.Range(-scatterAngle / 2, scatterAngle / 2);
                    projectile.Initialise(Quaternion.AngleAxis(angle, Vector3.forward) * baseVelocity, damageModifier);
                }

                // Play audio
                this.audioPlayer.PlayClipRandom(this.orbAttackAudio, 0.15F);

                // Reset attack timer
                this.attack2Timer = 1.0F / this.attack2RateOfFire;
            }
        }
        else
        {
            // Count down attack timer
            this.attack2Timer -= Time.deltaTime;
        }
    }
示例#12
0
    public void Unload()
    {
        OnRelease ();

        projectile.Unload ();
        projectile = null;
    }