protected void InitMovement(ImpactLogicInfo info) { ImpactLogicData config = info.ConfigData; if (null != config) { switch ((ImpactMovementType)config.MoveMode) { case ImpactMovementType.SenderDir: if (null != info.Sender) { info.MoveDir = UnityEngine.Quaternion.Euler(0, ImpactUtility.RadianToDegree(info.ImpactSrcDir), 0); } break; case ImpactMovementType.SenderToTarget: if (null != info.Target) { UnityEngine.Vector3 direction = info.Target.transform.position - info.ImpactSrcPos; direction.y = 0.0f; direction.Normalize(); info.MoveDir = UnityEngine.Quaternion.LookRotation(direction); } break; case ImpactMovementType.Inherit: if (null != info.Sender) { info.MoveDir = UnityEngine.Quaternion.Euler(0, ImpactUtility.RadianToDegree(info.ImpactSrcDir), 0); } break; } } }
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; } } } } } } }
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); } } }