Beispiel #1
0
    public void Fire()
    {
        State = EffectState.Fired;

        if (gameObject == null)
        {
            return;
        }

        // 如果在游戏场景的时候,场景没了或者effect root没了,就可以直接删除了
        if (GameLogic.Instance)
        {
            if (!GameLogic.Instance.Scene || !GameLogic.Instance.Scene.EffectRoot)
            {
                mWillDestroy = true;
                return;
            }
        }

        if (trans.parent.parent == ComplexObjectPool.Holder)
        {
            // 这是个bug
            Logger.Error("特效没有清理干净,这是个bug,提bug吧赶紧的。");
            return;
        }

        ComplexObjectPool.SetActive(gameObject, true);

        if (!Follow)
        {
            trans.parent  = GameLogic.Instance.Scene.EffectRoot.transform;
            trans.forward = Dir;
            if (Pos != null)
            {
                trans.position = Pos.Value;
            }
        }

        GameUtils.ResetEffect(gameObject);
    }
Beispiel #2
0
    public void CreateEffect(EffectRecord tableData,
                             Transform parent,
                             Vector3 dir,
                             int layer   = 0,
                             Vector3?pos = null,
                             Action <EffectController, ulong> loadOverCallback = null,
                             Action <EffectController, ulong> playOverCallback = null,
                             bool firstPriority    = false,
                             bool bPrepareResource = false,
                             bool camShake         = true)
    {
        ComplexObjectPool.NewObject(tableData.Path, obj =>
        {
            if (obj == null)
            {
                return;
            }

            var Id = GenerateNextId();

            var p        = new Vector3(tableData.X, tableData.Y, tableData.Z);
            var rotation =
                Quaternion.Euler(new Vector3(tableData.RotationX, tableData.RotationY, tableData.RotationZ));

            var objTransform = obj.transform;
            if (null != parent)
            {
                objTransform.parent = parent;
            }
            else
            {
                objTransform.parent = GameLogic.Instance.Scene.EffectRoot.transform;
            }

            if (tableData.IsZoom != 0)
            {
                objTransform.localScale = Vector3.one;
            }
            else
            {
                if (parent != null)
                {
                    var v = parent.transform.lossyScale;
                    objTransform.localScale = new Vector3(1.0f / v.x, 1.0f / v.y, 1.0f / v.z);
                }
                else
                {
                    objTransform.localScale = Vector3.one;
                }
            }

            objTransform.localPosition = p;
            objTransform.localRotation = rotation;

            obj.name = "Effect_" + Id.ToString() + "_" + Path.GetFileNameWithoutExtension(tableData.Path);

            obj.SetLayerRecursive(layer);

            ComplexObjectPool.SetActive(obj, false);

            {
                //根据setting设置特效显示
                if (GameSetting.Instance.GameQualityLevel < 3)
                {
                    {
                        // foreach(var data in EnumGameObjectRecursive(obj))
                        var __enumerator5 = (EnumGameObjectRecursive(obj)).GetEnumerator();
                        while (__enumerator5.MoveNext())
                        {
                            var data = __enumerator5.Current;
                            {
                                if (data.CompareTag("LowEffectParticle"))
                                {
                                    data.SetActive(false);
                                }
                            }
                        }
                    }
                }
            }

            var effect = obj.GetComponent <EffectController>();
            if (effect == null)
            {
                effect = obj.AddComponent <EffectController>();
                effect.InitLoop();
            }
            effect.Id               = Id;
            effect.Delay            = tableData.DelayTime;
            effect.Duration         = tableData.Duration == 0 ? float.MaxValue : tableData.Duration;
            effect.Follow           = tableData.Follow != 0;
            effect.PlayOverCallback = playOverCallback;
            effect.LoopTime         = tableData.LoopTime;
            effect.State            = EffectState.WaitToFire;
            effect.Dir              = dir;
            effect.Pos              = pos;
            effect.trans            = effect.transform;
            mDict.Add(effect.Id, effect);

            if (null != loadOverCallback)
            {
                loadOverCallback(effect, Id);
            }

            if (camShake)
            {
                var tableDataShakeDelayTimeLength0 = tableData.ShakeDelayTime.Length;
                for (var i = 0; i < tableDataShakeDelayTimeLength0; i++)
                {
                    if (tableData.ShakeDelayTime[i] != -1)
                    {
                        //创建人物时播放角色动画还没有GameLogic
                        if (null != GameLogic.Instance)
                        {
                            var shake = GameLogic.Instance.MainCamera.GetComponent <CameraShake>();
                            if (null != shake && shake.gameObject.active && (!bPrepareResource) && GameLogic.Instance.MainCamera.enabled)
                            {
                                shake.StartCoroutine(ShakeCamera(shake, tableData.ShakeDelayTime[i] / 1000.0f,
                                                                 tableData.ShakeMagnitude[i], (int)tableData.ShakeCount[i], tableData.ShakeSpeed[i],
                                                                 tableData.ShakeReduction[i], tableData.ShakeType[i]));
                            }
                        }
                    }
                }
            }
        }, null, null, false, firstPriority, false);
    }
Beispiel #3
0
 private void DelayFunc()
 {
     ComplexObjectPool.SetActive(gameObject, true);
 }
Beispiel #4
0
 public void StartDelay()
 {
     ComplexObjectPool.SetActive(gameObject, false);
     Invoke("DelayFunc", delayTime);
 }
