Browse Source

Траектория

Виктор Шейко 4 years ago
parent
commit
3d58c9769d

+ 69 - 0
Assets/DottedLineShader.shader

@@ -0,0 +1,69 @@
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Unlit/DottedLineShader"
+{
+    Properties
+    {
+        _RepeatCount("Repeat Count", float) = 5
+        _Spacing("Spacing", float) = 0.5
+        _Offset("Offset", float) = 0
+    }
+        SubShader
+    {
+        Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
+        LOD 100
+
+        Blend SrcAlpha OneMinusSrcAlpha
+        ZWrite Off
+
+        Pass
+        {
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+
+            #include "UnityCG.cginc"
+
+            float _RepeatCount;
+            float _Spacing;
+            float _Offset;
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                float2 uv : TEXCOORD0;
+                fixed4 color : COLOR0;
+            };
+
+            struct v2f
+            {
+                float2 uv : TEXCOORD0;
+                float4 vertex : SV_POSITION;
+                fixed4 color : COLOR0;
+            };
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                o.uv = v.uv;
+                o.uv.x = (o.uv.x + _Offset) * _RepeatCount * (1.0f + _Spacing);
+                o.color = v.color;
+
+                return o;
+            }
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+                i.uv.x = fmod(i.uv.x, 1.0f + _Spacing);
+                float r = length(i.uv - float2(1.0f + _Spacing, 1.0f) * 0.5f) * 2.0f;
+
+                fixed4 color = i.color;
+                color.a *= saturate((0.99f - r) * 100.0f);
+
+                return color;
+            }
+            ENDCG
+        }
+    }
+}

+ 78 - 0
Assets/Materials/white.mat

@@ -0,0 +1,78 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: white
+  m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: _ALPHABLEND_ON
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _BumpScale: 1
+    - _Cutoff: 0.5
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 2
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 5
+    - _UVSec: 0
+    - _ZWrite: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

+ 1 - 1
Assets/Resources/GameObjects/Toggle.prefab

@@ -109,7 +109,7 @@ RectTransform:
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
   m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 160, y: 20}
+  m_SizeDelta: {x: 160, y: 40}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1557938983317437806
 MonoBehaviour:

+ 306 - 0
Assets/Scenes/Location.unity

@@ -737,6 +737,7 @@ MonoBehaviour:
   ErrorDialog: {fileID: 3538187245544653788}
   ButtonPlay: {fileID: 1147445394}
   DropdownMode: {fileID: 139001675}
+  ToggleLine: {fileID: 698619042}
   maps:
   - {fileID: 2032074195}
   - {fileID: 1054412954}
@@ -3712,6 +3713,165 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 637616299}
   m_CullTransparentMesh: 0
+--- !u!1 &640979569
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 640979570}
+  - component: {fileID: 640979572}
+  - component: {fileID: 640979571}
+  m_Layer: 5
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &640979570
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 640979569}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 698619041}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 9, y: -0.5}
+  m_SizeDelta: {x: -28, y: -3}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &640979571
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 640979569}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 12800000, guid: 74d3785fa719d15429525fe4a1584744, type: 3}
+    m_FontSize: 12
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 1
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u0422\u0440\u0430\u0435\u043A\u0442\u043E\u0440\u0438\u044F"
+--- !u!222 &640979572
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 640979569}
+  m_CullTransparentMesh: 0
+--- !u!1 &698619040
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 698619041}
+  - component: {fileID: 698619042}
+  m_Layer: 5
+  m_Name: Toggle_line
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &698619041
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 698619040}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1550986149}
+  - {fileID: 640979570}
+  m_Father: {fileID: 995816063}
+  m_RootOrder: 11
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 160, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &698619042
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 698619040}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 2109663825, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1550986150}
+  toggleTransition: 1
+  graphic: {fileID: 2113806841}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 0
 --- !u!1 &702497364
 GameObject:
   m_ObjectHideFlags: 0
@@ -5417,6 +5577,7 @@ RectTransform:
   - {fileID: 2059615925}
   - {fileID: 1147445395}
   - {fileID: 2085345282}
+  - {fileID: 698619041}
   m_Father: {fileID: 100471033}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -8466,6 +8627,79 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1526369938}
   m_CullTransparentMesh: 0
