Ejemplo n.º 1
0
    override public bool MoveToByNav(Vector3 _v, float _stopDistance = 0f, bool needToAdjustPosY = true)
    {
        if (!canMove)
        {
            return(false);
        }
        if (needToAdjustPosY)
        {
            bool hasHit = MogoUtils.GetPointInTerrain(_v.x, _v.z, out _v);

            if (!hasHit)
            {
                EventDispatcher.TriggerEvent(ON_MOVE_TO_FALSE, transform.gameObject, targetToMoveTo, 0f);
                Debug.LogWarning("!hasHit:" + _v);
                return(false);
            }
        }

        //����·��
        if (!isNaving || needToAdjustPosY)//|| (targetToMoveTo - v).magnitude < 0.05f
        {
            if (m_navHelper != null)
            {
                //Debug.LogError("targetToMoveTO:" + _v);
                path           = m_navHelper.GetPathByTarget(_v);
                targetToMoveTo = _v;
                m_cornersIdx   = 1;
                m_stopDistance = _stopDistance;
            }
            else
            {
                EventDispatcher.TriggerEvent(ON_MOVE_TO_FALSE, transform.gameObject, targetToMoveTo, 0f);
                return(false);
            }
        }

        //Debug.Log("path.corners.Length:" + path.corners.Length);
        if (path == null)
        {
            StopNav();
            EventDispatcher.TriggerEvent(ON_MOVE_TO_FALSE, transform.gameObject, targetToMoveTo, 0f);
            return(false);
        }
        if (path.corners.Length < 2)
        {
            EventDispatcher.TriggerEvent(ON_MOVE_TO_FALSE, transform.gameObject, targetToMoveTo, 0f);
            Debug.LogWarning("path.corners.Length < 2:" + targetToMoveTo);
            StopNav();
            //EventDispatcher.TriggerEvent(ON_MOVE_TO, transform.gameObject, targetToMoveTo);
            return(false);
        }

        isNaving      = true;
        moveDirection = (path.corners[m_cornersIdx] - transform.position).normalized;
        RotateTo(path.corners[m_cornersIdx]);
        //transform.LookAt(new Vector3(path.corners[m_cornersIdx].x, transform.position.y, path.corners[m_cornersIdx].z));
        float dis  = Vector3.Distance(transform.position, path.corners[m_cornersIdx]);
        float step = extraSpeed * Time.deltaTime;

        if (step + 0.1f > dis && m_cornersIdx < path.corners.Length - 1)
        {
            collisionFlags = characterController.Move(path.corners[m_cornersIdx] - transform.position);
            if ((path.corners[m_cornersIdx] - transform.position).magnitude > 0.3f)
            {
                path         = m_navHelper.GetPathByTarget(targetToMoveTo);
                m_cornersIdx = 1;
            }
            else
            {
                m_cornersIdx++;
            }

            moveDirection = Vector3.zero;
            //transform.LookAt(new Vector3(path.corners[m_cornersIdx].x, transform.position.y, path.corners[m_cornersIdx].z));
            //collisionFlags = characterController.Move(moveDirection * dis);

            //transform.position = new Vector3(path.corners[m_cornersIdx].x, transform.position.y, path.corners[m_cornersIdx].z);
            //m_cornersIdx++;
        }
        else if (m_cornersIdx == path.corners.Length - 1 && step + 0.1f + m_stopDistance > dis)
        {
            //Debug.LogError("StopNav");
            float tempDis;
            //for (int i = 0; i < 5 && tempDis > 0.1; i++, dis = Vector3.Distance(transform.position, targetToMoveTo))
            //{
            tempDis        = dis - m_stopDistance;
            tempDis        = tempDis > 0 ? tempDis : 0;
            collisionFlags = characterController.Move((path.corners[m_cornersIdx] - transform.position).normalized * tempDis);
            //}
            StopNav();
            tempDis = Vector2.Distance(new Vector2(transform.position.x, transform.position.z), new Vector2(targetToMoveTo.x, targetToMoveTo.z));
            if (tempDis > 0.2 + m_stopDistance)
            {
                //MogoWorld.thePlayer.Idle();
                EventDispatcher.TriggerEvent(ON_MOVE_TO_FALSE, transform.gameObject, targetToMoveTo, tempDis);
            }
            else
            {
                EventDispatcher.TriggerEvent(ON_MOVE_TO, transform.gameObject, targetToMoveTo);
            }
        }
        return(true);
    }
