コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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();
        }