+--- !u!1 &1550986148
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1550986149}
+  - component: {fileID: 1550986151}
+  - component: {fileID: 1550986150}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1550986149
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1550986148}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 2113806840}
+  m_Father: {fileID: 698619041}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 10, y: -10}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1550986150
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1550986148}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+--- !u!222 &1550986151
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1550986148}
+  m_CullTransparentMesh: 0
 --- !u!1001 &1560238136
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -12435,6 +12669,78 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2095569832}
   m_CullTransparentMesh: 0
+--- !u!1 &2113806839
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2113806840}
+  - component: {fileID: 2113806842}
+  - component: {fileID: 2113806841}
+  m_Layer: 5
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2113806840
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2113806839}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1550986149}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2113806841
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2113806839}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+--- !u!222 &2113806842
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2113806839}
+  m_CullTransparentMesh: 0
 --- !u!1 &2121499777
 GameObject:
   m_ObjectHideFlags: 0

+ 3 - 0
Assets/Scripts/Controllers/LabelObjectScript.cs

@@ -3,6 +3,9 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
+/// <summary>
+/// текст над маркером
+/// </summary>
 public class LabelObjectScript : MonoBehaviour
 {
     Camera camera;

+ 182 - 92
Assets/Scripts/Controllers/WorkerController.cs

@@ -1,4 +1,5 @@
-using System;
+using Assets.Scripts.Models;
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -10,10 +11,7 @@ using UnityEngine.UI;
 public class WorkerController : MonoBehaviour
 {
     public static Dictionary<uint, List<Structure>> Workers = new Dictionary<uint, List<Structure>>();
-    List<Structure> structures = new List<Structure>();
     public static List<Structure> TestStructures = new List<Structure>();
-    List<DateTime> dates = new List<DateTime>();
-    List<uint> locations = new List<uint>();
 
     public GameObject WorkersList; // scroll content
     public Dropdown DropdownLocation;
@@ -29,25 +27,29 @@ public class WorkerController : MonoBehaviour
     public GameObject EndMin;
     public GameObject EndSec;
     public GameObject StartStopButton;
-    static GameObject sStartStopButton;
     public GameObject ErrorDialog;
     public GameObject ButtonPlay;
     public Dropdown DropdownMode;
+    public Toggle ToggleLine;
 
     InputField inputField_date_text;
 
-    enum Mode { RealTime = 0, History = 1  };
+    enum Mode { RealTime = 0, History = 1, Stop = 2  };
+    Mode active_mode = Mode.Stop;
     int mode = 0;
     //public GameObject Time;
 
     static Client client = new Client();
 
     public List<GameObject> maps;
-    static List<bool> starting = new List<bool>(); // для остановок
-    public static Dictionary<uint, bool> end_send = new Dictionary<uint, bool>(); // определение завершения загрузки
-    bool real_time = false;
-    int interval = 1;
-    float nextTime = 0;
+    static List<bool> starting = new List<bool>(); // флаги остановок
+    public static Dictionary<uint, bool> end_send = new Dictionary<uint, bool>(); // флаги завершения загрузки
+    Dictionary<uint, MarkerMoving> moving = new Dictionary<uint, MarkerMoving>(); // флаги начала движения
+    //bool real_time = false;
+    //bool history_start = false;
+    float interpolationPeriod = 0.1f;
+    float next_time = 0;
+    float time = 0;
 
     //List<bool> StartStop = new List<bool>();
 
@@ -59,7 +61,6 @@ public class WorkerController : MonoBehaviour
         WorkerMarker(4, Color.red);
         WorkerMarker(356, Color.green);
 
-        sStartStopButton = StartStopButton;
         inputField_date_text = inputField_date.transform.GetComponent<InputField>();
 
         //foreach (var s in structures.Select(s => s.acc_id).Distinct())
@@ -84,23 +85,22 @@ public class WorkerController : MonoBehaviour
     // Update is called once per frame
     void Update()
     {
-
         if (DropdownMode.value != mode)
         {
-            if(starting.Any()) starting[starting.Count - 1] = false;
-            StartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";
+            StopProgress();
 
+            active_mode = Mode.Stop;
             mode = DropdownMode.value;
             switch (DropdownMode.value)
             {
                 case 0:
-                    history_start = false;
+                    //history_start = false;
                     inputField_date.gameObject.SetActive(false);
                     TimeStart.SetActive(false);
                     TimeEnd.SetActive(false);
                     break;
                 case 1:
-                    real_time = false;
+                    //real_time = false;
                     inputField_date.gameObject.SetActive(true);
                     TimeStart.SetActive(true);
                     TimeEnd.SetActive(true);
@@ -124,20 +124,29 @@ public class WorkerController : MonoBehaviour
             }
         }
 
+
         foreach (var m in markers)
         {
             m.marker.SetActive(m.toggle.isOn);
             if (m.toggle.isOn && Workers.ContainsKey(m.acc_id) && starting.Last() && end_send[m.acc_id])
             {
-                end_send[m.acc_id] = false;
-                StartingAccPositiong(m);
-            }
-        }
+                //end_send[m.value.acc_id] = false;
+                // moving.Add(true);
 
+                //if (markers.Count - 1 == m.i)
+                time += Time.deltaTime;
+                if (time >= interpolationPeriod)
+                {
+                    time -= interpolationPeriod;
+
+                    StartingAccPositiong(m);
+                }
+            }
 
+        }
 
 
-        if (real_time && !inputField_location.text.Equals("") && Time.time >= nextTime)
+        if (active_mode == Mode.RealTime && !inputField_location.text.Equals("") && Time.time >= next_time)
         {
             //var dateNow = DateTime.UtcNow.AddHours(3);
             //Time.GetComponent<Text>().text = dateNow.ToString();
@@ -150,39 +159,52 @@ public class WorkerController : MonoBehaviour
                     client.CoordinatesRequest(0, 0, 1, location_id, m.acc_id);
 
                     //history_start = true;
-                    //end_send[m.acc_id] = false;
+                    end_send[m.acc_id] = false;
                 }
             }
