public Fireball(Vector2 pos, bool marioIsLeft)
 {
     position  = pos;
     shootLeft = marioIsLeft;
     state     = new AttackFireBallState(this);
     physics   = new BasicPhysics(this);
 }
Beispiel #2
0
    private IEnumerator ResetProjectileInTimeCorutine(GameObject obj, bool isActive, float time)
    {
        yield return(new WaitForSeconds(time));

        _state    = null;
        _hitState = null;
        obj.SetActive(isActive);
        yield break;
    }
    public void InstantiateProjectile(GameObject projectilePrefab, IProjectileState state, ProjectileInitSetting projectileInitSetting, ProjectileSetting projectileSetting)
    {
        if (projectileTypes == null)
        {
            return;
        }

        StartCoroutine(DelayProjectileSpawn(projectilePrefab, state, projectileInitSetting, projectileSetting));
    }
Beispiel #4
0
    public void Setup(IProjectileState state, ProjectileSetting projectileSetting)
    {
        // 通用的setup
        if (projectileSetting.sourceCaster != null)
        {
            this.sourceCaster = projectileSetting.sourceCaster;
            this.elementType  = sourceCaster.data.attackElement;
        }
        this.moveSpeed    = projectileSetting.moveSpeed;
        this.lifeTime     = projectileSetting.lifeTime;
        this.initialAngle = projectileSetting.initialAngle;  //deg
        this.target       = projectileSetting.target;

        _state = state;
        DetectHitState();
        // 該State專屬的Setup
        _state.Setup(this);
        _hitState.HitStateSetUp(this);
    }
    private IEnumerator DelayProjectileSpawn(GameObject projectilePrefab, IProjectileState state, ProjectileInitSetting projectileInitSetting, ProjectileSetting projectileSetting)
    {
        int angleChunk = projectileInitSetting.restrictAngle / projectileInitSetting.amount;    //在限制角度中平分角度
        int angle      = projectileInitSetting.angleOffset;

        for (int i = 0; i < projectileInitSetting.amount; i++)
        {
            Transform p = ObjectPools.Instance.GetObjectInPools(projectilePrefab.name, projectileInitSetting.initialPosition).transform;
            projectileSetting.initialAngle = projectileInitSetting.initialAngle;
            p.GetComponent <Projectile>().Setup(state, projectileSetting);

            if (p.GetComponent <ParticleSystem>() != null)
            {
                p.GetComponent <ParticleSystem>().Play();
            }

            angle += angleChunk;
            yield return(new WaitForSeconds(projectileSetting.shootDelay));
        }
        yield break;
    }