private void MoveNpc(EntityInfo obj, long deltaTime) { if (obj.HaveState(CharacterPropertyEnum.x3002_昏睡) || obj.HaveState(CharacterPropertyEnum.x3001_眩晕)) { return; } MovementStateInfo msi = obj.GetMovementStateInfo(); //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。 if (!obj.IsDead() && obj.CanMove && msi.IsMoving) { ScriptRuntime.Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.ActualProperty.GetFloat(CharacterPropertyEnum.x2011_最终速度); float distance = (speed * (float)(int)deltaTime) / 1000.0f; ScriptRuntime.Vector3 dir = msi.TargetDir; //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; if (msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y); msi.SetPosition2D(newPos); msi.IsMoving = false; } else { ScriptRuntime.Vector3 tpos = pos + dir * distance; msi.SetPosition(tpos); } } }
public static void AoeQuery(GameObject srcObj, GameObject targetObj, int aoeType, float range, float angleOrLength, SkillInstance instance, int senderId, int targetType, Vector3 relativeCenter, bool relativeToTarget, MyFunc<float, int, bool> callback) { float radian; Vector3 center; if (null != targetObj && relativeToTarget) { Vector3 srcPos = srcObj.transform.position; Vector3 targetPos = targetObj.transform.position; radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newOffset = Geometry.GetRotate(new ScriptRuntime.Vector2(relativeCenter.x, relativeCenter.z), radian); center = targetPos + new Vector3(newOffset.X, relativeCenter.y, newOffset.Y); } else { radian = Geometry.DegreeToRadian(srcObj.transform.localRotation.eulerAngles.y); center = srcObj.transform.TransformPoint(relativeCenter); } if (aoeType == (int)SkillAoeType.Circle || aoeType == (int)SkillAoeType.Sector) { angleOrLength = Geometry.DegreeToRadian(angleOrLength); ClientModule.Instance.KdTree.Query(center.x, center.y, center.z, range, (float distSqr, KdTreeObject kdTreeObj) => { int targetId = kdTreeObj.Object.GetId(); if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) || targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) { bool isMatch = false; if (aoeType == (int)SkillAoeType.Circle) { isMatch = true; } else { ScriptRuntime.Vector2 u = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian); isMatch = Geometry.IsSectorDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), u, angleOrLength / 2, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } if (isMatch) { if (!callback(distSqr, kdTreeObj.Object.GetId())) { return false; } } } return true; }); } else { ScriptRuntime.Vector2 angleu = Geometry.GetRotate(new ScriptRuntime.Vector2(0, angleOrLength), radian); ScriptRuntime.Vector2 c = new ScriptRuntime.Vector2(center.x, center.z) + angleu / 2; GameFramework.ClientModule.Instance.KdTree.Query(c.X, 0, c.Y, range + angleOrLength / 2, (float distSqr, GameFramework.KdTreeObject kdTreeObj) => { int targetId = kdTreeObj.Object.GetId(); if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) || targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) { bool isMatch = false; if (aoeType == (int)SkillAoeType.Capsule) { isMatch = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), angleu, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } else { ScriptRuntime.Vector2 half = new ScriptRuntime.Vector2(range / 2, angleOrLength / 2); isMatch = Geometry.IsObbDiskIntersect(c, half, radian, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } if (isMatch) { if (!callback(distSqr, kdTreeObj.Object.GetId())) { return false; } } } return true; }); } }
/** * @brief 将字符串解析为Vector2D * * @param vec 字符串,类似于"100,200" * * @return */ public static ScriptRuntime.Vector2 ConvertVector2D(string vec) { string strPos = vec; string[] resut = strPos.Split(s_ListSplitString, StringSplitOptions.None); ScriptRuntime.Vector2 vector = new ScriptRuntime.Vector2(Convert.ToSingle(resut[0]), Convert.ToSingle(resut[1])); return(vector); }
/** * @brief 预估移动时间 * * @param pos * * @return */ public float PredictMoveDuration(CharacterInfo character, ScriptRuntime.Vector2 pos) { float distance = ScriptRuntime.Vector2.Distance(character.GetMovementStateInfo().GetPosition2D(), pos); float duration = distance / character.GetActualProperty().MoveSpeed; duration += ClientConfig.s_PredictMoveDurationRefix; return(duration); }
public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime) { GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo; if (null == senderObj) { return(false); } GameObject obj = senderObj.GfxObj; if (obj == null) { return(false); } GameObject targetObj = senderObj.TargetGfxObj; if (null != senderObj.TrackEffectObj) { obj = senderObj.TrackEffectObj; targetObj = senderObj.GfxObj; } if (curSectionTime < StartTime) { return(true); } if (m_IsForRoundMove) { Vector3 srcPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj) { targetPos = targetObj.transform.position; } TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos); if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) { float angle = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_RelativeOffset.x, m_RelativeOffset.z), angle); targetPos = new Vector3(newPos.X, srcPos.y + m_RelativeOffset.y, newPos.Y); TriggerUtil.MoveObjTo(obj, targetPos); } } else if (null != targetObj) { //Vector3 pos = targetObj.transform.TransformPoint(m_RelativeOffset); Vector3 srcPos = obj.transform.position; Vector3 pos = Vector3.zero; if (null != targetObj) { pos = targetObj.transform.position; } TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref pos); pos.y = srcPos.y; TriggerUtil.MoveObjTo(obj, pos); } return(false); }
public static ScriptRuntime.Vector2 ConvertVector2D(string vec) { try { string strPos = vec; string[] resut = strPos.Split(s_ListSplitString, StringSplitOptions.RemoveEmptyEntries); ScriptRuntime.Vector2 vector = new ScriptRuntime.Vector2(Convert.ToSingle(resut[0]), Convert.ToSingle(resut[1])); return(vector); } catch (System.Exception ex) { LogSystem.Error("ConvertVector2D {0} Exception:{1}/{2}", vec, ex.Message, ex.StackTrace); throw; } }
private void MoveNpc(EntityInfo obj, long deltaTime) { if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) { return; } MovementStateInfo msi = obj.GetMovementStateInfo(); //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。 if (!obj.IsDead() && obj.CanMove && msi.IsMoving && !msi.IsSkillMoving) { ScriptRuntime.Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.GetActualProperty().MoveSpeed; float distance = (speed * (float)(int)deltaTime) / 1000.0f; ScriptRuntime.Vector3 dir = msi.TargetDir; //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; if (msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y); msi.SetPosition2D(newPos); msi.IsMoving = false; User user = obj.CustomData as User; if (null != user) { Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(obj); if (null != npcMoveBuilder) { Scene scene = user.OwnRoom.ActiveScene; if (null != scene) { scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder); } } } } else { ScriptRuntime.Vector3 tpos = pos + dir * distance; msi.SetPosition(tpos); } } }
public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime) { GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo; if (null == senderObj) return false; GameObject obj = senderObj.GfxObj; if (obj == null) { return false; } GameObject targetObj = senderObj.TargetGfxObj; if (null != senderObj.TrackEffectObj) { obj = senderObj.TrackEffectObj; targetObj = senderObj.GfxObj; } if (curSectionTime < StartTime) { return true; } if (m_IsForRoundMove) { Vector3 srcPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj) { targetPos = targetObj.transform.position; } TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos); if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) { float angle = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_RelativeOffset.x, m_RelativeOffset.z), angle); targetPos = new Vector3(newPos.X, srcPos.y + m_RelativeOffset.y, newPos.Y); TriggerUtil.MoveObjTo(obj, targetPos); } } else if (null != targetObj) { //Vector3 pos = targetObj.transform.TransformPoint(m_RelativeOffset); Vector3 srcPos = obj.transform.position; Vector3 pos = Vector3.zero; if (null != targetObj) { pos = targetObj.transform.position; } TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref pos); pos.y = srcPos.y; TriggerUtil.MoveObjTo(obj, pos); } return false; }
private bool Prepare(GfxSkillSenderInfo senderObj, GameObject obj, GameObject targetObj) { if (!m_TargetChecked) { m_TargetChecked = true; Vector3 srcPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj && m_ObjPath == "vector3") { targetPos = targetObj.transform.position; float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); } else { var tobj = GameObject.Find(m_ObjPath); if (null != tobj) { targetPos = tobj.transform.position; } else { return(false); } } m_Forward = targetPos - srcPos; m_Forward.y = 0; m_Velocity = m_Forward.magnitude * 1000 / m_Duration; m_Forward.Normalize(); if (m_IsFaceToTarget) { float radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); obj.transform.rotation = Quaternion.AngleAxis(Geometry.RadianToDegree(radian), Vector3.up); } float tan = GetTanToPoint(m_Velocity, m_G, srcPos, targetPos); m_InitY = srcPos.y; m_YVelocity = m_Velocity * tan; } return(true); }
/// <summary> /// Raises the draw gizmos selected event. /// </summary> protected virtual void OnDrawGizmosSelected() { if (npcInfo == null) { return; } UnityEditor.Handles.color = viewRangeColor; UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, npcInfo.ViewRange); SkillInfo skillInfo = npcInfo.GetSkillStateInfo().GetCurSkillInfo(); if (skillInfo != null) { UnityEditor.Handles.color = skillRangeColor; UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, skillInfo.distance); TableConfig.Skill cfg = skillInfo.ConfigData; if (cfg.aoeType == (int)SkillAoeType.Circle) { UnityEditor.Handles.color = Color.black; UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, cfg.aoeSize); } else if (cfg.aoeType == (int)SkillAoeType.Sector) { UnityEditor.Handles.color = Color.black; float radian = Utility.DegreeToRadian(transform.localRotation.eulerAngles.y); ScriptRuntime.Vector2 dir = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian - cfg.aoeAngleOrLength / 2); UnityEditor.Handles.DrawWireArc(transform.position, Vector3.up, new Vector3(dir.X, 0, dir.Y), cfg.aoeAngleOrLength, cfg.aoeSize); } else { float radian = Utility.DegreeToRadian(transform.localRotation.eulerAngles.y); ScriptRuntime.Vector2 dir = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian) * cfg.aoeAngleOrLength; Vector3 pos1 = transform.position; Vector3 pos2 = pos1 + new Vector3(dir.X, 0, dir.Y); UnityEditor.Handles.color = Color.black; UnityEditor.Handles.DrawLine(pos1, pos2); } } }
private void MoveNpc(EntityInfo obj, long deltaTime) { if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) { return; } MovementStateInfo msi = obj.GetMovementStateInfo(); //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。 if (!obj.IsDead() && obj.CanMove && msi.IsMoving && !msi.IsSkillMoving) { ScriptRuntime.Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.GetActualProperty().MoveSpeed; float distance = (speed * (float)(int)deltaTime) / 1000.0f; ScriptRuntime.Vector3 dir = msi.TargetDir; //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; if (msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y); msi.SetPosition2D(newPos); msi.IsMoving = false; User user = obj.CustomData as User; if (null != user) { Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(obj); if (null != npcMoveBuilder) { Scene scene = user.OwnRoom.ActiveScene; if (null != scene) { scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder); } } } } else { ScriptRuntime.Vector3 tpos = pos + dir * distance; msi.SetPosition(tpos); } } }
public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime) { GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo; if (null == senderObj) { return(false); } GameObject obj = senderObj.GfxObj; if (null == obj) { return(false); } GameObject targetObj = senderObj.TargetGfxObj; if (null != senderObj.TrackEffectObj) { obj = senderObj.TrackEffectObj; targetObj = senderObj.GfxObj; } bool isTower = !EntityController.Instance.IsMovableEntity(obj); if (isTower) { return(false); } if (!m_TargetChecked) { m_TargetChecked = true; m_RealDuration = m_Duration; m_RealVelocity = m_Velocity; if (m_RealDuration <= 0) { m_RealDuration += instance.CurSectionDuration; } if (m_RealDuration <= 0) { LogSystem.Warn("jump duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId); return(false); } if (null != targetObj || m_IsForRoundMove) { Vector3 srcPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj) { targetPos = targetObj.transform.position; } if (m_IsForRoundMove) { TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos); } if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) { float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); m_TargetPos = targetPos; if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity) { m_RealVelocity = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealDuration); } else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime) { m_RealDuration = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealVelocity); CalcYVelocityAndG(); } m_Forward = targetPos - srcPos; m_Forward.y = 0; m_Forward.Normalize(); } else { m_Forward = obj.transform.forward; } } else { m_Forward = obj.transform.forward; } m_InitY = obj.transform.position.y; } if (curSectionTime < StartTime) { return(true); } else if (curSectionTime <= StartTime + m_RealDuration) { float t = (float)(int)(curSectionTime - StartTime) / 1000.0f; float disty = m_YVelocity * t - m_G * t * t / 2; float dist = TriggerUtil.ConvertToSecond(delta) * m_RealVelocity; Vector3 targetPos = obj.transform.position + m_Forward * dist; targetPos.y = m_InitY + disty; TriggerUtil.MoveObjTo(obj, targetPos); return(true); } else { Vector3 srcPos = obj.transform.position; if (m_IsForRoundMove && m_TargetPos.sqrMagnitude > Geometry.c_FloatPrecision) { srcPos = m_TargetPos; } obj.transform.position = new Vector3(srcPos.x, m_InitY, srcPos.z); return(false); } }
public static void AoeQuery(GameObject srcObj, GameObject targetObj, int aoeType, float range, float angleOrLength, SkillInstance instance, int senderId, int targetType, Vector3 relativeCenter, bool relativeToTarget, MyFunc <float, int, bool> callback) { float radian; Vector3 center; if (null != targetObj && relativeToTarget) { Vector3 srcPos = srcObj.transform.position; Vector3 targetPos = targetObj.transform.position; radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newOffset = Geometry.GetRotate(new ScriptRuntime.Vector2(relativeCenter.x, relativeCenter.z), radian); center = targetPos + new Vector3(newOffset.X, relativeCenter.y, newOffset.Y); } else { radian = Geometry.DegreeToRadian(srcObj.transform.localRotation.eulerAngles.y); center = srcObj.transform.TransformPoint(relativeCenter); } if (aoeType == (int)SkillAoeType.Circle || aoeType == (int)SkillAoeType.Sector) { angleOrLength = Geometry.DegreeToRadian(angleOrLength); PluginFramework.Instance.KdTree.QueryWithFunc(center.x, center.y, center.z, range, (float distSqr, KdTreeObject kdTreeObj) => { int targetId = kdTreeObj.Object.GetId(); if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) || targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) { bool isMatch = false; if (aoeType == (int)SkillAoeType.Circle) { isMatch = true; } else { ScriptRuntime.Vector2 u = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian); isMatch = Geometry.IsSectorDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), u, angleOrLength / 2, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } if (isMatch) { if (!callback(distSqr, kdTreeObj.Object.GetId())) { return(false); } } } return(true); }); } else { ScriptRuntime.Vector2 angleu = Geometry.GetRotate(new ScriptRuntime.Vector2(0, angleOrLength), radian); ScriptRuntime.Vector2 c = new ScriptRuntime.Vector2(center.x, center.z) + angleu / 2; GameFramework.PluginFramework.Instance.KdTree.QueryWithFunc(c.X, 0, c.Y, range + angleOrLength / 2, (float distSqr, GameFramework.KdTreeObject kdTreeObj) => { int targetId = kdTreeObj.Object.GetId(); if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) || targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) { bool isMatch = false; if (aoeType == (int)SkillAoeType.Capsule) { isMatch = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), angleu, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } else { ScriptRuntime.Vector2 half = new ScriptRuntime.Vector2(range / 2, angleOrLength / 2); isMatch = Geometry.IsObbDiskIntersect(c, half, radian, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius); } if (isMatch) { if (!callback(distSqr, kdTreeObj.Object.GetId())) { return(false); } } } return(true); }); } }
private bool Prepare(GfxSkillSenderInfo senderObj, SkillInstance instance, GameObject obj, GameObject targetObj) { if (!m_TargetChecked) { m_TargetChecked = true; m_RealDuration = m_Duration; m_RealVelocity = m_Velocity; if (m_RealDuration <= 0) { m_RealDuration += instance.CurSectionDuration; } if (m_RealDuration <= 0) { LogSystem.Warn("charge duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId); return(false); } m_StartPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj) { targetPos = targetObj.transform.position; } if (!m_IsFreeMove && targetPos.sqrMagnitude > Geometry.c_FloatPrecision) { float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos; if (m_RandRelativeToSelf) { int v = Helper.Random.Next(); if (v < 50) { newPos = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y); } else { newPos = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(-m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y); } } else if (m_RelativeToSelf) { newPos = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y); } else if (m_RandRelativeToTarget) { int v = Helper.Random.Next(); if (v < 50) { newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); } else { newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(-m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); } } else { newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); } m_Forward = targetPos - m_StartPos; m_Forward.y = 0; m_Forward.Normalize(); if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity) { m_RealVelocity = (long)(1000.0f * (targetPos - m_StartPos).magnitude / m_RealDuration); m_TargetPos = targetPos; } else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime) { m_RealDuration = (long)(1000.0f * (targetPos - m_StartPos).magnitude / m_RealVelocity); m_TargetPos = targetPos; } else { m_TargetPos = m_StartPos + m_Forward * m_RealVelocity * m_RealDuration / 1000.0f; } } else { if (m_RandRelativeToSelf) { int v = Helper.Random.Next(); if (v < 50) { m_TargetPos = obj.transform.TransformPoint(m_Offset.x, 0, m_Offset.z); } else { m_TargetPos = obj.transform.TransformPoint(-m_Offset.x, 0, m_Offset.z); } } else if (m_RelativeToSelf) { m_TargetPos = obj.transform.TransformPoint(m_Offset.x, 0, m_Offset.z); } else { m_TargetPos = obj.transform.TransformPoint(0, 0, m_RealVelocity * m_RealDuration / 1000.0f); } m_Forward = obj.transform.forward; } } return(true); }
/** * @brief 检验是否在某位置 * * @param pos * * @return */ public bool IsAtPosition(CharacterInfo entity, ScriptRuntime.Vector2 pos) { return(ScriptRuntime.Vector2.Distance(entity.GetMovementStateInfo().GetPosition2D(), pos) < ClientConfig.s_PositionRefix); }
public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime) { GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo; if (null == senderObj) return false; GameObject obj = senderObj.GfxObj; if (null == obj) return false; GameObject targetObj = senderObj.TargetGfxObj; if (null != senderObj.TrackEffectObj) { obj = senderObj.TrackEffectObj; targetObj = senderObj.GfxObj; } bool isTower = !EntityController.Instance.IsMovableEntity(obj); if (isTower) return false; if (!m_TargetChecked) { m_TargetChecked = true; m_RealDuration = m_Duration; m_RealVelocity = m_Velocity; if (m_RealDuration <= 0) { m_RealDuration += instance.CurSectionDuration; } if (m_RealDuration <= 0) { LogSystem.Warn("jump duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId); return false; } if (null != targetObj || m_IsForRoundMove) { Vector3 srcPos = obj.transform.position; Vector3 targetPos = Vector3.zero; if (null != targetObj) { targetPos = targetObj.transform.position; } if (m_IsForRoundMove) { TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos); } if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) { float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z)); ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree); targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y); m_TargetPos = targetPos; if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity) { m_RealVelocity = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealDuration); } else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime) { m_RealDuration = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealVelocity); CalcYVelocityAndG(); } m_Forward = targetPos - srcPos; m_Forward.y = 0; m_Forward.Normalize(); } else { m_Forward = obj.transform.forward; } } else { m_Forward = obj.transform.forward; } m_InitY = obj.transform.position.y; } if (curSectionTime < StartTime) { return true; } else if (curSectionTime <= StartTime + m_RealDuration) { float t = (float)(int)(curSectionTime - StartTime) / 1000.0f; float disty = m_YVelocity * t - m_G * t * t / 2; float dist = TriggerUtil.ConvertToSecond(delta) * m_RealVelocity; Vector3 targetPos = obj.transform.position + m_Forward * dist; targetPos.y = m_InitY + disty; TriggerUtil.MoveObjTo(obj, targetPos); return true; } else { Vector3 srcPos = obj.transform.position; if (m_IsForRoundMove && m_TargetPos.sqrMagnitude > Geometry.c_FloatPrecision) { srcPos = m_TargetPos; } obj.transform.position = new Vector3(srcPos.x, m_InitY, srcPos.z); return false; } }
public void SetPosition2D(ScriptRuntime.Vector2 pos) { m_Position.X = pos.X; m_Position.Z = pos.Y; }
internal void OnTick(ScriptRuntime.Vector2 frame_time) { mHandleTick(mName, frame_time.X, frame_time.Y); }