-            nextTime += interval;
+            next_time++;
         }
-    }
 
-    public static List<Marker> markers = new List<Marker>();
-    public class Marker
-    {
-        public Toggle toggle { get; set; }
-        public GameObject marker { get; set; }
-        public uint acc_id { get; set; }
+
+
+        if (ToggleLine.isOn)
+        {
+            foreach (var m in markers)
+                m.marker_line.gameObject.SetActive(true);
+        }
+        else
+        {
+            foreach (var m in markers)
+                m.marker_line.gameObject.SetActive(false);
+        }
     }
 
+    public static List<Marker> markers = new List<Marker>(); 
+
     /// <summary>
     /// Создание маркера для сотрудника
     /// </summary>
     /// <param name="acc_id"></param>
     void WorkerMarker(uint acc_id, Color color)
     {
-        var worker_toggle = Instantiate(Resources.Load("GameObjects/Toggle", typeof(Toggle))) as Toggle;
-        worker_toggle.name = acc_id.ToString();
-        worker_toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = acc_id.ToString();
-        worker_toggle.transform.SetParent(WorkersList.transform);
+        var toggle = Instantiate(Resources.Load("GameObjects/Toggle", typeof(Toggle))) as Toggle;
+        toggle.name = acc_id.ToString();
+        toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = acc_id.ToString();
+        toggle.transform.SetParent(WorkersList.transform);
+
+        var marker = Instantiate(Resources.Load("GameObjects/Capsule", typeof(GameObject))) as GameObject;
+        marker.name = "marker_" + acc_id.ToString();
+        marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{acc_id}";
 
-        var worker_marker = Instantiate(Resources.Load("GameObjects/Capsule", typeof(GameObject))) as GameObject;
-        worker_marker.name = "marker_" + acc_id.ToString();
-        worker_marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{acc_id}";
+        marker.GetComponent<Renderer>().material.color = color; // UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
 
-        worker_marker.GetComponent<Renderer>().material.color = color; // UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
+        var marker_line = Instantiate(Resources.Load("GameObjects/Line", typeof(LineRenderer))) as LineRenderer;
+        marker_line.name = "marker_line_" + acc_id.ToString();
+        marker_line.startColor = color;
+        marker_line.endColor = Color.white;
+        marker_line.material.color = color;
 
-        markers.Add(new Marker { acc_id = acc_id, marker = worker_marker, toggle = worker_toggle });
+        markers.Add(new Marker { acc_id = acc_id, marker = marker, toggle = toggle, marker_line = marker_line });
     }
 
     /// <summary>
