/// <summary> /// 调整位置后开始战斗 /// </summary> /// <returns>The position and start fight.</returns> /// <param name="battlePlayerCtr">Battle player ctr.</param> private IEnumerator ResetPositionAndStartFight(BattlePlayerController battlePlayerCtr) { // 等待准备好 yield return(new WaitUntil(() => isReadyToFight)); // 头山闪红色叹号 AlertTintSpark(); // 播放idle动画 baCtr.PlayRoleAnim(CommonData.roleIdleAnimName, 0, null); // 判断玩家角色是否需要重新开始攻击动作 bool playerNeedResetAttack = battlePlayerCtr.NeedResetAttack(); yield return(new WaitForSeconds(0.4f)); HideAllAlertAreas(); DisableAllDetect(); Vector3 playerOriPos = battlePlayerCtr.transform.position; Vector3 monsterOriPos = transform.position; int playerPosX = Mathf.RoundToInt(playerOriPos.x); int playerPosY = Mathf.RoundToInt(playerOriPos.y); int monsterPosX = Mathf.RoundToInt(monsterOriPos.x); int monsterPosY = Mathf.RoundToInt(monsterOriPos.y); int monsterLayerOrder = -monsterPosY; int posOffsetX = playerPosX - monsterPosX; int posOffsetY = playerPosY - monsterPosY; Vector3 monsterRunPos = Vector3.zero; Vector3 monsterFightPos = Vector3.zero; Vector3 playerFightPos = new Vector3(playerPosX, playerPosY, 0); int minX = 0; int maxX = ExploreManager.Instance.newMapGenerator.columns - 1; HLHRoleAnimInfo playerCurrentAnimInfo = battlePlayerCtr.GetCurrentRoleAnimInfo(); // 根据玩家角色和怪物的位置,战斗点附近的可行走情况决定人物和怪物的战斗位置 //人物在怪物右边 if (posOffsetX > 0) { // 人物角色先朝左 battlePlayerCtr.TowardsLeft(!battlePlayerCtr.isInFight); // 如果怪物在人物水平向左一格的附近位置,并且该位置没有超出地图左侧界限 if (playerPosX - 1 >= minX && playerPosX - 1 == monsterPosX && playerPosY == monsterPosY) { // 怪物跑向的位置【人物左边一格】 monsterRunPos = new Vector3(playerPosX - 1f, playerPosY, 0); // 怪物战斗位置【人物左边一格】 monsterFightPos = new Vector3(playerPosX - 1, playerPosY, 0); // 怪物层级调整到人物层级 monsterLayerOrder = -playerPosY; } // 人物左侧没有超过地图左侧界限,且地图上人物左侧位置上没有东西【可行走信息为1】 else if (playerPosX - 1 >= minX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX - 1, playerPosY] == 1) { monsterRunPos = new Vector3(playerPosX - 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX - 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } // 人物左侧没有超过地图左侧界限,地图上人物左侧位置没有东西,但是可行走信息不为1,但是是当前怪物的单步行走目标位置【每个怪物在行走之前都会把目标位置可行走信息设为5,防止其他怪物也走上去】 else if (playerPosX - 1 >= minX && playerPosX - 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { monsterRunPos = new Vector3(playerPosX - 1f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX - 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } // 其他情况都要让怪物和人物的战斗位置尽量放进同一个格子里了 else { // 如果人物靠上 if (posOffsetY > 0) { //怪物跑到的位置 monsterRunPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); // 怪物战斗位置 monsterFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); // 怪物的层级比人物高1级 monsterLayerOrder = -playerPosY + 1; // 人物的战斗位置 playerFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(monsterLayerOrder); } else // 如果人物靠下 { monsterRunPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); monsterFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); monsterLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); } } } else if (posOffsetX == 0) { if (playerPosX + 1 <= maxX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray [playerPosX + 1, playerPosY] == 1) { battlePlayerCtr.TowardsRight(!battlePlayerCtr.isInFight); monsterRunPos = new Vector3(playerPosX + 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX + 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else if (playerPosX + 1 <= maxX && playerPosX + 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { battlePlayerCtr.TowardsRight(!battlePlayerCtr.isInFight); monsterRunPos = new Vector3(playerPosX + 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX + 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else if (playerPosX - 1 >= minX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray [playerPosX - 1, playerPosY] == 1) { battlePlayerCtr.TowardsLeft(!battlePlayerCtr.isInFight); monsterRunPos = new Vector3(playerPosX - 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX - 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else if (playerPosX - 1 >= minX && playerPosX - 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { battlePlayerCtr.TowardsLeft(!battlePlayerCtr.isInFight); monsterRunPos = new Vector3(playerPosX - 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX - 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else { if (posOffsetY > 0) { monsterRunPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); monsterFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); monsterLayerOrder = -playerPosY + 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(-playerPosY + 1); battlePlayerCtr.TowardsRight(!battlePlayerCtr.isInFight); } else { monsterRunPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); monsterFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); monsterLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); battlePlayerCtr.TowardsRight(!battlePlayerCtr.isInFight); } } } else if (posOffsetX < 0) { battlePlayerCtr.TowardsRight(!battlePlayerCtr.isInFight); if (playerPosX + 1 <= maxX && playerPosX + 1 == monsterPosX && playerPosY == monsterPosY) { monsterRunPos = new Vector3(playerPosX + 1f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX + 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else if (playerPosX + 1 <= maxX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX + 1, playerPosY] == 1) { monsterRunPos = new Vector3(playerPosX + 0.5f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX + 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else if (playerPosX + 1 <= maxX && playerPosX + 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { monsterRunPos = new Vector3(playerPosX + 1f, playerPosY, 0); monsterFightPos = new Vector3(playerPosX + 1, playerPosY, 0); monsterLayerOrder = -playerPosY; } else { if (posOffsetY > 0) { monsterRunPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); monsterFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); monsterLayerOrder = -playerPosY + 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(-playerPosY + 1); } else { monsterRunPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); monsterFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); monsterLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); } } } // 如果玩家需要重置战斗动作 if (playerNeedResetAttack) { battlePlayerCtr.ResetAttack(playerCurrentAnimInfo); ExploreManager.Instance.expUICtr.UpdateActiveSkillButtons(); } // 玩家位置修正 battlePlayerCtr.FixPosTo(playerFightPos, null); // 怪物跑到位置 RunToPosition(monsterRunPos, delegate { // 如果跑到的时候已经死了,直接返回 if (baCtr.isDead) { return; } // 调整怪物位置到战斗位置 baCtr.FixPosTo(monsterFightPos, null); // 如果玩家没有逃离战斗 if (!battlePlayerCtr.escapeFromFight) { // 根据双方位置关系重新调整朝向 if (transform.position.x <= ExploreManager.Instance.battlePlayerCtr.transform.position.x) { baCtr.TowardsRight(); boneTowards = MyTowards.Right; } else { baCtr.TowardsLeft(); boneTowards = MyTowards.Left; } // 如果玩家没有逃离战斗,并且玩家还没有进入战斗,则玩家和怪物都进入战斗 if (!battlePlayerCtr.isInEscaping && !battlePlayerCtr.isInFight) { ExploreManager.Instance.PlayerAndMonsterStartFight(); } else { // 其他情况下只有怪物进入战斗 ExploreManager.Instance.MonsterStartFight(); } } // 玩家在怪物跑的过程中脱离了战斗【这个现在从动画播放时长和跑动的时长上看是不会实现的,但是逻辑先做着】 else { bool monsterDie = baCtr.agent.health <= 0; RefreshWalkableInfoWhenQuit(monsterDie); QuitFightAndDelayMove(5); battlePlayerCtr.escapeFromFight = false; } }, monsterLayerOrder); }
/// <summary> /// 调整npc的位置和朝向 /// </summary> /// <returns>The position and towards.</returns> /// <param name="battlePlayerCtr">Battle player ctr.</param> private IEnumerator AdjustPositionAndTowards(BattlePlayerController battlePlayerCtr) { yield return(new WaitUntil(() => battlePlayerCtr.isIdle)); Vector3 playerOriPos = battlePlayerCtr.transform.position; Vector3 npcOriPos = transform.position; int playerPosX = Mathf.RoundToInt(playerOriPos.x); int playerPosY = Mathf.RoundToInt(playerOriPos.y); int npcPosX = Mathf.RoundToInt(npcOriPos.x); int npcPosY = Mathf.RoundToInt(npcOriPos.y); int posOffsetX = playerPosX - npcPosX; int posOffsetY = playerPosY - npcPosY; int npcLayerOrder = -npcPosY; Vector3 npcFightPos = Vector3.zero; Vector3 playerFightPos = new Vector3(playerPosX, playerPosY, 0); int minX = 0; int maxX = ExploreManager.Instance.newMapGenerator.rows - 1; if (posOffsetX > 0) { battlePlayerCtr.TowardsLeft(true); if (playerPosX - 1 >= minX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX - 1, playerPosY] == 1) { npcFightPos = new Vector3(playerPosX - 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else if (playerPosX - 1 >= minX && playerPosX - 1 == npcPosX && playerPosY == npcPosY) { npcFightPos = new Vector3(playerPosX - 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else if (playerPosX - 1 >= minX && playerPosX - 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { npcFightPos = new Vector3(playerPosX - 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else { if (posOffsetY > 0) { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); npcLayerOrder = -playerPosY + 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(-playerPosY + 1); } else { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); npcLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); } needPosFix = true; battlePlayerCtr.needPosFix = true; } } else if (posOffsetX == 0) { if (playerPosX + 1 <= maxX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX + 1, playerPosY] == 1) { battlePlayerCtr.TowardsRight(true); npcFightPos = new Vector3(playerPosX + 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else if (playerPosX - 1 >= minX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX - 1, playerPosY] == 1) { battlePlayerCtr.TowardsLeft(true); npcFightPos = new Vector3(playerPosX - 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else { battlePlayerCtr.TowardsRight(true); if (posOffsetY > 0) { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); npcLayerOrder = -playerPosY + 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(-playerPosY + 1); } else { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); npcLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); } needPosFix = true; battlePlayerCtr.needPosFix = true; } } else if (posOffsetX < 0) { battlePlayerCtr.TowardsRight(true); if (playerPosX + 1 <= maxX && ExploreManager.Instance.newMapGenerator.mapWalkableInfoArray[playerPosX + 1, playerPosY] == 1) { npcFightPos = new Vector3(playerPosX + 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else if (playerPosX + 1 <= maxX && playerPosX + 1 == npcPosX && playerPosY == npcPosY) { npcFightPos = new Vector3(playerPosX + 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else if (playerPosX + 1 <= maxX && playerPosX + 1 == Mathf.RoundToInt(moveDestination.x) && playerPosY == Mathf.RoundToInt(moveDestination.y)) { npcFightPos = new Vector3(playerPosX + 1, playerOriPos.y, 0); needPosFix = false; battlePlayerCtr.needPosFix = false; } else { if (posOffsetY > 0) { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY - 0.15f, 0); npcLayerOrder = -playerPosY + 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY + 0.15f, 0); baCtr.SetSortingOrder(-playerPosY + 1); } else { npcFightPos = new Vector3(playerPosX + 0.25f, playerPosY + 0.15f, 0); npcLayerOrder = -playerPosY - 1; playerFightPos = new Vector3(playerPosX - 0.25f, playerPosY - 0.15f, 0); baCtr.SetSortingOrder(-playerPosY - 1); } needPosFix = true; battlePlayerCtr.needPosFix = true; } battlePlayerCtr.FixPosTo(playerFightPos, null); RunToPosition(npcFightPos, delegate { if (transform.position.x <= ExploreManager.Instance.battlePlayerCtr.transform.position.x) { baCtr.TowardsRight(); } else { baCtr.TowardsLeft(); } ExploreManager.Instance.ShowNPCPlane(this); }, npcLayerOrder); } }
private IEnumerator AdjustAgentsAndCameraAndStartFight() { yield return(new WaitUntil(() => Time.timeScale == 1)); yield return(null); Vector3 playerOriPos = battlePlayerCtr.transform.position; Vector3 monsterOriPos = battleMonsterCtr.transform.position; if (Mathf.RoundToInt(playerOriPos.y) == Mathf.RoundToInt(monsterOriPos.y)) { battlePlayerCtr.transform.position = new Vector3(0.2f * (monsterOriPos.x - playerOriPos.x) + playerOriPos.x, playerOriPos.y, 0); if (battlePlayerCtr.towards == MyTowards.Left) { battleMonsterCtr.TowardsRight(); } else { battleMonsterCtr.TowardsLeft(); } } else if (Mathf.RoundToInt(playerOriPos.x) == Mathf.RoundToInt(monsterOriPos.x)) { float newPlayerPosX = playerOriPos.x; float newPlayerPosY = playerOriPos.y; float newMonsterPosX = monsterOriPos.x; float newMonsterPosY = monsterOriPos.y; if (playerOriPos.y > monsterOriPos.y && battleMonsterCtr.towards == MyTowards.Right) { newPlayerPosX = playerOriPos.x + 0.2f; newPlayerPosY = playerOriPos.y - 1f; battlePlayerCtr.transform.position = new Vector3(newPlayerPosX, newPlayerPosY, 0); battlePlayerCtr.TowardsLeft(); newMonsterPosX = monsterOriPos.x - 0.2f; newMonsterPosY = monsterOriPos.y - 0.3f; battleMonsterCtr.transform.position = new Vector3(newMonsterPosX, newMonsterPosY, 0); } else if (playerOriPos.y > monsterOriPos.y && battleMonsterCtr.towards == MyTowards.Left) { newPlayerPosX = playerOriPos.x - 0.2f; newPlayerPosY = playerOriPos.y - 1f; battlePlayerCtr.transform.position = new Vector3(newPlayerPosX, newPlayerPosY, 0); battlePlayerCtr.TowardsRight(); newMonsterPosX = monsterOriPos.x + 0.2f; newMonsterPosY = monsterOriPos.y - 0.3f; battleMonsterCtr.transform.position = new Vector3(newMonsterPosX, newMonsterPosY, 0); } else if (playerOriPos.y < monsterOriPos.y && battleMonsterCtr.towards == MyTowards.Left) { newPlayerPosX = playerOriPos.x - 0.2f; newPlayerPosY = playerOriPos.y + 1f; battlePlayerCtr.transform.position = new Vector3(newPlayerPosX, newPlayerPosY, 0); battlePlayerCtr.TowardsRight(); newMonsterPosX = monsterOriPos.x + 0.2f; newMonsterPosY = monsterOriPos.y + 0.3f; battleMonsterCtr.transform.position = new Vector3(newMonsterPosX, newMonsterPosY, 0); } else if (playerOriPos.y < monsterOriPos.y && battleMonsterCtr.towards == MyTowards.Right) { newPlayerPosX = playerOriPos.x + 0.2f; newPlayerPosY = playerOriPos.y + 1f; battlePlayerCtr.transform.position = new Vector3(newPlayerPosX, newPlayerPosY, 0); battlePlayerCtr.TowardsLeft(); newMonsterPosX = monsterOriPos.x - 0.2f; newMonsterPosY = monsterOriPos.y + 0.3f; battleMonsterCtr.transform.position = new Vector3(newMonsterPosX, newMonsterPosY, 0); } } battlePlayerCtr.InitFightTextDirectionTowards(battleMonsterCtr.transform.position); battleMonsterCtr.InitFightTextDirectionTowards(battlePlayerCtr.transform.position); Camera c = Camera.main; float cameraSizeFixSpeed = 2f; float fixDuration = 0.5f; float timer = 0; while (timer < fixDuration) { c.orthographicSize -= cameraSizeFixSpeed * Time.deltaTime; // c.transform.localPosition -= new Vector3 (0, cameraFixSpeedY * Time.deltaTime, 0); timer += Time.deltaTime; yield return(null); } // 执行玩家角色战斗前技能回调 battlePlayerCtr.ExcuteBeforeFightSkillCallBacks(battleMonsterCtr); // 执行怪物角色战斗前技能回调 battleMonsterCtr.ExcuteBeforeFightSkillCallBacks(battlePlayerCtr); battleMonsterCtr.StartFight(battlePlayerCtr); battlePlayerCtr.StartFight(battleMonsterCtr); expUICtr.ShowFightPlane(); EnableInteractivity(); }
/// <summary> /// 与npc相遇时只调整方向,不调整位置 /// </summary> /// <param name="battlePlayerCtr">Battle player ctr.</param> private IEnumerator AdjustTowards(BattlePlayerController battlePlayerCtr) { yield return(new WaitUntil(() => battlePlayerCtr.isIdle)); float posOffsetX = battlePlayerCtr.transform.position.x - this.transform.position.x; float posOffsetY = battlePlayerCtr.transform.position.y - this.transform.position.y; if (posOffsetX > 0.1f) { battlePlayerCtr.TowardsLeft(); baCtr.TowardsRight(false); } else if (posOffsetX < -0.1f) { battlePlayerCtr.TowardsRight(); baCtr.TowardsLeft(false); } else if (posOffsetY > 0.1f) { battlePlayerCtr.TowardsDown(); baCtr.TowardsUp(false); } else { battlePlayerCtr.TowardsUp(); baCtr.TowardsDown(false); } switch (battlePlayerCtr.towards) { case MyTowards.Up: if (battlePlayerCtr.transform.position.x < transform.position.x) { baCtr.TowardsLeft(); if (battlePlayerCtr.transform.position.x <= transform.position.x - 0.5f) { battlePlayerCtr.TowardsRight(); } else if (battlePlayerCtr.transform.position.x >= transform.position.x + 0.5f) { battlePlayerCtr.TowardsLeft(); } } else { baCtr.TowardsRight(); if (battlePlayerCtr.transform.position.x <= transform.position.x - 0.5f) { battlePlayerCtr.TowardsRight(); } else if (battlePlayerCtr.transform.position.x >= transform.position.x + 0.5f) { battlePlayerCtr.TowardsLeft(); } } break; case MyTowards.Down: if (battlePlayerCtr.transform.position.x < transform.position.x) { baCtr.TowardsLeft(); if (battlePlayerCtr.transform.position.x <= transform.position.x - 0.5f) { battlePlayerCtr.TowardsRight(); } else if (battlePlayerCtr.transform.position.x >= transform.position.x + 0.5f) { battlePlayerCtr.TowardsLeft(); } } else { baCtr.TowardsRight(); if (battlePlayerCtr.transform.position.x <= transform.position.x - 0.5f) { battlePlayerCtr.TowardsRight(); } else if (battlePlayerCtr.transform.position.x >= transform.position.x + 0.5f) { battlePlayerCtr.TowardsLeft(); } } break; case MyTowards.Left: baCtr.TowardsRight(); break; case MyTowards.Right: baCtr.TowardsLeft(); break; } ExploreManager.Instance.ShowNPCPlane(this); }
/// <summary> /// 角色随地板一起移动到最近的可移动地板目的地 /// </summary> /// <returns>The move to position.</returns> /// <param name="startPos">Start position.</param> /// <param name="endPos">End position.</param> /// <param name="ba">Ba.</param> private IEnumerator SmoothMoveToPos(Vector3 startPos, Vector3 endPos, BattlePlayerController bp) { yield return(new WaitUntil(() => bp.isIdle)); Transform background = Camera.main.transform.Find("Background"); int[,] realMapWalkableInfo = exploreManager.GetComponent <MapGenerator> ().mapWalkableInfoArray; realMapWalkableInfo [(int)startPos.x, (int)startPos.y] = -1; bp.ActiveBattlePlayer(false, false, true); bp.PlayRoleAnim("wait", 0, null); float moveDuration = Mathf.Sqrt((endPos - startPos).sqrMagnitude) / moveSpeed; // x轴方向的移动速度 if (endPos.x > startPos.x) { bp.TowardsRight(); } else { bp.TowardsLeft(); } float myMoveSpeedX = (endPos.x - startPos.x) / moveDuration; // y轴方向的移动速度 float myMoveSpeedY = (endPos.y - startPos.y) / moveDuration; float timer = 0; bool endPosInit = false; while (timer < moveDuration) { Vector3 moveVector = new Vector3(myMoveSpeedX * Time.deltaTime, myMoveSpeedY * Time.deltaTime, 0); timer += Time.deltaTime; this.transform.position += moveVector; bp.transform.position += moveVector; background.transform.position -= 0.3f * moveVector; // 走到一半时终点位置开始初始化(地板和物品,怪物出现) if (timer / moveDuration > 0.5 && !endPosInit) { exploreManager.GetComponent <ExploreManager> ().ItemsAroundAutoIntoLifeWithBasePoint(endPos); endPosInit = true; } yield return(null); } transform.position = endPos; bp.transform.position = endPos; bp.SetSortingOrder(-(int)endPos.y); // 如果要自动走到一个可行走点,则开启下面的代码 // Vector3 walkablePositionAround = exploreManager.GetComponent<MapGenerator>().GetAWalkablePositionAround (endPos); // // yield return new WaitUntil (()=>realMapWalkableInfo [(int)walkablePositionAround.x, (int)walkablePositionAround.y] == 1); // realMapWalkableInfo [(int)endPos.x, (int)endPos.y] = 10; bp.MoveToStoredDestination(); }