示例#1
0
    public void FixUpdateShoot(bool isSlow, int layer, bool inShoot)
    {
        var shootFrame  = isSlow ? Deploy.slowFrame : Deploy.fastFrame;
        var bulletId    = isSlow ? Deploy.slowBulletId : Deploy.fastBulletId;
        var atk         = isSlow ? Deploy.slowAtk : Deploy.fastAtk;
        var bulletSpeed = isSlow ? Deploy.slowSpeed : Deploy.fastSpeed;

        if (_prevInSlow != isSlow)
        {
            _prevInSlow = isSlow;
            if (_currBullet != null)
            {
                BulletFactory.DestroyBullet(_currBullet);
                _currBullet = null;
            }
            _prevInLoopShoot = false;
            NextShootFrame   = GameSystem.FixedFrameCount + shootFrame;
        }

        _slowEffect?.SetActiveSafe(inShoot && isSlow);
        _fastEffect?.SetActiveSafe(inShoot && !isSlow);

        if (shootFrame > 0)
        {
            //正常类型,持续射击
            if (inShoot)
            {
                if (GameSystem.FixedFrameCount > NextShootFrame)
                {
                    NextShootFrame = GameSystem.FixedFrameCount + shootFrame;
                    BulletFactory.CreateBullet(bulletId, transform, layer, bullet =>
                    {
                        var data = MoveData.New(transform.position, MathUtility.SwapYZ(transform.forward), bulletSpeed);
                        bullet.Shoot(data, atk: atk);
                    });
                }
            }
        }
        else
        {
            //射击间隔为0的,表示激光类型,射击状态下持续显示,非射击销毁
            if (!_prevInLoopShoot && inShoot)
            {
                BulletFactory.CreateBullet(bulletId, transform, layer, bullet =>
                {
                    _currBullet = bullet;
                    bullet.Shoot(MoveData.New(transform.position, transform.up, bulletSpeed), atk: atk);
                });
            }
            if (_prevInLoopShoot && !inShoot)
            {
                if (_currBullet != null)
                {
                    BulletFactory.DestroyBullet(_currBullet);
                    _currBullet = null;
                }
            }
            _prevInLoopShoot = inShoot;
        }
    }
示例#2
0
    public override void Init(BulletDeploy deploy, Transform master, MeshRenderer model)
    {
        _material = model.material;
        base.Init(deploy, master, model);

        //初始化被击特效
        TextureEffectFactroy.CreateEffect(HitEffectId, SortingOrder.Effect, e =>
        {
            _hitEffect = e;
            _hitEffect.SetActiveSafe(false);
        });
    }
示例#3
0
    public void Init(PlayerSupportDeploy deploy, GameObject renderObj)
    {
        Deploy = deploy;

        if (deploy.slowShootEffectId > 0)
        {
            TextureEffectFactroy.CreateEffect(deploy.slowShootEffectId, SortingOrder.Effect, obj =>
            {
                _slowEffect = obj;
                _slowEffect.transform.Bind(renderObj.transform);
                _slowEffect.SetActiveSafe(false);
            });
        }

        if (deploy.fastShootEffectId > 0)
        {
            TextureEffectFactroy.CreateEffect(deploy.fastShootEffectId, SortingOrder.Effect, obj =>
            {
                _fastEffect = obj;
                _fastEffect.transform.Bind(renderObj.transform);
                _fastEffect.SetActiveSafe(false);
            });
        }
    }
示例#4
0
    protected override void CheckHitEnemy()
    {
        if (InCache)
        {
            return;
        }
        if (!Shooted)
        {
            return;
        }
        if (Master == null)
        {
            return;
        }

        CacheTransform.position = Master.position;

        var delteTime = Time.deltaTime;

        //根据射线,更新最长距离
        var          bPlayHitEffect = false;
        var          maxDist        = 20f;
        RaycastHit2D hit            = Physics2D.Raycast(transform.position, transform.up, 100f, LayersMask.Enemy);

        if (hit.collider != null)
        {
            maxDist = Vector2.Distance(hit.point, transform.position);

            //如果击中的是敌人,播放特效
            var gameObj = hit.collider.gameObject;
            if (gameObj.layer == Layers.Enemy)
            {
                bPlayHitEffect = true;
                if (_hitEffect)
                {
                    _hitEffect.transform.position = hit.point;
                    _hitEffect.SetActiveSafe(true);
                }

                var enemy = gameObj.GetComponent <Enemy>();
                if (enemy != null)
                {
                    //激光击中敌人伤害
                    OnBulletHitEnemy(enemy);
                }
            }
        }

        if (!bPlayHitEffect)
        {
            if (_hitEffect)
            {
                _hitEffect.SetActiveSafe(false);
            }
        }
        _maxScaleMultiple = maxDist / Renderer.transform.localScale.x;

        //mainTextureOffset(UV动画)
        var t = _material.mainTextureOffset;

        t.x += delteTime * _uvSpeed;
        _material.mainTextureOffset = t;


        //激光长度(动态缩放)
        var scale = transform.localScale;

        scale.y += Time.deltaTime * _scaleSpeed;
        scale.y  = Mathf.Clamp(scale.y, 0, _maxScaleMultiple);
        transform.localScale = scale;

        //mainTexture的Scale,防止激光变长后拉伸(与Scale同步)
        var texScale = _material.mainTextureScale;

        texScale.x = transform.localScale.y / 1f;
        _material.mainTextureScale = texScale;

        //音效
        UpdateSoundPlay();
    }