@@ -198,36 +220,41 @@ public class WorkerController : MonoBehaviour
     /// <param name="progress">Номер записи из БД</param>
     /// <param name="all">Всего записей из БД</param>
     /// <returns></returns>
-    static IEnumerator MarkerPostion(float pause, float step, Vector3 start_pos, Vector3 end_pos, GameObject worker_marker, Toggle toggle, Structure w, int count, int progress, int all)
+    //static IEnumerator MarkerPostion(float pause, float step, Vector3 start_pos, Vector3 end_pos, GameObject worker_marker, Toggle toggle, Structure w, int count, int progress, int all)
+    //{
+    //    yield return new WaitForSeconds(pause);
+    //    if (worker_marker.activeSelf == true && history_start && starting[count])
+    //    {
+    //        var x_position = Mathf.Lerp(start_pos.x, end_pos.x, step);
+    //        var y_position = Mathf.Lerp(start_pos.z, end_pos.z, step);
+    //        //Debug.Log($"marker name={worker_marker.name} time={pause} step={step} sec x={x_position} y={y_position} x0={start_pos.x} y0={start_pos.z} x1={end_pos.x} y1={end_pos.z}");
+    //        worker_marker.transform.position = new Vector3(x_position, 0.5f, y_position);
+    //        worker_marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
+    //        toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts:hh:mm:ss}\n{progress + 1} из {all}";
+    //        if (progress + 1 == all)
+    //        {
+    //            sStartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";
+    //            starting[count] = false;
+    //            history_start = false;
+    //        }
+    //    }
+    //}
+
+    void Position(float step, Vector3 start_pos, Vector3 end_pos, Marker marker, Structure w, int count, string progress)
     {
-        yield return new WaitForSeconds(pause);
-        if (worker_marker.activeSelf == true && history_start && starting[count])
+        if (marker.marker.activeSelf == true && starting[count])
         {
             var x_position = Mathf.Lerp(start_pos.x, end_pos.x, step);
             var y_position = Mathf.Lerp(start_pos.z, end_pos.z, step);
             //Debug.Log($"marker name={worker_marker.name} time={pause} step={step} sec x={x_position} y={y_position} x0={start_pos.x} y0={start_pos.z} x1={end_pos.x} y1={end_pos.z}");
-            worker_marker.transform.position = new Vector3(x_position, 0.5f, y_position);
-            worker_marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
-            toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts.ToString("hh:mm:ss")} {progress + 1} из {all}";
-            if (progress + 1 == all)
+            var new_position = new Vector3(x_position, 0.5f, y_position);
+            if (marker.marker.transform.position != new_position)
             {
-                sStartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";
-                starting[count] = false;
-                history_start = false;
+                marker.marker.transform.position = new Vector3(x_position, 0.5f, y_position);
+                marker.marker_line.SetPosition(marker.marker_line.positionCount++, new Vector3(x_position, 0, y_position));
             }
-        }
-    }
-
-    void Position(float step, Vector3 start_pos, Vector3 end_pos, GameObject worker_marker, Toggle toggle, Structure w, int count)
-    {
-        if (worker_marker.activeSelf == true && starting[count])
-        {
-            var x_position = Mathf.Lerp(start_pos.x, end_pos.x, Time.time - interval);
-            var y_position = Mathf.Lerp(start_pos.z, end_pos.z, Time.time - interval);
-            //Debug.Log($"marker name={worker_marker.name} time={pause} step={step} sec x={x_position} y={y_position} x0={start_pos.x} y0={start_pos.z} x1={end_pos.x} y1={end_pos.z}");
-            worker_marker.transform.position = new Vector3(x_position, 0.5f, y_position);
-            worker_marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
-            toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts.ToString("hh:mm:ss")}";
+            marker.marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
+            marker.toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts.ToString("hh:mm:ss")}{progress}";
         }
     }
 
