public virtual void UpdateEffect(ImpactLogicInfo logicInfo) { if (null == logicInfo.Target) { return; } SharedGameObjectInfo shareInfo = LogicSystem.GetSharedGameObjectInfo(logicInfo.Target); if (null != shareInfo && !shareInfo.AcceptStiffEffect) { return; } for (int i = 0; i < logicInfo.EffectList.Count; ++i) { EffectInfo effectInfo = logicInfo.EffectList[i]; if (null != effectInfo) { if (effectInfo.StartTime < 0 && Time.time > logicInfo.StartTime + effectInfo.DelayTime / 1000) { effectInfo.IsActive = true; effectInfo.StartTime = Time.time; GameObject obj = ResourceSystem.NewObject(effectInfo.Path, effectInfo.PlayTime / 1000) as GameObject; if (null != obj) { if (effectInfo.DelWithImpact) { logicInfo.EffectsDelWithImpact.Add(obj); } if (String.IsNullOrEmpty(effectInfo.MountPoint)) { obj.transform.position = logicInfo.Target.transform.position + effectInfo.RelativePoint; UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(effectInfo.RelativeRotation.x, effectInfo.RelativeRotation.y, effectInfo.RelativeRotation.z); if (effectInfo.RotateWithTarget && null != logicInfo.Sender) { obj.transform.rotation = UnityEngine.Quaternion.LookRotation(logicInfo.Target.transform.position - logicInfo.Sender.transform.position, UnityEngine.Vector3.up); obj.transform.rotation = UnityEngine.Quaternion.Euler(obj.transform.rotation.eulerAngles + effectInfo.RelativeRotation); } else { obj.transform.rotation = q; } } else { Transform parent = LogicSystem.FindChildRecursive(logicInfo.Target.transform, effectInfo.MountPoint); if (null != parent) { obj.transform.parent = parent; obj.transform.localPosition = UnityEngine.Vector3.zero; UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(ImpactUtility.RadianToDegree(effectInfo.RelativeRotation.x), ImpactUtility.RadianToDegree(effectInfo.RelativeRotation.y), ImpactUtility.RadianToDegree(effectInfo.RelativeRotation.z)); obj.transform.localRotation = q; } } } } } } }
public void AddEffectData(int id) { EffectLogicData effectData = (EffectLogicData)SkillConfigProvider.Instance.ExtractData(SkillConfigType.SCT_EFFECT, id); if (null != effectData) { EffectInfo effectInfo = new EffectInfo(); effectInfo.IsActive = false; effectInfo.Path = effectData.EffectPath; effectInfo.PlayTime = effectData.PlayTime; effectInfo.RelativePoint = ImpactUtility.ConvertVector3D(effectData.RelativePos); effectInfo.RotateWithTarget = effectData.RotateWithTarget; effectInfo.RelativeRotation = ImpactUtility.ConvertVector3D(effectData.RelativeRotation); effectInfo.MountPoint = effectData.MountPoint; effectInfo.DelayTime = effectData.EffectDelay; effectInfo.DelWithImpact = effectData.DelWithImpact; m_EffectList.Add(effectInfo); } }
private void SendImpactToCharacterImpl(GameObject senderObj, GameObject targetObj, int impactId, float x, float y, float z, float dir, int forceLogicId) { ImpactLogicData config = SkillConfigProvider.Instance.ExtractData(SkillConfigType.SCT_IMPACT, impactId) as ImpactLogicData; if (null != config) { ImpactLogicInfo info = m_ImpactLogicPool.Alloc(); // ImpactLogicInfo info = new ImpactLogicInfo(); info.Sender = senderObj; info.Target = targetObj; info.ImpactId = impactId; info.StartTime = Time.time; info.LogicId = config.ImpactGfxLogicId; if (-1 != forceLogicId) { info.LogicId = forceLogicId; } info.IsActive = true; ImpactCacheData impactcachevalue; if (impactLogicDataCacheCont.TryGetValue(impactId, out impactcachevalue)) { info.AnimationInfo = impactcachevalue.CurveAnimationInfo; info.LockFrameInfo = impactcachevalue.CurveLockFrameInfo; info.MovementInfo = impactcachevalue.CurveMovementInfo; info.ConfigCacheData = impactcachevalue; } else { info.AnimationInfo = new CurveInfo(config.AnimationInfo); info.LockFrameInfo = new CurveInfo(config.LockFrameInfo); info.MovementInfo = new CurveMoveInfo(config.CurveMoveInfo); } info.AdjustPoint = UnityEngine.Quaternion.Euler(0, ImpactUtility.RadianToDegree(dir), 0) * info.ConfigCacheData.AdjustPointV3 + new UnityEngine.Vector3(x, y, z); info.AdjustAppend = config.AdjustAppend; info.AdjustDegreeXZ = config.AdjustDegreeXZ; info.AdjustDegreeY = config.AdjustDegreeY; info.ConfigData = config; info.Duration = config.ImpactTime / 1000; info.ImpactSrcPos = new UnityEngine.Vector3(x, y, z); info.ImpactSrcDir = dir; info.NormalEndPoint = GetImpactEndPos(info.Target.transform.position, UnityEngine.Quaternion.Euler(0, ImpactUtility.RadianToDegree(info.ImpactSrcDir), 0), info); info.NormalPos = info.Target.transform.position; info.OrignalPos = info.Target.transform.position; ShowDebugObject(info.AdjustPoint, 0); ShowDebugObject(info.NormalEndPoint, 1); for (int i = 0; i < config.EffectList.Count; i++) { if (config.EffectList[i].Count > 0) { if (c_EffectPoolCapacity - m_EffectInfoPool.Count < c_MaxHitEffect) { EffectInfo effectinfo = m_EffectInfoPool.Alloc(); info.AddEffectDataByinfo(config.EffectList[i][UnityEngine.Random.Range(0, config.EffectList[i].Count)], effectinfo); } else { } } } AddImpactInfo(info); IGfxImpactLogic logic = GfxImpactLogicManager.Instance.GetGfxImpactLogic(info.LogicId); if (logic != null) { logic.StartImpact(info); } else { LogSystem.Debug("SendImpactToCharacter: Can't find impact logic {0}", info.LogicId); } } }