/// <summary> /// 返回一个最合理的拾取位置 /// </summary> public Vector3 GenerateDropPosition(Vector3 pos, int count) { //if(count > 3) // return pos; Vector3 retPos = Vector3.zero; // 先对位置进行简单随机 // const float dropPosMaxOffset = 2f; // float offsetX = Maths.Random_.Range(-dropPosMaxOffset, dropPosMaxOffset); // float offsetZ = Maths.Random_.Range(-dropPosMaxOffset, dropPosMaxOffset); // retPos.x = pos.x + offsetX; // retPos.y = pos.y; // retPos.x = pos.z + offsetZ; Actor localPlayer = Game.GetInstance().GetLocalPlayer(); if (pos.Equals(Vector3.zero) == true && localPlayer != null) { pos = localPlayer.transform.position; } int dropCnt = DropNum + 10; float r = dropCnt * 0.1f; float degrees = dropCnt * 1f; retPos.x = pos.x + r * (float)Math.Cos(degrees); retPos.z = pos.z + r * (float)Math.Sin(degrees); if (localPlayer != null) { retPos.y = localPlayer.transform.position.y; } //GameDebug.LogWarning("Drop pos: " + retPos); // 限制在副本场景内 retPos = InstanceHelper.ClampInWalkableRange(retPos); // 获取地形高度 retPos.y = PhysicsHelp.GetHeight(retPos.x, retPos.z); // 如果地形太低、则取本地玩家的高度 if (retPos.y <= -19f) { var local_player = Game.GetInstance().GetLocalPlayer(); if (local_player != null) { retPos.y = local_player.transform.position.y; } } /*foreach (DropColliderComponent drop in mDrops) * { * if (drop != null && (retPos - drop.transform.position).sqrMagnitude < 3f) * { * return GenerateDropPosition(retPos, count+1); * } * }*/ return(retPos); }
public void FixPos() { Transform trans = m_ModelParent.transform; trans.position = PhysicsHelp.GetPosition(trans.position.x, trans.position.z); //trans.position = InstanceHelper.ClampInWalkableRange(trans.position); //if (Mathf.Approximately(trans.position.y, PhysicsHelp.ILLEGAL_HEIGHT)) //{ // GameDebug.LogWarning(string.Format("InterObject ILLEGAL_HEIGHT {0}", trans.position.ToString())); // trans.position = InstanceHelper.ClampInWalkableRange(trans.position); //} }
public IEnumerator SetFootprintId(uint footprintId) { if (footprintId <= 0) { Clear(); yield break; } if (mFootprintId == footprintId) { yield break; } DBFootprint.DBFootprintItem item = DBFootprint.GetFootprintItem(footprintId); if (item == null) { yield break; } mSceneEffectFile = item.SuitablePath(true); mSceneEffectDelayTime = item.DelayTime; mCDTime = item.CDTime; mMinDistance = item.MinDistance; mCreateTime = 0; //var avatarPart = DBManager.Instance.GetDB<DBAvatarPart>().mData[footprintId]; var avatarPart = DBAvatarPart.GetAvatarPartData(footprintId); if (avatarPart == null) { yield break; } mStandEffectFile = avatarPart.SuitablePath(true); if (mOwner == null || mOwner.transform == null) { yield break; } Vector3 pos = mOwner.transform.position; pos.y = PhysicsHelp.GetHeight(pos.x, pos.z); mLastEffectPos = pos; mFootprintId = footprintId; if (mOwner.IsUIModel()) { yield return(ResourceLoader.Instance.StartCoroutine(LoadStandEffect(mStandEffectFile))); } }
void CheckCreateEffect() { mCreateTime += Time.deltaTime; if (mCreateTime > mCDTime) { Vector3 pos = mOwner.transform.position; pos.y = PhysicsHelp.GetHeight(pos.x, pos.z); if (Vector3.Distance(pos, mLastEffectPos) >= mMinDistance) { mCreateTime = 0; CreateSceneEffect(pos); mLastEffectPos = pos; } } }
void HandleServerData(ushort protocol, byte[] data) { switch (protocol) { case NetMsg.MSG_MAP_LINE_STATE: // 处理换线逻辑 { S2CMapLineState msg = S2CPackBase.DeserializePack <S2CMapLineState>(data); SceneHelp.Instance.ProcessLineInfo(msg); } break; case NetMsg.MSG_PLAYER_DISPLAY_INFO: // 处理查看其他玩家信息 { var msg = S2CPackBase.DeserializePack <S2CPlayerDisplayInfo>(data); var equip_infos = msg.equips; m_OtherPlayerEquip.Clear(); foreach (var info in equip_infos) { var equip_goods = GoodsHelper.CreateEquipGoodsFromNet(info); equip_goods.IsInstalledByOtherPlayer = true; m_OtherPlayerEquip.Add(equip_goods); } Equip.EquipHelper.CalculatorSuitNum(m_OtherPlayerEquip); m_OtherPlayerEquipPosInfos = Equip.EquipHelper.GetEquipPosInfosByPkgInfos(msg.strengths, msg.baptizes); ClientEventMgr.Instance.FireEvent((int)ClientEvent.CE_CLICKPLAY_DISPLAY_INFO, new CEventEventParamArgs(msg.info, m_OtherPlayerEquip, m_OtherPlayerEquipPosInfos)); } break; case NetMsg.MSG_MAP_GET_HANG_POS: // 请求挂机位置 { S2CMapGetHangPos msg = S2CPackBase.DeserializePack <S2CMapGetHangPos>(data); Vector3 pos = new Vector3(msg.pos.px * GlobalConst.UnitScale, 0f, msg.pos.py * GlobalConst.UnitScale); pos = PhysicsHelp.GetPosition(pos.x, pos.z); TargetPathManager.Instance.GoToConstPosition(msg.dungeon_id, msg.line_id, pos, null, () => { InstanceManager.Instance.SetOnHook(true); }); } break; default: break; } }
/// <summary> /// 移动固定的位置 /// </summary> /// <param name="offset">移动的偏移数值</param> /// <param name="on_ground">移动时是否贴近地面</param> /// <param name="slider">移动时是否沿着边界滑动</param> public void Move(Vector3 offset, bool on_ground, bool slider = true) { // MoveAgent(offset, on_ground, slider); // return; if (offset == Vector3.zero || mOwner.DisableMoveState) { return; } move_data.pos = new PkgNwarPos(); // 减少Trans.position 这样的调用,会显著影响性能 Vector3 ownerPos = mOwnerTrans.position; // 当移动不贴近地面(浮空等)时,需要先计算贴近地面的高度,不然NavMesh的碰撞检测可能检测不到 if (on_ground == false) { float height = RoleHelp.GetHeightInScene(mOwner.ActorId, ownerPos.x, ownerPos.z); ownerPos.y = height; } Vector3 origin = ownerPos; // 碰撞检测的起点 Vector3 newPos = origin + offset; // 移动后的新位置 Vector3 move = offset; // 偏移量 float offset_y = move.y; // 记录原有的高度偏移 move.y = 0; // 碰撞检测时将高度偏移设置为0 bool touchEdge = false; // 已经触碰到边界 bool is_localplayer = mOwner.IsLocalPlayer; bool collide_check = true; bool is_monster = mOwner.IsMonster();//怪物不进行碰撞检测 if (is_monster) { collide_check = false; } else { collide_check = true; } if (collide_check) { Vector3 final_move = move; XNavMeshHit hit; if (XNavMesh.Raycast(origin, origin + move * (1.0f + Radius / move.magnitude), out hit, LevelManager.GetInstance().AreaExclude)) { touchEdge = true; if (slider)// 需要沿着边界滑动时 { float sameDir = Vector3.Dot(hit.normal, final_move); if (sameDir > 0)// 法线与移动方向相同,说明角色在边界外 { final_move.y = offset_y; newPos = origin + final_move; } else { if (hit.normal == Vector3.zero)// NavMesh获得的法线数值可能为0 { Debug.DrawLine(origin, origin + final_move, Color.yellow, 5.0f); final_move.y = offset_y; newPos = origin + final_move; //final_move = Vector3.zero; //newPos = origin; } else { // 碰到边界进行滑动 Vector3 tanget = Vector3.Cross(Vector3.up, hit.normal); final_move = tanget * Vector3.Dot(tanget, final_move); float sMoveLen = final_move.magnitude; if (sMoveLen < DBActor.MinDisToGround)// 移动方向垂直于法线 { final_move = Vector3.zero; newPos = origin; } else { // 沿着切线方向再次做检测,以免滑动的时候移动到另一个边界外 if (XNavMesh.Raycast(origin, origin + final_move * (1.0f + Radius / sMoveLen), out hit, LevelManager.GetInstance().AreaExclude)) { final_move = Vector3.zero; newPos = origin; } else { final_move.y = offset_y; newPos = origin + final_move; } } } } } else// 不滑动,则直接移动到碰撞点 { Vector3 radius_pos = PhysicsHelp.BoundaryHitPos(origin, hit.position); newPos.x = radius_pos.x; newPos.z = radius_pos.z; } } } float terrain_height = RoleHelp.GetHeightInScene(mOwner.ActorId, newPos.x, newPos.z); if (newPos.y < terrain_height + DBActor.MinDisToGround)// 如果当前位置已经贴近地面,则设置m_IsGround为true { m_IsGround = true; newPos.y = terrain_height; } else { if (on_ground || touchEdge) // 如果角色已经触碰到边界,则让其掉到地上 { newPos.y = terrain_height; m_IsGround = true; } else { m_IsGround = false; } } // 在多人副本、野外地图中,本地玩家碰到障碍物的时候需要通知服务端 if (is_localplayer && slider) { if (touchEdge) { m_IsTouchEdge = true; Vector3 totalMove = newPos - origin; totalMove.y = 0; Vector3 moveDir = totalMove.normalized; move_data.id = mOwner.UID.obj_idx; move_data.pos.px = (int)(origin.x * 100.0f); move_data.pos.py = (int)(origin.z * 100.0f); move_data.dir = Maths.Util.VectorToAngle(moveDir); float totalMoveLen = totalMove.magnitude; Vector3 xz_offset = offset; xz_offset.y = 0; float ortMoveLen = xz_offset.magnitude; if (totalMoveLen > 0 && ortMoveLen > 0) { move_data.speed = (uint)(mOwner.MoveSpeed * (totalMoveLen / ortMoveLen) * 100); } else { move_data.speed = 0; } // 数据发生变化时才发送滑动协议 if (!mSliderData.Equal(move_data)) { mSliderData.Assign(move_data); slider_data.slide = move_data; NetClient.GetCrossClient().SendData <C2SNwarSlide>(NetMsg.MSG_NWAR_SLIDE, slider_data); } } // 当滑动结束时,需要同步一次方向和位置 else if (m_IsTouchEdge) { m_IsTouchEdge = false; Vector3 totalMove = newPos - origin; totalMove.y = 0; Vector3 moveDir = totalMove.normalized; move_data.id = mOwner.UID.obj_idx; move_data.pos.px = (int)(origin.x * 100.0f); move_data.pos.py = (int)(origin.z * 100.0f); move_data.dir = Maths.Util.VectorToAngle(moveDir); float totalMoveLen = totalMove.magnitude; Vector3 xz_offset = offset; xz_offset.y = 0; float ortMoveLen = xz_offset.magnitude; if (totalMoveLen > 0 && ortMoveLen > 0) { move_data.speed = (uint)(mOwner.MoveSpeed * (totalMoveLen / ortMoveLen) * 100); } else { move_data.speed = 0; } mSliderData.Assign(move_data); slider_data.slide = move_data; NetClient.GetCrossClient().SendData <C2SNwarSlide>(NetMsg.MSG_NWAR_SLIDE, slider_data); } } mOwnerTrans.position = newPos; OnMove(); }
public void UpdateUnitCache(bool doAll, UnitCacheDataFilter filter) { const int MAX_PROCESS_UNIT_PER_FRAME = 3; for (int i = 0; mUnitCacheData.Count != 0; ++i) { if (!doAll) { if (i >= MAX_PROCESS_UNIT_PER_FRAME) { break; } } UnitCacheInfo info = PopUnitCacheData(); if (info == null) { continue; } if (info.UnitType != EUnitType.UNITTYPE_PLAYER && info.UnitType != EUnitType.UNITTYPE_NPC && info.UnitType != EUnitType.UNITTYPE_MONSTER && info.UnitType != EUnitType.UNITTYPE_PET) { continue; } if (filter != null && !filter(info)) { continue; } Actor actor = null; if (info.CacheType == UnitCacheInfo.EType.ET_Create) { float rawY = info.PosBorn.y; info.PosBorn = PhysicsHelp.GetPosition(info.PosBorn.x, info.PosBorn.z); if (info.UnitType == EUnitType.UNITTYPE_PLAYER) { if (info.UnitID.Equals(mGame.LocalPlayerID))// 创建本地玩家 { actor = mGame.GetLocalPlayer(); if (actor == null) { var vocation = (Actor.EVocationType)ActorHelper.TypeIdToRoleId(info.AOIPlayer.type_idx); info.AOIPlayer.model_id_list = ReplaceModelList(info.AOIPlayer.model_id_list, vocation, false); actor = ActorManager.Instance.CreateActor <LocalPlayer>(info, info.Rotation, null); ClientEventMgr.GetInstance().FireEvent((int)ClientEvent.CE_LOCALPLAYER_CREATE, new CEventBaseArgs(actor)); } } else// 创建其他玩家 { if (ActorManager.Instance.ActorSet.ContainsKey(info.UnitID)) { GameDebug.Log(string.Format("Player(ID: {0}) has been created.", info.UnitID.obj_idx)); continue; } actor = ActorManager.Instance.CreateActor <RemotePlayer>(info, info.Rotation, null); // FIXME 创建本地玩家的时候也会发送该消息 ClientEventMgr.GetInstance().FireEvent((int)ClientEvent.CE_REMOTEPLAYER_CREATE, new CEventBaseArgs(actor)); } } else if (info.UnitType == EUnitType.UNITTYPE_NPC) { actor = ActorManager.Instance.CreateActor <NpcPlayer>(info, info.ClientNpc.Rotation, null); } else if (info.UnitType == EUnitType.UNITTYPE_MONSTER) { if (ActorManager.Instance.ActorSet.ContainsKey(info.UnitID)) { GameDebug.LogError(string.Format("Monster(ID: {0}) has been created.", info.UnitID.obj_idx)); continue; } Monster.CreateParam createParam = new Monster.CreateParam(); createParam.is_pet = false; if (ActorHelper.IsSummon(info.UnitID.obj_idx)) { createParam.summon = true; createParam.summonType = Monster.MonsterType.SummonRemoteMonster; if (info.ParentActor != null) { createParam.master = info.ParentActor.UID; // 判断是不是本地召唤怪 if (createParam.master.Equals(Game.Instance.LocalPlayerID) == true) { createParam.summonType = Monster.MonsterType.SummonLocalMonster; } } } var obj = ActorManager.Instance.CreateActor <Monster>(info, info.Rotation, createParam); } else if (info.UnitType == EUnitType.UNITTYPE_PET) { if (ActorManager.Instance.ActorSet.ContainsKey(info.UnitID)) { GameDebug.LogError(string.Format("Pet(ID: {0}) has been created.", info.UnitID.obj_idx)); continue; } Monster.CreateParam createParam = new Monster.CreateParam(); createParam.is_pet = true; createParam.summon = false; if (info.ParentActor != null) { createParam.master = info.ParentActor.UID; } if (info.AOIPet.is_local) { ActorManager.Instance.CreateActor <LocalPet>(info, info.Rotation, createParam); } else { ActorManager.Instance.CreateActor <RemotePet>(info, info.Rotation, createParam); } } } else if (info.CacheType == UnitCacheInfo.EType.ET_Destroy) { ActorManager.Instance.DestroyActor(info.UnitID, 0); } else { GameDebug.LogError("Error Cache data!"); } } }
/// <summary> /// 开始 /// </summary> public override bool Begin(SkillAction action) { base.Begin(action); m_DynamicStageTime = mSkillAction.ActionData.CastingStageTime; m_RealTargetPos = Vector3.zero; // 判定是否要进入持续施法阶段 if (mSkillAction.ActionData.SkillInfo.CastingTime <= 0.0f) { return(false); } Actor src_actor = mSkillAction.SkillParent.SrcActor; // 技能的隐身 if (mSkillAction.ActionData.SkillInfo.Invisible) { if (src_actor.mVisibleCtrl.VisibleMode == EVisibleMode.Visible) { mSkillAction.HideActor = true; src_actor.mVisibleCtrl.SetActorVisible(false, true, false, VisiblePriority.SKILL); } } // 播放动画 string casting_ani = mSkillAction.ActionData.CastingAnimation; if (casting_ani != string.Empty && casting_ani != mSkillAction.ActionData.SkillAnimation) { src_actor.Play(mSkillAction.ActionData.CastingAnimation); } src_actor.SetAnimationSpeed(mSkillAction.SkillParent.SpeedScale); // 施法阶段的位移 MoveCtrl move_ctrl = src_actor.MoveCtrl; mSkillAction.SkillParent.MovingSpeed = mSkillAction.ActionData.SkillInfo.CastingSpeed; src_actor.MoveSpeed = mSkillAction.ActionData.SkillInfo.CastingSpeed; mSkillAction.BeginMove(); uint target_id = mSkillAction.SkillParent.TargetID; // 目标玩家的id if (target_id == 0) // 无目标玩家 { move_ctrl.MoveDirInAttacking(src_actor.ForwardDir); // 沿当前方向移动 Vector3 src_pos = src_actor.Trans.position; m_RealTargetPos = src_pos + mSkillAction.SkillParent.AttackDir * mSkillAction.ActionData.SkillInfo.CastingSpeed * mSkillAction.ActionData.CastingStageTime; XNavMeshHit hit; if (XNavMesh.Raycast(src_pos, m_RealTargetPos, out hit, xc.Dungeon.LevelManager.GetInstance().AreaExclude)) { m_RealTargetPos = PhysicsHelp.BoundaryHitPos(src_pos, hit.position); } } else// 有目标玩家 { Vector3 src_pos = src_actor.Trans.position; Actor target_actor = ActorManager.Instance.GetPlayer(target_id);// 获取目标玩家 Vector3 target_pos = Vector3.zero; if (target_actor != null) { target_pos = target_actor.Trans.position; Vector3 vec = target_pos - src_pos; float len = vec.magnitude; if (len > mSkillAction.RushTargetRange) { float real_len = len - mSkillAction.RushTargetRange; target_pos = src_pos + vec * real_len / len; XNavMeshHit hit; if (XNavMesh.Raycast(src_pos, target_pos, out hit, xc.Dungeon.LevelManager.GetInstance().AreaExclude)) { target_pos = PhysicsHelp.BoundaryHitPos(src_pos, hit.position); } if (mSkillAction.ActionData.SkillInfo.CastingSpeed != 0) { m_RealTargetPos = target_pos; float calc_castingTime = real_len / mSkillAction.ActionData.SkillInfo.CastingSpeed;// 根据距离和速度计算施法阶段的时间 float fix_castingTime = mSkillAction.ActionData.CastingStageTime; if (calc_castingTime < fix_castingTime) { m_DynamicStageTime = calc_castingTime; } } } else { target_pos = src_pos; m_DynamicStageTime = 0; } move_ctrl.MoveDirInAttacking(vec);// 冲到目标点的方向 } else { target_pos = src_pos + mSkillAction.SkillParent.AttackDir * mSkillAction.ActionData.SkillInfo.CastingSpeed * mSkillAction.ActionData.CastingStageTime; XNavMeshHit hit; if (XNavMesh.Raycast(src_pos, target_pos, out hit, xc.Dungeon.LevelManager.GetInstance().AreaExclude)) { target_pos = PhysicsHelp.BoundaryHitPos(src_pos, hit.position); m_RealTargetPos = target_pos; } } if (src_actor.AttackCtrl.mIsSendMsg) { C2SNwarChargeStop charge_stop = new C2SNwarChargeStop(); charge_stop.skill_id = mSkillAction.ActionData.SkillInfo.Id; PkgNwarMove move = new PkgNwarMove(); move.id = src_actor.UID.obj_idx; PkgNwarPos pos = new PkgNwarPos(); pos.px = (int)(target_pos.x * 100); pos.py = (int)(target_pos.z * 100); move.pos = pos; move.speed = 0; move.time = 0; charge_stop.move = move; NetClient.GetCrossClient().SendData <C2SNwarChargeStop>(NetMsg.MSG_NWAR_CHARGE_STOP, charge_stop); } } return(true); }
/// <summary> /// 通过角色id来获取角色在场景里面的偏移位置 /// </summary> /// <param name="type_id"></param> /// <returns></returns> public static Vector3 GetPositionInScene(uint type_id, float x, float z) { Vector3 pos = PhysicsHelp.GetPosition(x, z); return(pos); }
/// <summary> /// 通过角色id来获取角色在场景里面的偏移位置 /// </summary> /// <param name="type_id"></param> /// <returns></returns> public static float GetHeightInScene(uint type_id, float x, float z) { float height = PhysicsHelp.GetHeight(x, z); return(height); }
void HandleServerData(ushort pro, byte[] data) { switch (pro) { case NetMsg.MSG_MWAR_DEBUG_BULLET: // 响应服务端的子弹位置调试的消息 { if (TestUnit.DisplayDebugDraw == false) { return; } } break; case NetMsg.MSG_MWAR_DEBUG_WORD: // 绘制服务端发来的文字 { if (TestUnit.DisplayDebugDraw == false) { return; } S2CMwarDebugWord debugWord = S2CPackBase.DeserializePack <S2CMwarDebugWord>(data); Vector3 pos = PhysicsHelp.GetPosition(debugWord.px / 100.0f, debugWord.py / 100.0f); Object prefab = Resources.Load("core/prefabs/AttackSphere"); GameObject testGo = GameObject.Instantiate(prefab, pos, Quaternion.identity) as GameObject; testGo.transform.localScale = Vector3.one * (1.0f) / 100.0f * 2; testGo.transform.parent = MainGame.CoreObject.transform; Color col = GetColor(debugWord.color); testGo.GetComponent <Renderer>().material.SetColor("_Color", col); testGo.AddComponent <DelayDestroyComponent>().DelayTime = debugWord.time; UI3DText ui3dText = testGo.AddComponent <UI3DText>(); ui3dText.Text = System.Text.Encoding.UTF8.GetString(debugWord.word); ui3dText.TextColor = col; ui3dText.FontSize = (int)debugWord.size; ui3dText.UpdatePosition(pos, Vector3.zero, Vector3.zero); //ui3dText.SetOwnerTrans(null); break; } case NetMsg.MSG_MWAR_DEBUG_POS: // 绘制服务端发送过来的位置 { if (TestUnit.DisplayDebugDraw == false) { return; } var debugPos = S2CPackBase.DeserializePack <S2CMwarDebugPos>(data); Vector3 pos = PhysicsHelp.GetPosition(debugPos.px / 100.0f, debugPos.py / 100.0f); Object prefab = Resources.Load("core/prefabs/AttackSphere"); GameObject testGo = GameObject.Instantiate(prefab, pos, Quaternion.identity) as GameObject; testGo.transform.localScale = Vector3.one * debugPos.radius / 100.0f * 2; testGo.transform.parent = MainGame.CoreObject.transform; Color col = GetColor(debugPos.color); testGo.GetComponent <Renderer>().material.SetColor("_Color", col); testGo.AddComponent <DelayDestroyComponent>().DelayTime = 0.5f; } break; case NetMsg.MSG_MWAR_DEBUG_LINE: // 绘制服务端发送过来的线段 { if (TestUnit.DisplayDebugDraw == false) { return; } S2CMwarDebugLine debugLine = S2CPackBase.DeserializePack <S2CMwarDebugLine>(data); float height = PhysicsHelp.GetHeight(debugLine.px1 / 100.0f, debugLine.py1 / 100.0f); Vector3 pos1 = new Vector3(debugLine.px1 / 100.0f, height, debugLine.py1 / 100.0f); Vector3 pos2 = new Vector3(debugLine.px2 / 100.0f, height, debugLine.py2 / 100.0f); Vector3 dir = (pos2 - pos1); Vector3 dirNormal = dir.normalized; if (dirNormal == Vector3.zero) { return; } Vector3 middlePos = (pos1 + pos2) / 2.0f; Object prefab = Resources.Load("core/prefabs/AttackCube"); GameObject testGo = GameObject.Instantiate(prefab, middlePos, Quaternion.identity) as GameObject; testGo.transform.localScale = new Vector3(debugLine.radius * 2.0f / 100.0f, debugLine.radius * 2.0f / 100.0f, (pos2 - pos1).magnitude); testGo.transform.rotation = Quaternion.LookRotation(dirNormal, Vector3.up); testGo.transform.parent = MainGame.CoreObject.transform; Color col = GetColor(debugLine.color); testGo.GetComponent <Renderer>().material.SetColor("_Color", col); testGo.AddComponent <DelayDestroyComponent>().DelayTime = debugLine.time; } break; case NetMsg.MSG_MWAR_DEBUG_CIRCLE: // 绘制服务端发送过来的圆环 { if (TestUnit.DisplayDebugDraw == false) { return; } var debugCircle = S2CPackBase.DeserializePack <S2CMwarDebugCircle>(data); float height = PhysicsHelp.GetHeight(debugCircle.px / 100.0f, debugCircle.py / 100.0f); Vector3 pos = new Vector3(debugCircle.px / 100.0f, height, debugCircle.py / 100.0f); Object prefab = Resources.Load("Core/Prefabs/AttackCircle"); GameObject testGo = GameObject.Instantiate(prefab, pos, Quaternion.identity) as GameObject; testGo.transform.localScale = new Vector3(debugCircle.size / 100.0f, 1.0f, debugCircle.size / 100.0f); testGo.transform.rotation = Quaternion.identity; testGo.transform.parent = MainGame.CoreObject.transform; Color col = GetColor(debugCircle.color); testGo.GetComponentInChildren <Renderer>().material.SetColor("Tint Color", col); testGo.AddComponent <DelayDestroyComponent>().DelayTime = debugCircle.time * GlobalConst.MilliToSecond; } break; } }