Ejemplo n.º 2
0
    public override bool MoveToByNav(Vector3 v, float stopDistance = 0f, bool needToAdjustPosY = true)
    {
        //Mogo.Util.LoggerHelper.Error("MoveToByNav v:" + v);
        if (!canMove)
        {
            return(false);
        }
        if (m_isMovingOn)
        {
            return(false);
        }

        Mogo.Util.LoggerHelper.Debug("v:" + v);
        if (needToAdjustPosY)
        {
            bool hasHit = MogoUtils.GetPointInTerrain(v.x, v.z, out v);

            if (!hasHit)
            {
                return(false);
            }
        }
        Mogo.Util.LoggerHelper.Debug("v:" + v);
        //计算路线
        if (!isMovingToTarget || IsSideCrash())//|| (targetToMoveTo - v).magnitude < 0.05f
        {
            Mogo.Util.LoggerHelper.Debug("IsSideCrash!");
            path = m_navHelper.GetPathByTarget(v);
            Mogo.Util.LoggerHelper.Debug("path:" + path.corners.Length);
            targetToMoveTo = v;
            m_cornersIdx   = 1;
        }

        //Mogo.Util.LoggerHelper.Debug("path.corners.Length:" + path.corners.Length);
        if (path.corners.Length < 2)
        {
            Mogo.Util.LoggerHelper.Debug("path.corners.Length < 2");
            StopNav();
            return(false);
        }

        isMovingToTarget = true;
        moveDirection    = (path.corners[m_cornersIdx] - transform.position).normalized;
        //RotateTo(path.corners[m_cornersIdx]);
        transform.LookAt(new Vector3(path.corners[m_cornersIdx].x, transform.position.y, path.corners[m_cornersIdx].z));
        float dis  = Vector3.Distance(transform.position, path.corners[m_cornersIdx]);
        float step = 8 * Time.deltaTime;

        Mogo.Util.LoggerHelper.Debug("dis:" + dis);
        Mogo.Util.LoggerHelper.Debug("step:" + step);
        if (step + 1f > dis && m_cornersIdx < path.corners.Length - 1)
        {
            //collisionFlags = characterController.Move(transform.forward * dis);
            Mogo.Util.LoggerHelper.Debug("m_isMovingOn = true;");
            m_isMovingOn = true;
            StopNav();

            m_timerIdForNav = TimerHeap.AddTimer(400, 0, () =>
            {
                m_isMovingOn = false;
                MoveTo(targetToMoveTo, false);
            });
            return(true);
            //collisionFlags = characterController.Move(transform.forward * dis);

            //transform.position = new Vector3(path.corners[m_cornersIdx].x, transform.position.y, path.corners[m_cornersIdx].z);
            //m_cornersIdx++;
            //path = m_navHelper.GetPathByTarget(v);
            //m_cornersIdx = 1;
        }
        else if (m_cornersIdx == path.corners.Length - 1 && step + 0.2f + m_stopDistance > dis)
        {
            Mogo.Util.LoggerHelper.Debug("StopNav");
            float tempDis = 10;

            for (int i = 0; i < 10 && tempDis > 0.1; i++, dis = Vector3.Distance(transform.position, path.corners[m_cornersIdx]))
            {
                transform.LookAt(new Vector3(targetToMoveTo.x, transform.position.y, targetToMoveTo.z));
                tempDis        = dis - m_stopDistance;
                tempDis        = tempDis > 0 ? tempDis : 0;
                collisionFlags = characterController.Move((path.corners[m_cornersIdx] - transform.position).normalized * tempDis);
            }
            StopNav();
            if (tempDis < 0.3)
            {
                EventDispatcher.TriggerEvent(ON_MOVE_TO, transform.gameObject, targetToMoveTo);
            }
        }
        return(true);
    }