private static void ParseEffectParam(ref EffectParam param, SecurityElement element) { if (param == null || element == null || element.Tag != "Param") { return; } if (param.type == typeof(FollowEffectEntity)) { var move = param as FollowEffectParam; move.speed = element.Attribute("speed").ToFloatEx(); move.offsetTo = element.Attribute("offsetTo").ToVector3Ex(); } else if (param.type == typeof(TimeEffectEntity)) { var time = param as TimeEffectParam; time.duration = element.Attribute("duration").ToFloatEx(); time.triggerAt = element.Attribute("triggerAt").ToFloatEx(); } else if (param.type == typeof(HitEffectEntity)) { var hit = param as HitEffectParam; hit.duration = element.Attribute("duration").ToFloatEx(); hit.triggerAt = element.Attribute("triggerAt").ToFloatEx(); hit.hitColor = element.Attribute("color").ToColorEx(); } }
public override void Init(HeroAction _skill, EffectParam _data, HeroEntity _parentTarget) { base.Init(_skill, _data, _parentTarget); FollowEffectParam move = param as FollowEffectParam; mSpeed = move.speed; mOffsetTo = move.offsetTo; OnBegin(); }
public override void Init(HeroAction _skill, EffectParam _data, HeroEntity _parentTarget) { base.Init(_skill, _data, _parentTarget); if (parentTarget != null) { mRenderer = parentTarget.gameObject.GetComponentInChildren <MeshRenderer>(); if (mRenderer != null) { mOldColor = mRenderer.material.color; mRenderer.material.color = (param as HitEffectParam).hitColor; } } }
public override void Init(HeroAction _skill, EffectParam _data, HeroEntity _parentTarget) { base.Init(_skill, _data, _parentTarget); var t = param as TimeEffectParam; mEffectTime = t.duration; mDuration = t.duration; if (t.triggerAt > 0) { mTriggerAt = t.triggerAt; } if (mEffectTime <= 0) { mEffectTime = 0.1f; } }
public virtual void Init(HeroAction _action, EffectParam _data, HeroEntity _parentTarget) { action = _action; param = _data; parentTarget = _parentTarget; if (param.effectOn == EffectOn.Custom) { } else { GameObject go = action.entity.gameObject; if (param.effectOn == EffectOn.Self) { go = action.entity.gameObject; } else if (param.effectOn == EffectOn.Target) { if (parentTarget != null) { go = parentTarget.gameObject; } } if (go) { Vector3 position = go.transform.position; position += go.transform.forward * param.offset.z; position += go.transform.right * param.offset.x; position.y += param.offset.y; gameObject.transform.position = position; gameObject.transform.rotation = Quaternion.LookRotation(go.transform.forward); string assetBundleName = string.Format("assets/assetBundle/{0}.prefab", param.assetBundleName); string assetName = string.Format("assets/assetBundle/{0}.prefab", param.assetName); LoadAsset(assetBundleName, assetName); } else { OnEnd(); } } }
public void playEffect(string strProjectile, EffectParam pEffectParam) { GameObject goEffect = GameObject.Instantiate(Resources.Load("Prefabs/" + strProjectile)) as GameObject; if (null != goEffect) { EffectController ec = goEffect.GetComponent<EffectController>(); if (null != ec) { ec.fStartX = pEffectParam.vec2Begin.x; ec.fStartY = pEffectParam.vec2Begin.y; ec.fAimX = pEffectParam.vec2End.x; ec.fAimY = pEffectParam.vec2End.y; ec.fTime = pEffectParam.fTimes; ec.fDelay = pEffectParam.fDelay; ec.fRotation = pEffectParam.fRotation; ec.enabled = true; } } }
private void createProjectile(float fRemainTime) { // 创建飞行特效 string strProjectile = m_pHost.getProjectileName(); EffectParam pEffectParam = new EffectParam(); pEffectParam.vec2Begin = m_pHost.getPosition(); pEffectParam.vec2End = m_pTarget.getPosition(); // 延迟 pEffectParam.fDelay = 0.0f; // 飞行时间 pEffectParam.fTimes = fRemainTime; if (CAMP_TYPE.eATTACKER == m_pHost.TOY_CAMP) { pEffectParam.fRotation = 180.0f; } else if (CAMP_TYPE.eDEFENSE == m_pHost.TOY_CAMP) { pEffectParam.fRotation = 0.0f; } EffectManager.Instance().playEffect(strProjectile, pEffectParam); }
private static void ParseEffect(ref List <EffectParam> effects, SecurityElement element) { if (element == null || element.Tag != "Effect") { return; } EffectParam effect = (EffectParam)Activator.CreateInstance(Type.GetType(element.Attribute("param"))); effect.type = Type.GetType(element.Attribute("type")); effect.assetBundleName = element.Attribute("bundleName"); effect.assetName = element.Attribute("assetName"); effect.effectArise = element.Attribute("effectArise").ToEnumEx <EffectArise>(); effect.effectOn = element.Attribute("effectOn").ToEnumEx <EffectOn>(); effect.offset = element.Attribute("offset").ToVector3Ex(); effects.Add(effect); if (element.Children != null) { for (int i = 0; i < element.Children.Count; ++i) { var child = element.Children[i] as SecurityElement; if (child.Tag == "Effect") { if (effect.effects == null) { effect.effects = new List <EffectParam>(); } ParseEffect(ref effect.effects, child); } else if (child.Tag == "Param") { ParseEffectParam(ref effect, child); } } } }
private bool createEffect() { LightEffectParam newParam = new LightEffectParam(); EffectParam.ColoneTo(ref newParam); float maxDistance = EffectParam.fDistance; float effectRad = EffectParam.fAttackRange; Vector3 newSourcePos = newParam.srcObject.transform.position; if (sourceTransform != null) { newSourcePos = sourceTransform.position; } Vector3 areaTargetPos = EffectParam.targetPos; Vector3 newTargetPos = areaTargetPos; //构造一个范围内的随机目标位置 if (areaConfig.projectOnGround == true) { //构造一个投影到地面的圆形 int angle = Random.Range(0, 360); float _rad = angle * Mathf.PI / 180.0f; Vector3 offset = new Vector3(Mathf.Sin(_rad), 0, Mathf.Cos(_rad)); float dis = Random.Range(0.0f, effectRad); offset *= dis; newTargetPos += offset; RaycastHit _ClosestHitInfo_Down; RaycastHit _ClosestHitInfo_Up; float rayDistance = maxDistance; Ray PointToGroundRayDown = new Ray(newTargetPos, new Vector3(0, -1, 0)); Ray PointToGroundRayUp = new Ray(newTargetPos, new Vector3(0, 1, 0)); bool DownHit = Physics.Raycast(PointToGroundRayDown, out _ClosestHitInfo_Down, rayDistance, -1); bool UpHit = Physics.Raycast(PointToGroundRayUp, out _ClosestHitInfo_Up, rayDistance, -1); Vector3 recordPos = newTargetPos; float hitDistance = maxDistance; if (DownHit) { hitDistance = (_ClosestHitInfo_Down.point - recordPos).magnitude; newTargetPos = _ClosestHitInfo_Down.point; } if (UpHit) { if ((_ClosestHitInfo_Up.point - recordPos).magnitude < hitDistance) { hitDistance = (_ClosestHitInfo_Up.point - recordPos).magnitude; newTargetPos = _ClosestHitInfo_Up.point; } } newParam.targetPos = newTargetPos; } else if (effectRad > 0.01f) { //构造一个圆锥 Vector3 normal = EffectParam.targetPos - newSourcePos; Vector3 tangent = new Vector3(0, 0, 1); Vector3.OrthoNormalize(ref normal, ref tangent); int angle = Random.Range(0, 360); Quaternion rotation = Quaternion.AngleAxis((float)angle, normal); tangent = rotation * tangent; float dis = Random.Range(0.0f, effectRad); tangent *= dis; newTargetPos += tangent; if (areaConfig.extentToMaxDistance) {//将目标点拉远,延长用更容易造成与地面的碰撞 Vector3 dir = newTargetPos - newSourcePos; dir.Normalize(); newTargetPos = newSourcePos + dir * maxDistance; } newParam.targetPos = newTargetPos; } else { if (areaConfig.extentToMaxDistance) {//将目标点拉远,延长用更容易造成与地面的碰撞 Vector3 dir = newTargetPos - newSourcePos; dir.Normalize(); newTargetPos = newSourcePos + dir * maxDistance; } newParam.targetObject = EffectParam.targetObject; newParam.targetPos = EffectParam.targetPos; } if (areaConfig.customOffset.sqrMagnitude > 0.001f) { //有此设置时,变更起始点,变为相对于newParam.targetPos,偏移customOffet Vector3 offsetNormal = EffectParam.targetPos - newSourcePos; offsetNormal.y = 0; offsetNormal.Normalize(); Vector3 offsetTangent = new Vector3(0, 1, 0); Vector3 offsetBinormal = Vector3.Cross(offsetTangent, offsetNormal); //Vector3.OrthoNormalize(ref offsetNormal, ref offsetTangent,ref offsetBinormal); Vector3 offSet = newParam.targetPos; offSet += offsetNormal * areaConfig.customOffset.z; offSet += offsetTangent * areaConfig.customOffset.y; offSet += offsetBinormal * areaConfig.customOffset.x; newParam.sourcePos = offSet; newParam.nEffectFlag |= (int)LightEffectParam.EFFECT_FLAG.CustomSourcePos; } LightingEffectManager leManager = EffectParam.srcObject.GetComponent <LightingEffectManager>(); if (leManager != null) { ////测试用代码,用来标记检测发射区域是否正确 //GameObject checkPoint = GameObject.CreatePrimitive(PrimitiveType.Sphere); //checkPoint.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f); //checkPoint.transform.SetPosition( newParam.targetPos; //checkPoint.collider.enabled = false; //checkPoint.name = "Point" + mEffectLeftCount.ToString(); leManager.AddLighting(areaConfig.subEffectID, newParam); } return(true); }