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; } }
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); }); }
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); }); } }
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(); }