// Check the given directions and reverse directions
    // to get a proper move direction
    // return zero if moster cannot move to none of them.
    private Vector3 ChooseDirection(Vector3 first, Vector3 second)
    {
        // check order
        // 1. first
        // 2. second
        // 3. -second
        // 4. -first

        if (!gridMove.IsReverseDirection(first) && !gridMove.CheckWall(first))
        {
            return(first);
        }

        if (!gridMove.IsReverseDirection(second) && !gridMove.CheckWall(second))
        {
            return(second);
        }

        first  *= -1.0f;
        second *= -1.0f;

        if (!gridMove.IsReverseDirection(second) && !gridMove.CheckWall(second))
        {
            return(second);
        }

        if (!gridMove.IsReverseDirection(first) && !gridMove.CheckWall(first))
        {
            return(first);
        }

        return(Vector3.zero);
    }
    Vector3 GetAdvModeMoveDirection()
    {
        Vector3[] directions = new Vector3[4] {
            new Vector3(1, 0, 0),
            new Vector3(-1, 0, 0),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, -1)
        };

        while (true)
        {
            Vector3 d = directions[Random.Range(0, 4)];
            if (!m_grid_move.IsReverseDirection(d))
            {
                return(d);
            }
        }
    }
Beispiel #3
0
    //  从候选值中获取可能的移动方向
    //  参数:
    //  first   第一候选值
    //  second  第二候选值
    //  返回值:
    //  移动方向/ 不允许移动时为Vector3.zero
    private Vector3 DirectionChoice(Vector3 first, Vector3 second)
    {
        // 按照下列顺序
        // 第一候选值
        // 第二候选值
        // 第二候选值的反方向
        // 第一候选值的反方向
        //
        // 进行探测,返回允许移动的方向

        // 第一候选值
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        // 第二候选值
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }

        first  *= -1.0f;
        second *= -1.0f;
        // 第二候选值的反方向
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }
        // 第一候选值的反方向
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        return(Vector3.zero);
    }
Beispiel #4
0
    //  이동 방향의 후보를 참고하여 이동 가능한 방향을 구한다.
    //  인수:
    //  first   제1 후보.
    //  second  제2 후보.
    //  반환값:
    //  이동 방향/ 이동 불가능하다면 Vector3.zero
    private Vector3 DirectionChoice(Vector3 first, Vector3 second)
    {
        // 제1 후보.
        // 제2 후보.
        // 제2 후보의 역방향.
        // 제1 후보의 역방향.
        //
        // 순서를 점검해 이동 가능한 방향으로 보낸다.

        // 제1 후보.
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        // 제2 후보.
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }

        first  *= -1.0f;
        second *= -1.0f;
        // 제2 후보의 역방향.
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }
        // 제1 후보의 역방향.
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        return(Vector3.zero);
    }
Beispiel #5
0
    //  移動方向の候補を参考にして移動可能な方向を得る.
    //  引数:
    //  first   第一候補.
    //  second  第二候補.
    //  戻り値:
    //  移動方向/ 移動不可能ならVector3.zero
    private Vector3 DirectionChoice(Vector3 first, Vector3 second)
    {
        // 第一候補.
        // 第二候補.
        // 第二候補の逆方向.
        // 第ー候補の逆方向.
        //
        // の順番に調べて、移動可能ならその方向を返す.

        // 第一候補.
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        // 第二候補.
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }

        first  *= -1.0f;
        second *= -1.0f;
        // 第二候補の逆方向.
        if (!m_grid_move.IsReverseDirection(second) &&
            !m_grid_move.CheckWall(second))
        {
            return(second);
        }
        // 第ー候補の逆方向.
        if (!m_grid_move.IsReverseDirection(first) &&
            !m_grid_move.CheckWall(first))
        {
            return(first);
        }

        return(Vector3.zero);
    }