/// <summary> /// 起始点 初始化 /// </summary> /// <param name="_currentStep">_current step.</param> /// <param name="_cmpFun">_cmp fun.</param> public void M_startStep(int _currentStep, CallBack _cmpFun) { int segmentIndex = M_calculateSegmentIndex(_currentStep); if (segmentIndex > 0) { if (segmentIndex == 1) { currentLastStep = 0; startStep = 1; } else { lastRotatioin = roadSample.M_getSegmentRotation(segmentIndex - 2); currentLastStep = M_calculateSegmentTotalStep(segmentIndex - 2); startStep = currentLastStep + 1; } EnumRoadSegment curType = EnumRoadSegmentKit.M_getType(roadSegmentType[segmentIndex - 1]); M_creatSegment(curType); } else { currentLastStep = 0; startStep = 1; } M_goStep(_currentStep, _cmpFun); }
/// <summary> /// 构建路线 直到路线能达到的最远步点满足当前步点数 /// 如果没有达到 则递归调用 /// </summary> /// <returns>The segment view.</returns> /// <param name="_currentStep">_current step.</param> private IEnumerator M_updateSegmentView(int _currentStep) { if (currentLastStep >= totalStep) { if (creatSegmentCmp != null) { creatSegmentCmp(); } creatSegmentCmp = null; yield break; } if (creatRoadDynamic) { if (_currentStep + preMaxLoadStepCount <= currentLastStep) { if (creatSegmentCmp != null) { creatSegmentCmp(); } creatSegmentCmp = null; yield break; } } int segmentIndex = M_calculateSegmentIndex(currentLastStep + 1); EnumRoadSegment curType = EnumRoadSegmentKit.M_getType(roadSegmentType[segmentIndex]); M_creatSegment(curType); yield return(new WaitForSeconds(0.1f)); if (creatRoadDynamic) { if (currentStep + preMaxLoadStepCount > currentLastStep) { _currentStep++; StartCoroutine("M_updateSegmentView", _currentStep); } else { if (creatSegmentCmp != null) { creatSegmentCmp(); } creatSegmentCmp = null; } } else { _currentStep++; StartCoroutine("M_updateSegmentView", _currentStep); } }
/// <summary> /// 根据类型 创建一个新的路段 中间路段(左 中 右) /// </summary> /// <returns>The segment_ middle.</returns> /// <param name="_targetType">_target type.</param> /// <param name="_cloneSegmentGo">_clone segment go.</param> private Transform M_creatSegment_Middle(EnumRoadSegment _targetType, GameObject _cloneSegmentGo) { GameObject newSegment_go = M_getCacheSegment(_targetType); if (newSegment_go == null) { newSegment_go = Instantiate(_cloneSegmentGo) as GameObject; } newSegment_go.SetActive(true); UIUtils.M_addChild(segment_parent, newSegment_go.transform); Transform newSegment_transform = newSegment_go.transform; return(newSegment_transform); }
/// <summary> /// 创建一个指定类型的路段 /// </summary> /// <param name="_type">_type.</param> private void M_creatSegment(EnumRoadSegment _type) { Transform newSegment_transform = null; MissionRoadSegment targetSegment = null; float point_x; float point_z; switch (_type) { case EnumRoadSegment.Start: { targetSegment = segments_start; M_creatSegment_StartEnd(targetSegment); } break; case EnumRoadSegment.End: { targetSegment = segments_end; M_creatSegment_StartEnd(targetSegment); } break; case EnumRoadSegment.Middle_Line: { targetSegment = segments_middle_line; newSegment_transform = M_creatSegment_Middle(_type, targetSegment.gameObject); newSegment_transform.localPosition = lastPostion; newSegment_transform.localRotation = Quaternion.Euler(lastRotatioin); targetSegment = newSegment_transform.GetComponent <MissionRoadSegment>(); } break; case EnumRoadSegment.Middle_Left: { targetSegment = segments_middle_left; newSegment_transform = M_creatSegment_Middle(_type, targetSegment.gameObject); newSegment_transform.localPosition = lastPostion; lastRotatioin += new Vector3(0, -90, 0); newSegment_transform.localRotation = Quaternion.Euler(lastRotatioin); targetSegment = newSegment_transform.GetComponent <MissionRoadSegment>(); } break; case EnumRoadSegment.Middle_Right: { targetSegment = segments_middle_right; newSegment_transform = M_creatSegment_Middle(_type, targetSegment.gameObject); newSegment_transform.localPosition = lastPostion; lastRotatioin += new Vector3(0, 90, 0); newSegment_transform.localRotation = Quaternion.Euler(lastRotatioin); targetSegment = newSegment_transform.GetComponent <MissionRoadSegment>(); } break; } if (targetSegment != null) { point_x = targetSegment.distance * (int)Mathf.Cos(lastRotatioin.y * Mathf.Deg2Rad); point_z = targetSegment.distance * (int)Mathf.Sin(-lastRotatioin.y * Mathf.Deg2Rad); lastPostion += new Vector3(point_x, 0, point_z); segmentList.Add(targetSegment); targetSegment.maxStep = currentLastStep + targetSegment.totalSteps; currentLastStep += targetSegment.totalSteps; Vector3[] targetSegmentPoints = targetSegment.M_getPoints(); ListKit.AddRange(missionPoints, targetSegmentPoints); } }
/// <summary> /// 返回路段类型所对应的该路段中的步点总数 /// </summary> /// <returns>The segment step count.</returns> /// <param name="_type">_type.</param> public int M_getSegmentStepCount(EnumRoadSegment _type) { MissionRoadSegment segment = M_getRoadSegment(_type); return(segment.totalSteps); }