@@ -239,7 +266,7 @@ public class WorkerController : MonoBehaviour
     //        Debug.Log(t);
     //}
 
-    static bool history_start = false;
+   
     /// <summary>
     /// Запуск отрисовки
     /// </summary>
@@ -249,14 +276,23 @@ public class WorkerController : MonoBehaviour
         switch (DropdownMode.value)
         {
             case 0:
-                real_time = !real_time;
-                if (real_time) button_text.GetComponent<Text>().text = "Остановить";
-                else button_text.GetComponent<Text>().text = "Отобразить";
+                //real_time = !real_time;
+                if (active_mode == Mode.Stop/*real_time*/) { 
+                    active_mode = Mode.RealTime;
+                    button_text.GetComponent<Text>().text = "Остановить";                    
+                }
+                else {
+                    active_mode = Mode.Stop;
+                    button_text.GetComponent<Text>().text = "Отобразить"; 
+                }
                 break;
             case 1:
                 if (int.Parse(StartHour.GetComponent<InputField>().text) == 99) SceneManager.LoadScene("Editor");
-                else history_start = !history_start;
-                if (history_start)
+                else {
+                    if (active_mode == Mode.Stop/*real_time*/) active_mode = Mode.History;
+                    else active_mode = Mode.Stop;
+                }//history_start = !history_start;
+                if (active_mode == Mode.History/*history_start*/)
                 {
                     starting.Add(true);
                     var date = DateTime.Now; var error_date = false;
@@ -269,7 +305,8 @@ public class WorkerController : MonoBehaviour
                         ErrorDialog.SetActive(true);
                         error_date = true;
                         var text = ErrorDialog.transform.GetChild(0).GetComponent<Text>().text = "Некорректный формат даты";
-                        history_start = false;
+                        //history_start = false;
+                        active_mode = Mode.Stop;
                     }
 
                     var time_start = date; //new DateTime(dates.ElementAt(DropdownData.value).Ticks);
@@ -297,7 +334,7 @@ public class WorkerController : MonoBehaviour
                                 if (m.toggle.isOn)
                                 {
                                     client.CoordinatesRequest(time_start.Ticks, time_end.Ticks, 1, location_id, m.acc_id);
-                                    //end_send[m.acc_id] = false;
+                                    end_send[m.acc_id] = false;
                                 }
                             }
                             button_text.GetComponent<Text>().text = "Остановить";
@@ -306,7 +343,8 @@ public class WorkerController : MonoBehaviour
                         {
                             ErrorDialog.SetActive(true);
                             ErrorDialog.transform.GetChild(0).GetComponent<Text>().text = "Введите идентификатор локации";
-                            history_start = false;
+                            //history_start = false;
+                            active_mode = Mode.Stop;
                         }
                     }
 
@@ -318,8 +356,7 @@ public class WorkerController : MonoBehaviour
                 }
                 else
                 {
-                    button_text.GetComponent<Text>().text = "Отобразить";
-                    starting[starting.Count - 1] = false;
+                    StopProgress();
                 }
                 break;         
         }
@@ -331,33 +368,86 @@ public class WorkerController : MonoBehaviour
         ErrorDialog.SetActive(false);
     }
 