Beispiel #5
0
    public void NotifyShootBullet(BulletMsg msg)
    {
        Action act = () =>
        {
            var tableData = Table.GetBullet(msg.BulletId);
            var caster    = ObjManager.Instance.FindCharacterById(msg.CasterId);
            if (null == caster)
            {
                Logger.Warn("NotifyShootBullet: null==caster[{0}]", msg.CasterId);
                return;
            }

            if (ObjState.Normal != caster.State &&
                ObjState.Dieing != caster.State)
            {
                Logger.Warn("NotifyShootBullet: caster[{0}] state=[{1}]", msg.CasterId, caster.State.ToString());
                return;
            }

            var bulletPath = tableData.Path;
            var speed      = tableData.Speed;
            if (caster)
            {
                var pos     = caster.Position;
                var emitObj = caster.GetMountPoint(tableData.CasterMountPoint);
                if (null == emitObj)
                {
                    Logger.Error("NotifyShootBullet: Can not find mount point [{0}] in [{1}]      [{2}]  [{3}]",
                                 tableData.CasterMountPoint, caster.name, msg.BulletId, bulletPath);
                }
                else
                {
                    pos = emitObj.position;
                }
                {
                    var __list5      = msg.TargetObjId;
                    var __listCount5 = __list5.Count;
                    for (var __i5 = 0; __i5 < __listCount5; ++__i5)
                    {
                        var targetId = __list5[__i5];
                        {
                            var target = ObjManager.Instance.FindCharacterById(targetId);
                            if (null == target)
                            {
                                continue;
                            }

                            var id = target.GetObjId();
                            var p  = target.Position;
                            //ResourceManager.PrepareResource<GameObject>(bulletPath, (res) =>
                            ComplexObjectPool.NewObject(bulletPath, obj =>
                            {
                                if (obj == null)
                                {
                                    return;
                                }

                                obj.transform.position = pos;
                                ComplexObjectPool.SetActive(obj, true);

                                Missile missile;
                                if (tableData.DirRangeX == 0 && tableData.DirRangeY == 0 && tableData.DirRangeZ == 0)
                                {
                                    missile = obj.GetComponent <Missile>();
                                    if (missile == null)
                                    {
                                        missile = obj.AddComponent <Missile>();
                                    }
                                }
                                else
                                {
                                    var dmissile = obj.GetComponent <DirectionalMissile>();
                                    if (dmissile == null)
                                    {
                                        dmissile = obj.AddComponent <DirectionalMissile>();
                                    }

                                    var v = Random.Range(0, Mathf.PI * 2);

                                    dmissile.StartDirection =
                                        new Vector3(
                                            Mathf.Sin(v) *
                                            Random.Range(tableData.DirRangeX * 0.8f, tableData.DirRangeX * 1.2f),
                                            Mathf.Abs(Mathf.Cos(v)) *
                                            Random.Range(tableData.DirRangeY * 0.8f, tableData.DirRangeY * 1.2f),
                                            Random.Range(tableData.DirRangeZ * 0.8f, tableData.DirRangeZ * 1.2f));

                                    missile = dmissile;
                                }

                                if (target.GetModel() == null || target.GetModel().gameObject == null)
                                {
                                    missile.Target = target.ObjTransform;
                                }
                                else
                                {
                                    var targetObj = target.GetMountPoint(tableData.BearMountPoint);
                                    if (null == targetObj)
                                    {
                                        Logger.Error("NotifyShootBullet: Can not find mount point [{0}] in [{1}]",
                                                     tableData.BearMountPoint, target.name);
                                        missile.Target = target.ObjTransform;
                                    }
                                    else
                                    {
                                        missile.Target = targetObj;
                                    }
                                }

                                missile.Init(speed, p, bullet =>
                                {
                                    var tar = ObjManager.Instance.FindCharacterById(id);
                                    if (null != tar)
                                    {
                                        tar.DoHurt();
                                    }

                                    if (!string.IsNullOrEmpty(tableData.HitEffect))
                                    {
                                        var effectId = Convert.ToInt32(tableData.HitEffect);
                                        if (-1 != effectId)
                                        {
                                            var data = Table.GetEffect(effectId);
                                            EffectManager.Instance.CreateEffect(data, tar, null,
                                                                                (effect, eId) =>
                                            {
                                                effect.gameObject.transform.position =
                                                    bullet.gameObject.transform.position;
                                            }, null,
                                                                                (data.BroadcastType == 0 &&
                                                                                 targetId == ObjManager.Instance.MyPlayer.GetObjId()) ||
                                                                                data.BroadcastType == 1);
                                        }
                                    }
                                });

                                missile.enabled = true;
                            }, o =>
                            {
                                OptList <Bullet> .List.Clear();
                                o.GetComponents(OptList <Bullet> .List);
                                {
                                    var __array1       = OptList <Bullet> .List;
                                    var __arrayLength1 = __array1.Count;
                                    for (var __i2 = 0; __i2 < __arrayLength1; ++__i2)
                                    {
                                        var b     = __array1[__i2];
                                        b.enabled = false;
                                    }
                                }

                                GameUtils.ResetEffect(o);
                            }, null, false, false, false);
                        }
                    }
                }
            }
        };

        var time = Extension.FromServerBinary((long)msg.ViewTime);

        if (time > Game.Instance.ServerTime)
        {
            StartCoroutine(WaitToDoSomething(time - Game.Instance.ServerTime, act));
        }
        else
        {
            act();
        }
    }