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); }
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); }