+    void StopProgress()
+    {
+        if (starting.Any()) starting[starting.Count - 1] = false;
+        StartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";        
+
+        foreach (var m in markers)
+        {
+            end_send[m.acc_id] = false;
+            moving.Remove(m.acc_id);
+        }
+    }
+
+    //void StartingAccPositiong(Marker m, float time)
+    //{
+    //    var worker = Workers[m.acc_id].OrderBy(wr => wr.ts).ToList();
+    //    if (worker.Any())
+    //    {
+    //        var offset = 0.1f;
+    //        for (int i = 0; i < worker.Count; i++)
+    //        {
+    //            var w = worker.ElementAt(i);
+    //            var start_pos = m.marker.transform.position;
+    //            if (i != 0) start_pos = new Vector3(worker.ElementAt(i - 1).coord_x / 100f, 0.5f, worker.ElementAt(i - 1).coord_y / 100f);
+
+    //            var end_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
+
+    //            //if (real_time) 
+    //                Position(time, start_pos, end_pos, m, w, starting.Count - 1, "");
+    //            //if (history_start)
+    //            //{
+    //            //    for (float j = 0; j <= 1.1f; j += 0.1f) // 1.1f из-за округления float
+    //            //    {
+
+    //            //        StartCoroutine(MarkerPostion(i + offset + j, j, start_pos, end_pos, m.marker, m.toggle, w, starting.Count - 1, i, worker.Count));
+    //            //    }
+    //            //    offset += 0.1f;
+    //            //}
+    //        }
+    //    }
+    //}
+
     void StartingAccPositiong(Marker m)
     {
-        var worker = Workers[m.acc_id].OrderBy(wr => wr.ts).ToList();
-        if (worker.Any())
-        {        
-            var offset = 0.1f;
-            for (int i = 0; i < worker.Count; i++)
+        int i = 0;
+        float step = 0.1f;
+        if (moving.ContainsKey(m.acc_id))
+        {
+            if (moving[m.acc_id].index < Workers[m.acc_id].Count) i = moving[m.acc_id].index;
             {
-                var w = worker.ElementAt(i);
-                var start_pos = m.marker.transform.position;
-                if (i != 0) start_pos = new Vector3(worker.ElementAt(i-1).coord_x /100f, 0.5f, worker.ElementAt(i-1).coord_y/100f);
-              
-                var end_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
-                for (float j = 0; j <= 1.1f; j += 0.1f) // 1.1f из-за округления float
-                {                    
-                    if(real_time) Position(j, start_pos, end_pos, m.marker, m.toggle, w, starting.Count - 1);
-                    else 
-                        StartCoroutine(MarkerPostion(i + offset + j, j, start_pos, end_pos, m.marker, m.toggle, w, starting.Count - 1, i, worker.Count));
-                }
-                offset += 0.1f;
+                if (moving[m.acc_id].step <= 1.1f) step = moving[m.acc_id].step;
             }
         }
+        else moving[m.acc_id] = new MarkerMoving();
+
+        var worker = Workers[m.acc_id].OrderBy(wr => wr.ts).ToList();
+        if (worker.Any())
+        {
+            var w = worker.ElementAt(i);
+            var start_pos = m.marker.transform.position;
+            if (i != 0) start_pos = new Vector3(worker.ElementAt(i - 1).coord_x / 100f, 0.5f, worker.ElementAt(i - 1).coord_y / 100f);
+            if (active_mode == Mode.History && i == 0) start_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
+
+            var end_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
+
+            //if (history_start) 
+            Position(step, start_pos, end_pos, m, w, starting.Count - 1, $"\n{i+1} из {Workers[m.acc_id].Count}");
+            // StartingAccPositiong(m.value, time_step);
+
+        }
+
+        if (step >= 1) i++;
+        step += 0.1f;
+        moving[m.acc_id].index = i;
+        moving[m.acc_id].step = step;
     }
 
     void OnGUI()
     {
-        DebugHelper.DrawConsole();
+        //if (Input.GetKeyDown(KeyCode.BackQuote)) 
+            DebugHelper.DrawConsole();
     }
 }
 

+ 18 - 0
Assets/Scripts/Models/Marker.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Assets.Scripts.Models
+{
+    public class Marker
+    {
+        public Toggle toggle { get; set; }
+        public GameObject marker { get; set; }
+        public LineRenderer marker_line { get; set; }
+        public uint acc_id { get; set; }
+    }
+}

+ 15 - 0
Assets/Scripts/Models/MarkerMoving.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Assets.Scripts.Models
+{
+    public class MarkerMoving
+    {
+        public int index { get; set; } // номер записи с координатами
+        public float step { get; set; } // шаг между крайними точками
+        
+    }
+}

+ 4 - 1
ProjectSettings/QualitySettings.asset

@@ -216,4 +216,7 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     excludedTargetPlatforms: []
-  m_PerPlatformDefaultQuality: {}
+  m_PerPlatformDefaultQuality:
+    Android: 0
+    Standalone: 0
+    WebGL: 0