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); }
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); }
private void DelayFunc() { ComplexObjectPool.SetActive(gameObject, true); }
public void StartDelay() { ComplexObjectPool.SetActive(gameObject, false); Invoke("DelayFunc", delayTime); }
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(); } }