Bläddra i källkod

普爱停车流程接近完成

yct 5 år sedan
förälder
incheckning
317164a751

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 2758 - 786
Assets/Scenes/SampleScene.unity


+ 9 - 8
Assets/Scenes/New Material.mat

@@ -7,14 +7,15 @@ Material:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: New Material
+  m_Name: door_mat
   m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
-  m_ShaderKeywords: 
+  m_ShaderKeywords: _ALPHAPREMULTIPLY_ON
   m_LightmapFlags: 4
   m_EnableInstancingVariants: 0
   m_DoubleSidedGI: 0
-  m_CustomRenderQueue: -1
-  stringTagMap: {}
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
   disabledShaderPasses: []
   m_SavedProperties:
     serializedVersion: 3
@@ -59,19 +60,19 @@ Material:
     - _BumpScale: 1
     - _Cutoff: 0.5
     - _DetailNormalMapScale: 1
-    - _DstBlend: 0
+    - _DstBlend: 10
     - _GlossMapScale: 1
     - _Glossiness: 0.5
     - _GlossyReflections: 1
     - _Metallic: 0
-    - _Mode: 0
+    - _Mode: 3
     - _OcclusionStrength: 1
     - _Parallax: 0.02
     - _SmoothnessTextureChannel: 0
     - _SpecularHighlights: 1
     - _SrcBlend: 1
     - _UVSec: 0
-    - _ZWrite: 1
+    - _ZWrite: 0
     m_Colors:
-    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 0.9035863, b: 0.6367924, a: 0.69803923}
     - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

Assets/Scenes/New Material.mat.meta → Assets/Scenes/door_mat.mat.meta


+ 1 - 1
Assets/Scenes/floors.mat

@@ -74,5 +74,5 @@ Material:
     - _UVSec: 0
     - _ZWrite: 0
     m_Colors:
-    - _Color: {r: 0.6156863, g: 0.6117647, b: 0.6156863, a: 0.6156863}
+    - _Color: {r: 0.6156863, g: 0.6133345, b: 0.6117647, a: 0.6156863}
     - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

+ 3 - 3
Assets/Scenes/planeMaterial.mat

@@ -9,7 +9,7 @@ Material:
   m_PrefabAsset: {fileID: 0}
   m_Name: planeMaterial
   m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
-  m_ShaderKeywords: _ALPHABLEND_ON
+  m_ShaderKeywords: _ALPHAPREMULTIPLY_ON
   m_LightmapFlags: 4
   m_EnableInstancingVariants: 0
   m_DoubleSidedGI: 0
@@ -65,12 +65,12 @@ Material:
     - _Glossiness: 0.55
     - _GlossyReflections: 1
     - _Metallic: 0
-    - _Mode: 2
+    - _Mode: 3
     - _OcclusionStrength: 1
     - _Parallax: 0.02
     - _SmoothnessTextureChannel: 0
     - _SpecularHighlights: 1
-    - _SrcBlend: 5
+    - _SrcBlend: 1
     - _UVSec: 0
     - _ZWrite: 0
     m_Colors:

+ 244 - 228
Assets/Simple Vehicle Pack/Prefabs/Car_3.prefab

@@ -1,22 +1,12 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
---- !u!1001 &100100000
-Prefab:
-  m_ObjectHideFlags: 1
-  serializedVersion: 2
-  m_Modification:
-    m_TransformParent: {fileID: 0}
-    m_Modifications: []
-    m_RemovedComponents: []
-  m_ParentPrefab: {fileID: 0}
-  m_RootGameObject: {fileID: 1646981259178978}
-  m_IsPrefabParent: 1
 --- !u!1 &1082330992245098
 GameObject:
   m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
   m_Component:
   - component: {fileID: 4320995382077394}
   - component: {fileID: 33986971871583076}
@@ -28,94 +18,12 @@ GameObject:
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1214189404145120
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
-  m_Component:
-  - component: {fileID: 4872715787176878}
-  - component: {fileID: 33290171747961834}
-  - component: {fileID: 23301199135736624}
-  m_Layer: 0
-  m_Name: Object006
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1375252959024446
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
-  m_Component:
-  - component: {fileID: 4907551743973842}
-  - component: {fileID: 33067074148266492}
-  - component: {fileID: 23253293620079004}
-  m_Layer: 0
-  m_Name: Object008
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1384095969250144
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
-  m_Component:
-  - component: {fileID: 4942120795113776}
-  - component: {fileID: 33803517687558392}
-  - component: {fileID: 23398125768832394}
-  m_Layer: 0
-  m_Name: Object003
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1616890662523094
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
-  m_Component:
-  - component: {fileID: 4453798734306758}
-  - component: {fileID: 33646056093240720}
-  - component: {fileID: 23713012142565998}
-  m_Layer: 0
-  m_Name: Object007
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1646981259178978
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 5
-  m_Component:
-  - component: {fileID: 4870167790249810}
-  m_Layer: 0
-  m_Name: Car_3
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
 --- !u!4 &4320995382077394
 Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1082330992245098}
   m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
   m_LocalPosition: {x: -0.38610077, y: 0.15307999, z: 0.7893189}
@@ -124,82 +32,21 @@ Transform:
   m_Father: {fileID: 4870167790249810}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4453798734306758
-Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1616890662523094}
-  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
-  m_LocalPosition: {x: 0.39543304, y: 0.15308, z: -0.6351894}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4870167790249810}
-  m_RootOrder: 3
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4870167790249810
-Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1646981259178978}
-  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: 4942120795113776}
-  - {fileID: 4320995382077394}
-  - {fileID: 4872715787176878}
-  - {fileID: 4453798734306758}
-  - {fileID: 4907551743973842}
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4872715787176878
-Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1214189404145120}
-  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
-  m_LocalPosition: {x: 0.3834482, y: 0.15307999, z: 0.7893189}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4870167790249810}
-  m_RootOrder: 2
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4907551743973842
-Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1375252959024446}
-  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
-  m_LocalPosition: {x: -0.39713344, y: 0.15307999, z: -0.6351894}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4870167790249810}
-  m_RootOrder: 4
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4942120795113776
-Transform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1384095969250144}
-  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
-  m_LocalPosition: {x: -0.00000001525879, y: 0.00000001525879, z: 0.00000024414064}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4870167790249810}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!23 &23253293620079004
+--- !u!33 &33986971871583076
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1082330992245098}
+  m_Mesh: {fileID: 4300002, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
+--- !u!23 &23897524296188826
 MeshRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1375252959024446}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1082330992245098}
   m_Enabled: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
@@ -208,6 +55,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
   m_Materials:
   - {fileID: 2100000, guid: d1609d52f4f81da40955e6165cb60e78, type: 2}
   m_StaticBatchInfo:
@@ -229,11 +77,52 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
+--- !u!1 &1214189404145120
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4872715787176878}
+  - component: {fileID: 33290171747961834}
+  - component: {fileID: 23301199135736624}
+  m_Layer: 0
+  m_Name: Object006
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4872715787176878
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1214189404145120}
+  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
+  m_LocalPosition: {x: 0.3834482, y: 0.15307999, z: 0.7893189}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 4870167790249810}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &33290171747961834
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1214189404145120}
+  m_Mesh: {fileID: 4300004, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
 --- !u!23 &23301199135736624
 MeshRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1214189404145120}
   m_Enabled: 1
   m_CastShadows: 1
@@ -243,6 +132,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
   m_Materials:
   - {fileID: 2100000, guid: d1609d52f4f81da40955e6165cb60e78, type: 2}
   m_StaticBatchInfo:
@@ -264,12 +154,53 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
---- !u!23 &23398125768832394
+--- !u!1 &1375252959024446
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4907551743973842}
+  - component: {fileID: 33067074148266492}
+  - component: {fileID: 23253293620079004}
+  m_Layer: 0
+  m_Name: Object008
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4907551743973842
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1375252959024446}
+  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
+  m_LocalPosition: {x: -0.39713344, y: 0.15307999, z: -0.6351894}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 4870167790249810}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &33067074148266492
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1375252959024446}
+  m_Mesh: {fileID: 4300008, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
+--- !u!23 &23253293620079004
 MeshRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1384095969250144}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1375252959024446}
   m_Enabled: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
@@ -278,6 +209,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
   m_Materials:
   - {fileID: 2100000, guid: d1609d52f4f81da40955e6165cb60e78, type: 2}
   m_StaticBatchInfo:
@@ -299,12 +231,53 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
---- !u!23 &23713012142565998
+--- !u!1 &1384095969250144
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4942120795113776}
+  - component: {fileID: 33803517687558392}
+  - component: {fileID: 23398125768832394}
+  m_Layer: 0
+  m_Name: Object003
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4942120795113776
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384095969250144}
+  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
+  m_LocalPosition: {x: -0.00000001525879, y: 0.00000001525879, z: 0.00000024414064}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 4870167790249810}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &33803517687558392
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384095969250144}
+  m_Mesh: {fileID: 4300000, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
+--- !u!23 &23398125768832394
 MeshRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1616890662523094}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384095969250144}
   m_Enabled: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
@@ -313,6 +286,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
   m_Materials:
   - {fileID: 2100000, guid: d1609d52f4f81da40955e6165cb60e78, type: 2}
   m_StaticBatchInfo:
@@ -334,12 +308,53 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
---- !u!23 &23897524296188826
+--- !u!1 &1616890662523094
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4453798734306758}
+  - component: {fileID: 33646056093240720}
+  - component: {fileID: 23713012142565998}
+  m_Layer: 0
+  m_Name: Object007
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4453798734306758
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616890662523094}
+  m_LocalRotation: {x: 0.000000021855694, y: 0, z: -0, w: 1}
+  m_LocalPosition: {x: 0.39543304, y: 0.15308, z: -0.6351894}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 4870167790249810}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &33646056093240720
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616890662523094}
+  m_Mesh: {fileID: 4300006, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
+--- !u!23 &23713012142565998
 MeshRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1082330992245098}
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616890662523094}
   m_Enabled: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
@@ -348,6 +363,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
   m_Materials:
   - {fileID: 2100000, guid: d1609d52f4f81da40955e6165cb60e78, type: 2}
   m_StaticBatchInfo:
@@ -369,38 +385,38 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
---- !u!33 &33067074148266492
-MeshFilter:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1375252959024446}
-  m_Mesh: {fileID: 4300008, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
---- !u!33 &33290171747961834
-MeshFilter:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1214189404145120}
-  m_Mesh: {fileID: 4300004, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
---- !u!33 &33646056093240720
-MeshFilter:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1616890662523094}
-  m_Mesh: {fileID: 4300006, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
---- !u!33 &33803517687558392
-MeshFilter:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1384095969250144}
-  m_Mesh: {fileID: 4300000, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
---- !u!33 &33986971871583076
-MeshFilter:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1082330992245098}
-  m_Mesh: {fileID: 4300002, guid: 75fac0ffc516dac4fb20ed28a0b923fd, type: 3}
+--- !u!1 &1646981259178978
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4870167790249810}
+  m_Layer: 0
+  m_Name: Car_3
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4870167790249810
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1646981259178978}
+  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: 4942120795113776}
+  - {fileID: 4320995382077394}
+  - {fileID: 4872715787176878}
+  - {fileID: 4453798734306758}
+  - {fileID: 4907551743973842}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 265 - 70
Assets/controller.cs

@@ -5,9 +5,11 @@ using UnityEngine;
 public class controller : MonoBehaviour
 {
     public GameObject machineArm;
+    public GameObject scanBoard;
     public GameObject elevator_left;
     public GameObject elevator_right;
     public GameObject carModel;
+    public GameObject eventGenerator;
     public GameObject[] transferVehicles;
     /// <summary>
     /// 0 idle, 1 停车机械手抓车, 2 停车右电梯送出中跑车接车, 3 停车左电梯送中跑车上楼并送车,cmd=2, 4 停车
@@ -15,21 +17,29 @@ public class controller : MonoBehaviour
     /// </summary>
     public int state;
     public bool ready;
+    // 0等待锁,1设备锁
+    public int[] doorLock = { 0, 0, 0, 0, 0, 0 };
+    public GameObject[] doors;
 
     /// <summary>
-    /// 假设123停车,456取车
+    /// 停车终端个数,从生成器获取
     /// </summary>
+    public int numOfParkTerm;
     public int[] termState = { 0, 0, 0, 0, 0, 0 };
     private int[] currTermVar = { 0, 0, 0, 0, 0, 0 };
+    private int[] scanned = { 0, 0, 0, 0, 0, 0 };
     private static int[] termIndex = { 4, 6, 7, 9, 10, 12 };
     private List<CarInfo> movingCars;
+    private Dictionary<int, int> parkSpace;
     private bool initialized;
     private float prevTime;
-    private int currIndex;
+    public int currIndex;
+    private int currTransIndex;
     private GameObject usingTrans;
     private const int cmdInterval = 3;
-    private int parkSpaceIndex;
+    public int parkSpaceIndex;
     private int fetchSpaceIndex;
+    private float[] termX = { 1.2f, 6.2f, 8.7f, 13.7f, 16.2f, 21.2f };
 
     public GameObject CreateCar(Vector3 position)
     {
@@ -51,6 +61,16 @@ public class controller : MonoBehaviour
         //Debug.Log(movingCars.Contains(temp));
         if (movingCars.Contains(temp))
         {
+            temp = movingCars.Find((CarInfo ci) => { return ci.Equals(temp); });
+            int space = (temp.floor - 2) * 15 + temp.space;
+            if (parkSpace.ContainsKey(space))
+            {
+                parkSpace[space] = 0;
+            }
+            else
+            {
+                parkSpace.Add(space, 0);
+            }
             movingCars.Remove(temp);
             Destroy(car);
         }
@@ -63,6 +83,15 @@ public class controller : MonoBehaviour
             CarInfo temp = new CarInfo(car, floor, space);
             temp.state = 2;
             movingCars.Add(temp);
+            int spaceNo = (floor - 2) * 15 + space;
+            if (!parkSpace.ContainsKey(spaceNo))
+            {
+                parkSpace.Add(spaceNo, 1);
+            }
+            else
+            {
+                parkSpace[spaceNo] = 1;
+            }
         }
     }
 
@@ -84,7 +113,12 @@ public class controller : MonoBehaviour
     // Start is called before the first frame update
     void Start()
     {
-        Random.InitState((int)(Time.time*1000.0f));
+        currTransIndex = 0;
+        for (int i = 0; i < doorLock.Length; i++)
+        {
+            doorLock[i] = 1;
+        }
+        Random.InitState((int)(Time.time * 1000.0f));
         transferVehicles = GameObject.FindGameObjectsWithTag("transfer");
         if (transferVehicles.Length != 3 || machineArm == null || elevator_left == null || elevator_right == null || carModel == null)
         {
@@ -103,6 +137,7 @@ public class controller : MonoBehaviour
             movingCars = new List<CarInfo>();
             initialized = true;
             currIndex = 0;
+            parkSpace = new Dictionary<int, int>();
             //// 中跑车排序
             //int floor = 13;
             //int index = -1;
@@ -133,44 +168,18 @@ public class controller : MonoBehaviour
         }
     }
 
-    // 根据楼层选择中跑车编号
-    public int GetSpecificTrans(int floor)
+    // 根据停取车选择中跑车编号
+    public int GetSpecificTrans(bool park)
     {
-        //for (int i = 0; i < transferVehicles.Length; i++)
-        //{
-        //    int temp = transferVehicles[i].GetComponent<transferBehavior>().GetFloor();
-        //    if (floor >= 2 && floor < 6 && temp >= 2 && temp < 6)
-        //        return i;
-        //    else if (floor >= 6 && floor < 8 && temp >= 6 && temp < 8)
-        //        return i;
-        //    else if (floor >= 8 && floor < 10 && temp >= 8 && temp < 10)
-        //        return i;
-        //    else if (floor >= 10 && floor < 11 && temp >= 10 && temp < 11)
-        //        return i;
-        //    else if (floor >= 11 && floor < 13 && temp >= 11 && temp < 13)
-        //        return i;
-        //}
-        if (floor >= 2 && floor < 6)
-            return 0;
-        else if (floor >= 6 && floor < 8)
-            return 1;
-        else if (floor >= 8 && floor < 10)
-            return 2;
-        else if (floor >= 10 && floor < 11)
-            return 3;
-        else if (floor >= 11 && floor < 13)
-            return 4;
+        for (int i = 0; i < transferVehicles.Length; i++)
+        {
+            int temp = transferVehicles[i].GetComponent<transferBehavior>().GetFloor();
+        }
         return -1;
 
     }
 
-    void UpdateTrans()
-    {
-
-    }
-
     // 模拟PLC读取终端指令
-
     void UpdateCmd()
     {
         //Debug.Log("currIndex: "+currIndex +", state: "+currTermVar[currIndex]);
@@ -188,31 +197,51 @@ public class controller : MonoBehaviour
                 }
             }
         }
-
+        //Debug.Log("curIndex: " + currIndex + ", " + currTermVar[currIndex] + ", " + termState[currIndex]);
     }
 
     void BasicStateMachine()
     {
+        if (parkSpace == null)
+        {
+            parkSpace = new Dictionary<int, int>();
+            for (int i = 1; i < 166; i++)
+            {
+                parkSpace.Add(i, 0);
+            }
+        }
         switch (state)
         {
             case 0:
                 UpdateCmd();
+                Debug.Log("更新cmd完成");
                 if (currTermVar[currIndex] == 1)
                 {
                     // 搜寻空位
                     if (parkSpaceIndex <= 0)
                     {
-                        parkSpaceIndex = Mathf.FloorToInt(Random.value*(167-46))+46;//暂时测试5楼以上功能
-                        Debug.Log("parkSpace: "+parkSpaceIndex);
-                        for (int i = 0; i < movingCars.Count; i++)
+                        //parkSpaceIndex = Mathf.FloorToInt(Random.value*(167-46))+46;//暂时测试5楼以上功能
+                        Debug.Log("找空位");
+                        for (int i = 46; i < 166; i++)
                         {
-                            if ((movingCars[i].floor-2) * 15 + movingCars[i].space == parkSpaceIndex)
+                            if (parkSpace.ContainsKey(i) && parkSpace[i] == 0)
                             {
-                                parkSpaceIndex = 0;
-                                return;
+                                parkSpaceIndex = i;
+                            }else if (!parkSpace.ContainsKey(i))
+                            {
+                                parkSpace.Add(i, 0);
+                                parkSpaceIndex = i;
                             }
+                            for (int j = 0; j < movingCars.Count; j++)
+                            {
+                                if ((movingCars[j].floor - 2) * 15 + movingCars[j].space == parkSpaceIndex)
+                                {
+                                    parkSpaceIndex = 0;
+                                    break;
+                                }
+                            }
+                            if (parkSpaceIndex != 0) { Debug.Log("parkSpace: " + parkSpaceIndex); state = 1; break; }
                         }
-                        state = 1;
                     }
                 }
                 else if (currTermVar[currIndex] == 2)
@@ -286,10 +315,11 @@ public class controller : MonoBehaviour
                 // 寻找空闲中跑车
                 else if (usingTrans == null)
                 {
-                    int transIndex = GetSpecificTrans(Mathf.FloorToInt((parkSpaceIndex-1) / 15.0f) + 2);
-                    Debug.Log("choose trans: "+transIndex);
-                    if (transIndex != -1)
-                        usingTrans = transferVehicles[transIndex];
+                    //int transIndex = GetSpecificTrans(Mathf.FloorToInt((parkSpaceIndex - 1) / 15.0f) + 2);
+                    //Debug.Log("choose trans: " + transIndex);
+                    //if (transIndex != -1)
+                    //    usingTrans = transferVehicles[transIndex];
+
                     //for (int i = 0; i < transferVehicles.Length; i++)
                     //{
                     //    if (transferVehicles[i].GetComponent<transferBehavior>().GetFloor() < manDist)
@@ -308,8 +338,8 @@ public class controller : MonoBehaviour
                     int transState = usingTrans.GetComponent<transferBehavior>().state;
                     int transFloor = usingTrans.GetComponent<transferBehavior>().GetFloor();
                     int transSpace = usingTrans.GetComponent<transferBehavior>().GetSpace();
-                    int targetFloor = Mathf.FloorToInt((parkSpaceIndex-1) / 15.0f) + 2;
-                    int targetSpace = parkSpaceIndex - (targetFloor-2) * 15;
+                    int targetFloor = Mathf.FloorToInt((parkSpaceIndex - 1) / 15.0f) + 2;
+                    int targetSpace = parkSpaceIndex - (targetFloor - 2) * 15;
                     // 中跑车在下方接车点
                     if (transLoad != null && transState == 0 && transFloor == 2 && transSpace == termIndex[currIndex])
                     {
@@ -352,32 +382,35 @@ public class controller : MonoBehaviour
                                 usingTrans.GetComponent<transferBehavior>().SendCmd(2);
                             }
                             // 移位状态复位
-                            else if(transLoad == null)
+                            else if (transLoad == null)
                             {
                                 usingTrans.GetComponent<transferBehavior>().SendCmd(-1);
                             }
                         }
-                        else if (transLoad == null && transState == 0){
+                        else if (transLoad == null && transState == 0)
+                        {
                             //if (transSpace == targetSpace)
                             //{
-                                if (machineArm.GetComponent<machineArmBehavior>().state == 14)
-                                {
-                                    machineArm.GetComponent<machineArmBehavior>().state = 24;
-                                }
-                                if (transSpace > 3 && transSpace < 13)
-                                {
-                                    currTermVar[currIndex] = 0;
-                                    termState[currIndex] = 0;
-                                    parkSpaceIndex = -1;
-                                    usingTrans = null;
-                                    state = 0;
-                                }
-                                else
-                                {
-                                    usingTrans.GetComponent<transferBehavior>().SetTarget(transFloor, transSpace <= 3 ? 4 : 12);
-                                }
+                            if (machineArm.GetComponent<machineArmBehavior>().state == 14)
+                            {
+                                machineArm.GetComponent<machineArmBehavior>().state = 24;
+                            }
+                            if (transSpace > 2 && transSpace < 14)
+                            {
+                                currTermVar[currIndex] = 0;
+                                termState[currIndex] = 0;
+                                parkSpaceIndex = -1;
+                                usingTrans = null;
+                                state = 0;
+                                //eventGenerator.GetComponent<eventGenerateBehavior>().myState[currIndex]=0;
+                            }
+                            else
+                            {
+                                usingTrans.GetComponent<transferBehavior>().SetTarget(transFloor, transSpace <= 3 ? 3 : 13);
+                            }
                             //}
-                        }else if (transState == 3)
+                        }
+                        else if (transState == 3)
                         {
                             //Debug.Log(targetSpace);
                             if (targetSpace < 4 && elevator_right.GetComponent<elevatorBehavior>().state == 0 && elevator_right.GetComponent<elevatorBehavior>().load == null)
@@ -410,16 +443,179 @@ public class controller : MonoBehaviour
         }
     }
 
+    /// <summary>
+    /// 检查停取终端状态,停车终端是否有车等待,取车终端是否有人等待
+    /// </summary>
+    void CheckState()
+    {
+        int[] waitingForDoors = eventGenerator.GetComponent<eventGenerateBehavior>().waitingForDoors;
+        GameObject[] objs = eventGenerator.GetComponent<eventGenerateBehavior>().myObject;
+        doors = eventGenerator.GetComponent<eventGenerateBehavior>().doors;
+        // 检查门状态并长期上锁
+        for (int i = 0; i < doors.Length; i++)
+        {
+            if (doors[i].GetComponent<doorBehavior>().close && doorLock[i] != 1 && !doors[i].GetComponent<doorBehavior>().moving)
+            {
+                doorLock[i] = 1;
+            }
+            else if (!doors[i].GetComponent<doorBehavior>().close || doors[i].GetComponent<doorBehavior>().moving)
+            {
+                doorLock[i] = 0;
+            }
+        }
+
+        // 检查停车终端等待开门车辆
+        for (int i = 0; i < termState.Length; i++)
+        {
+            if (termState[i] != 0)
+                continue;
+            if (i < numOfParkTerm)
+            {
+                if (waitingForDoors[i] == 1)
+                {
+                    //找机会开门。机械手,扫描板与二楼中跑车不在上空可开门
+                    int armState = machineArm.GetComponent<machineArmBehavior>().state;
+                    int armTerm = machineArm.GetComponent<machineArmBehavior>().GetNearestTerm();
+                    if (armTerm == i)
+                    {
+                        if (armState == 0)
+                        {
+                            // 往右移
+                            if (i > 0 && doors[i - 1].GetComponent<doorBehavior>().close && !doors[i - 1].GetComponent<doorBehavior>().moving)
+                            {
+                                float diff = machineArm.transform.position.x - termX[i - 1];
+                                machineArm.GetComponent<machineArmBehavior>().ArmMove(0, diff, 0);
+                            }
+                            else if (i < termState.Length - 1 && doors[i + 1].GetComponent<doorBehavior>().close && !doors[i + 1].GetComponent<doorBehavior>().moving)
+                            {
+                                float diff = machineArm.transform.position.x - termX[i + 1];
+                                machineArm.GetComponent<machineArmBehavior>().ArmMove(0, diff, 0);
+                            }
+                        }
+                        else
+                        {
+                            Debug.Log("机械手位置异常");
+                        }
+                        continue;
+                    }
+
+                    int boardState = scanBoard.GetComponent<scanBoardBehavior>().state;
+                    int boardTerm = scanBoard.GetComponent<scanBoardBehavior>().GetNearestTerm();
+                    if (boardTerm == i)
+                    {
+                        if (boardState == 0)
+                        {
+                            // 往右移
+                            if (i > 0 && doors[i - 1].GetComponent<doorBehavior>().close && !doors[i - 1].GetComponent<doorBehavior>().moving)
+                            {
+                                float diff = scanBoard.transform.position.x - termX[i - 1];
+                                if (Mathf.Abs(diff) > 0.25f)
+                                {
+                                    scanBoard.transform.Translate(Vector3.left * scanBoard.GetComponent<scanBoardBehavior>().speedX * Time.deltaTime);
+                                }
+                            }
+                            else if (i < termState.Length - 1 && doors[i + 1].GetComponent<doorBehavior>().close && !doors[i + 1].GetComponent<doorBehavior>().moving)
+                            {
+                                float diff = scanBoard.transform.position.x - termX[i + 1];
+                                if (Mathf.Abs(diff) > 0.25f)
+                                {
+                                    scanBoard.transform.Translate(Vector3.right * scanBoard.GetComponent<scanBoardBehavior>().speedX * Time.deltaTime);
+                                }
+                            }
+                        }
+                        else
+                        {
+                            Debug.Log("扫描板位置异常");
+                        }
+                        continue;
+                    }
+
+                    bool transCheck = true;
+                    for (int j = 0; j < transferVehicles.Length; j++)
+                    {
+                        int index = transferVehicles[j].GetComponent<transferBehavior>().GetNearestTerm();
+                        int transState = transferVehicles[j].GetComponent<transferBehavior>().state;
+                        // 上方有中跑车
+                        if (i == index)
+                        {
+                            if (transState == 0)
+                            {
+                                // 往右移
+                                if (i > 0 && doors[i - 1].GetComponent<doorBehavior>().close && !doors[i - 1].GetComponent<doorBehavior>().moving)
+                                {
+                                    float diff = transferVehicles[j].transform.position.x - termX[i - 1];
+                                    transferVehicles[j].GetComponent<transferBehavior>().TransferMove(0, diff, 0);
+                                }
+                                else if (i < termState.Length - 1 && doors[i + 1].GetComponent<doorBehavior>().close && !doors[i + 1].GetComponent<doorBehavior>().moving)
+                                {
+                                    float diff = transferVehicles[j].transform.position.x - termX[i + 1];
+                                    transferVehicles[j].GetComponent<transferBehavior>().TransferMove(0, diff, 0);
+                                }
+                            }
+                            else
+                            {
+                                Debug.Log("中跑车位置异常");
+                                transCheck &= false;
+                            }
+                            continue;
+                        }
+                    }
+                    if (!transCheck) continue;
+                    // 检查通过后开门
+                    doors[i].GetComponent<doorBehavior>().close = false;
+                    waitingForDoors[i] = 0;
+                }
+                // 终端车辆已停好且未处理,关门扫描后发停车指令
+                else if (objs[i] != null && objs[i].transform.position.z <= -2.9f && termState[i] == 0)
+                {
+                    if (!doors[i].GetComponent<doorBehavior>().moving)
+                    {
+                        if (!doors[i].GetComponent<doorBehavior>().close)
+                        {
+                            doors[i].GetComponent<doorBehavior>().close = true;
+                        }
+                        else if (scanned[i] == 1)
+                        {
+                            scanned[i] = 0;
+                            termState[i] = 1;
+                            eventGenerator.GetComponent<eventGenerateBehavior>().ClearObject(i+1, true);
+                            //Debug.Log(i + 1);
+                        }
+                        else if (scanned[i] == 0)
+                        {
+                            if (scanBoard.GetComponent<scanBoardBehavior>().state == 0 && !scanBoard.GetComponent<scanBoardBehavior>().scanned)
+                            {
+                                scanBoard.GetComponent<scanBoardBehavior>().targetTerm = i + 1;
+                            }
+                            else if (scanBoard.GetComponent<scanBoardBehavior>().scanned)
+                            {
+                                scanned[i] = 1;
+                                scanBoard.GetComponent<scanBoardBehavior>().scanned = false;
+                            }
+                        }
+                    }
+                }
+            }
+            // 检查取车终端是否空闲,且有人等待,有则发送取车指令
+            else if (i >= numOfParkTerm && termState[i] == 0 && objs[i] != null && objs[i].transform.position.z <= 0.5f)
+            {
+                termState[i] = 2;
+            }
+        }
+    }
 
     // Update is called once per frame
     void Update()
     {
         if (initialized)
         {
+            numOfParkTerm = eventGenerator.GetComponent<eventGenerateBehavior>().numOfParkTerm;
             if (movingCars == null)
             {
                 movingCars = new List<CarInfo>();
             }
+            CheckState();
+            BasicStateMachine();
 
             ////控制频率,30s生成停取指令
             //if ((Time.time - prevTime) > cmdInterval)
@@ -437,7 +633,6 @@ public class controller : MonoBehaviour
             //    prevTime = Time.time;
             //}
 
-            //BasicStateMachine();
         }
     }
 }

+ 52 - 0
Assets/doorBehavior.cs

@@ -0,0 +1,52 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class doorBehavior : MonoBehaviour
+{
+    public bool close;
+    public bool moving;
+    public float speed;
+    private const float closeCenter = 1.5f;
+    private const float openCenter = 4.5f;
+
+    // Start is called before the first frame update
+    void Start()
+    {
+        close = true;
+        speed = 1f;
+    }
+
+    void Move(float diff)
+    {
+        if (diff > speed * 0.04f)
+        {
+            transform.Translate(Vector3.down * speed * Time.deltaTime);
+        }
+        else if (diff < -speed * 0.04f)
+        {
+            transform.Translate(Vector3.up * speed * Time.deltaTime);
+        }
+        else
+        {
+            moving = false;
+            return;
+        }
+        moving = true;
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (close)
+        {
+            float diff = transform.position.y - closeCenter;
+            Move(diff);
+        }
+        else
+        {
+            float diff = transform.position.y - openCenter;
+            Move(diff);
+        }
+    }
+}

+ 11 - 0
Assets/doorBehavior.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 03fe8e85945b1c04191de0151453eb0b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 2
Assets/elevatorBehavior.cs

@@ -38,7 +38,7 @@ public class elevatorBehavior : MonoBehaviour
     {
         state = 0;
         speed = 6.0f;
-        targetFloor = 1;
+        targetFloor = 2;
         currPos = GetComponent<Transform>().position;
         currPos.x = 0.1f;
         GetComponent<Transform>().position.Set(currPos.x, currPos.y, currPos.z);
@@ -84,7 +84,7 @@ public class elevatorBehavior : MonoBehaviour
         {
             Vector3 posDiff = transfers[i].GetComponent<Transform>().position - transform.position;
             
-            if (Mathf.Abs(posDiff.x) < 2.5f && Mathf.Abs(posDiff.y) < 0.25f && Mathf.Abs(posDiff.z) < 0.5f)
+            if (Mathf.Abs(posDiff.x) < 1f && Mathf.Abs(posDiff.y) < 0.25f && Mathf.Abs(posDiff.z) < 0.5f)
             {
                 //Debug.Log("eleDiff: " + posDiff);
                 load = transfers[i];

+ 161 - 0
Assets/eventGenerateBehavior.cs

@@ -0,0 +1,161 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class eventGenerateBehavior : MonoBehaviour
+{
+    public GameObject ctrlr;
+    public GameObject person;
+    public int currCmd;
+    public int numOfParkTerm;
+    public float speed;
+    // 门对象,开门后自动进入并关门,上锁和开门由controller控制
+    public GameObject[] doors;
+    public GameObject[] myObject;
+    public int[] waitingForDoors = { 0, 0, 0, 0, 0, 0 };
+    public int[] myState = { 0, 0, 0, 0, 0, 0 };
+
+    private float prevTime;
+    private static float[] termPosX = { 1.2f, 6.2f, 8.7f, 13.7f, 16.2f, 21.2f };
+    // 0空闲 1停车 2取车
+    private System.Random rnd;
+
+    // Start is called before the first frame update
+    void Start()
+    {
+        speed = 0.5f;
+        myObject = new GameObject[6];
+        numOfParkTerm = 3;
+        doors = GameObject.FindGameObjectsWithTag("door");
+        // 门排序
+        float x = 100f;
+        int index = -1;
+        for (int i = 0; i < doors.Length; i++)
+        {
+            for (int j = i; j < doors.Length; j++)
+            {
+                if (doors[j].transform.position.x < x)
+                {
+                    x = doors[j].transform.position.x;
+                    index = j;
+                }
+            }
+            GameObject temp = doors[index];
+            doors[index] = doors[i];
+            doors[i] = temp;
+            x = 100f;
+            index = -1;
+        }
+        prevTime = Time.time;
+        currCmd = -1;
+        rnd = new System.Random();
+    }
+
+    /// <summary>
+    /// 机械手调用,停车抓车后清除
+    /// </summary>
+    public void ClearObject(int termIndex, bool clearCmd)
+    {
+        if (clearCmd)
+        {
+            myState[termIndex - 1] = 0;
+        }
+        if(myObject[termIndex - 1] != null)
+        {
+            Destroy(myObject[termIndex - 1]);
+        }
+    }
+
+    /// <summary>
+    /// 生成0-5终端指令
+    /// </summary>
+    /// <returns></returns>
+    int GenerateCmd()
+    {
+        int place = 2;
+        //myState[place] = 1;
+        if (rnd == null)
+            rnd = new System.Random();
+        //// 定时器30s
+        //if (Time.time - prevTime > 5)
+        //{
+        //    int count = 5;
+        //    prevTime = Time.time;
+        //    // 创建准备停车车辆或取车用户
+        //    while (count-- > 0 && place == -1)
+        //    {
+        //        place = rnd.Next(0, 6);
+        //        if (myState[place] == 0)
+        //        {
+        //            myState[place] = place < numOfParkTerm ? 1 : 2;
+        //        }
+        //        else place = -1;
+        //    }
+        //}
+        return place;
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        int cmd = GenerateCmd();
+        currCmd = cmd;
+        if (cmd != -1)
+        {
+            // 停车
+            if(myState[cmd] == 1 && myObject[cmd] == null)
+            {
+                myObject[cmd] = ctrlr.GetComponent<controller>().CreateCar(new Vector3(termPosX[cmd], 0, 8));
+            }
+            // 取车
+            else if(myState[cmd] == 2 && myObject[cmd] == null)
+            {
+                myObject[cmd] = Instantiate(person);
+                myObject[cmd].transform.position = new Vector3(termPosX[cmd], 0, 8);
+            }
+        }
+        // 更新所有终端前对象状态
+        for (int i = 0; i < myState.Length; i++)
+        {
+            // 停车
+            if(myState[i] == 1)
+            {
+                if (myObject[i] != null)
+                {
+                    if (!doors[i].GetComponent<doorBehavior>().close)
+                    {
+                        // 开门后,车辆入场, 入场后关门
+                        waitingForDoors[i] = 0;
+                        if (myObject[i].transform.position.z > -2.9f)
+                        {
+                            myObject[i].transform.Translate(Vector3.forward * speed * Time.deltaTime);
+                            //Debug.Log(speed * Time.deltaTime);
+                            //Debug.Log("pos: " + myObject[i].transform.position);
+                        }else if (!doors[i].GetComponent<doorBehavior>().moving)
+                        {
+                            doors[i].GetComponent<doorBehavior>().close = true;
+                            ctrlr.GetComponent<controller>().doorLock[i] = 1;
+                        }
+                    }
+                    else if(myObject[i].transform.position.z > -2.8f && !doors[i].GetComponent<doorBehavior>().moving)
+                    {
+                        waitingForDoors[i] = 1;
+                    }
+                }
+                else
+                {
+                    waitingForDoors[i] = 0;
+                }
+            }
+            // 取车
+            else if(myState[i] == 2 && myObject[i] != null)
+            {
+                // 人往终端走
+                if (myObject[i].transform.position.z > 0.5f)
+                {
+                    myObject[i].transform.Translate(Vector3.back * speed * Time.deltaTime);
+                }
+            }
+        }
+    }
+}

+ 11 - 0
Assets/eventGenerateBehavior.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0a0f25ed1dc25e94990a3a52f4773797
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 118 - 23
Assets/machineArmBehavior.cs

@@ -7,15 +7,15 @@ public class machineArmBehavior : MonoBehaviour
     // 非空闲,第一位2表示已就位,1表示运行中。
     //0 idle, x1 park x forward, x2 park y downward, x3 park y upward, x4 park put car and y reset
     //x6 fetch x forward, x7 fetch y downward, x8 fetch y downward 
-    public GameObject controller;
+    public GameObject ctrlr;
     public int state;
     public float xSpeed;
     public float ySpeed;
     public bool park;
     public int terminalIndex;
-    private const float minX = 0;
-    private const float maxX = 22.8f;
-    private float[] termX = { 2.0f, 5.7f, 9.6f, 13.2f, 16.9f, 21f };
+    //private const float minX = 0;
+    //private const float maxX = 22.8f;
+    private float[] termX = { 1.2f, 6.2f, 8.7f, 13.7f, 16.2f, 21.2f };
     private Vector3 currPos;
     private Transform armFront, roller;
     public GameObject myCar { get; set; }
@@ -32,15 +32,42 @@ public class machineArmBehavior : MonoBehaviour
         roller = transform.Find("roller");
     }
 
+    /// <summary>
+    ///  获取离机械手最近终端编号0-5
+    /// </summary>
+    /// <returns></returns>
+    public int GetNearestTerm()
+    {
+        // 已靠边
+        if (transform.position.x < -1 || transform.position.x > 23)
+        {
+            return -1;
+        }
+        else
+        {
+            float diff = 99f;
+            int index = -1;
+            for (int i = 0; i < termX.Length; i++)
+            {
+                if (diff > Mathf.Abs(transform.position.x - termX[i]))
+                {
+                    diff = Mathf.Abs(transform.position.x - termX[i]);
+                    index = i;
+                }
+            }
+            return index;
+        }
+    }
+
     /// <summary>
     /// move arm
     /// </summary>
     /// <param name="axis"> 0x 1y </param>
     /// <param name="diff"></param>
     /// <param name=""></param>
-    void ArmMove(int axis, float diff, int toState, GameObject car=null)
+    public void ArmMove(int axis, float diff, int toState, GameObject car = null)
     {
-        if(axis == 0)
+        if (axis == 0)
         {
             if (Mathf.Abs(diff) < Time.deltaTime * 15)
             {
@@ -48,13 +75,40 @@ public class machineArmBehavior : MonoBehaviour
             }
             else if (diff < 0)
             {
+                for (int i = 0; i < termX.Length; i++)
+                {
+                    // 找到其左边第一个终端
+                    if (currPos.x < termX[i])
+                    {
+                        // 未上锁等待
+                        if (ctrlr.GetComponent<controller>().doorLock[i] != 1)
+                        {
+                            Debug.Log("机械手等待锁门");
+                            return;
+                        }
+                    }
+                }
                 transform.Translate(Vector3.right * xSpeed * Time.deltaTime);
             }
             else
             {
+                for (int i = termX.Length - 1; i >= 0; i--)
+                {
+                    // 找到其右边第一个终端
+                    if (currPos.x > termX[i])
+                    {
+                        // 未上锁等待
+                        if (ctrlr.GetComponent<controller>().doorLock[i] != 1)
+                        {
+                            Debug.Log("机械手等待锁门");
+                            return;
+                        }
+                    }
+                }
                 transform.Translate(Vector3.left * xSpeed * Time.deltaTime);
             }
-        }else if(axis == 1)
+        }
+        else if (axis == 1)
         {
             if (Mathf.Abs(diff) < 0.1)
             {
@@ -101,31 +155,31 @@ public class machineArmBehavior : MonoBehaviour
 
             // 停车状态
             case 11://x轴平移
-                float diffX = currPos.x - termX[(terminalIndex - 1) % 6 ];
+                float diffX = currPos.x - termX[(terminalIndex - 1) % 6];
                 ArmMove(0, diffX, 21);
                 break;
             case 21:
                 state = 12;
                 break;
             case 12:// y轴高度下降
-                float diffY = roller.localScale.y-4;
+                float diffY = roller.localScale.y - 4;
                 ArmMove(1, diffY, 22);
                 break;
             case 22:// 创建车模
                 state = 13;
-                myCar = controller.GetComponent<controller>().CreateCar(new Vector3(currPos.x, currPos.y - 1.25f - roller.localScale.y * 2 - 1.5f, currPos.z));
+                myCar = ctrlr.GetComponent<controller>().CreateCar(new Vector3(currPos.x, currPos.y - 1.25f - roller.localScale.y * 2 - 1.5f, currPos.z));
                 break;
             case 13:// y轴高度上升,移动车模
                 diffY = roller.localScale.y - 2;
                 ArmMove(1, diffY, 23, myCar);
                 break;
             case 23:// 判断是否下方已存在等待的中跑车
-                GameObject[] transfers = controller.GetComponent<controller>().transferVehicles;
+                GameObject[] transfers = ctrlr.GetComponent<controller>().transferVehicles;
                 for (int i = 0; i < transfers.Length; i++)
                 {
                     Vector3 temp = transfers[i].GetComponent<Transform>().position;
                     transferBehavior tb = transfers[i].GetComponent<transferBehavior>();
-                    if (tb.state == 4 && tb.cmd == 0 && Mathf.Abs(temp.y-3)<0.25f && Mathf.Abs(temp.x - currPos.x) < 1.5f && Mathf.Abs(temp.z - currPos.z)<0.25f)
+                    if (tb.state == 4 && tb.cmd == 0 && Mathf.Abs(temp.y - 3) < 0.25f && Mathf.Abs(temp.x - currPos.x) < 1.5f && Mathf.Abs(temp.z - currPos.z) < 0.25f)
                     {
                         tb.cmd = 1;// 发送接车指令
                         state = 14;
@@ -144,13 +198,13 @@ public class machineArmBehavior : MonoBehaviour
 
             // 取车状态
             case 15:// 移动x轴
-                int index = (terminalIndex-1) % 6 + 1;
+                int index = (terminalIndex - 1) % 6 + 1;
                 diffX = currPos.x - termX[index - 1];
                 ArmMove(0, diffX, 25);
                 break;
             case 25:
                 // 等中跑车到达且状态为4
-                transfers = controller.GetComponent<controller>().transferVehicles;
+                transfers = ctrlr.GetComponent<controller>().transferVehicles;
                 for (int i = 0; i < transfers.Length; i++)
                 {
                     Vector3 temp = transfers[i].GetComponent<Transform>().position;
@@ -167,7 +221,7 @@ public class machineArmBehavior : MonoBehaviour
             case 160:// 放下y轴,抓车, 由中跑车更新车辆句柄
                 diffY = roller.localScale.y - 2;
                 ArmMove(1, diffY, 160, myCar);
-                if(myCar != null)
+                if (myCar != null)
                 {
                     state = 161;
                 }
@@ -177,7 +231,7 @@ public class machineArmBehavior : MonoBehaviour
                 ArmMove(1, diffY, 26, myCar);
                 break;
             case 26:// 等待中跑车移开
-                transfers = controller.GetComponent<controller>().transferVehicles;
+                transfers = ctrlr.GetComponent<controller>().transferVehicles;
                 for (int i = 0; i < transfers.Length; i++)
                 {
                     Vector3 temp = transfers[i].GetComponent<Transform>().position;
@@ -190,19 +244,60 @@ public class machineArmBehavior : MonoBehaviour
                 break;
             case 17:// 放下y轴
                 diffY = roller.localScale.y - 4;
-                ArmMove(1, diffY, 27,myCar);
+                ArmMove(1, diffY, 27, myCar);
                 break;
             case 27:
                 state = 18;
                 break;
-            case 18:// 收起y轴,清除车
+            case 18:// 收起y轴,移动到旁边
+                index = (terminalIndex - 1) % 6 + 1;
                 diffY = roller.localScale.y - 1;
-                ArmMove(1, diffY, 28);
-                controller.GetComponent<controller>().DestroyCar(myCar);
+                ArmMove(1, diffY, 18);
+                // 移动机械手到旁边,锁条件由controller调度
+                if (index == 1)
+                {
+                    diffX = transform.position.x - (-1.5f);
+                    ArmMove(0, diffX, 28);
+                }else if(index == 6)
+                {
+                    diffX = transform.position.x - 24f;
+                    ArmMove(0, diffX, 28);
+                }
+                // 右边已锁住
+                else if (ctrlr.GetComponent<controller>().doorLock[index - 2] == 0 && ctrlr.GetComponent<controller>().doors[index - 2].GetComponent<doorBehavior>().close && !ctrlr.GetComponent<controller>().doors[index - 2].GetComponent<doorBehavior>().moving)
+                {
+                    diffX = transform.position.x - termX[index - 2];
+                    ArmMove(0, diffX, 28);
+                }
+                // 左边已锁住
+                else if (ctrlr.GetComponent<controller>().doorLock[index] == 0 && ctrlr.GetComponent<controller>().doors[index].GetComponent<doorBehavior>().close && !ctrlr.GetComponent<controller>().doors[index].GetComponent<doorBehavior>().moving)
+                {
+                    diffX = transform.position.x - termX[index];
+                    ArmMove(0, diffX, 28);
+                }
                 break;
-            case 28:// 恢复空闲,复位编号
-                terminalIndex = -1;
-                state = 0;
+            case 28:// 待车辆离开后清除车模,恢复空闲,复位编号
+                index = (terminalIndex - 1) % 6 + 1;
+                // 机械手取车开门
+                if (ctrlr.GetComponent<controller>().doorLock[index - 1] == 0 && ctrlr.GetComponent<controller>().doors[index - 1].GetComponent<doorBehavior>().close && !ctrlr.GetComponent<controller>().doors[index - 1].GetComponent<doorBehavior>().moving)
+                {
+                    ctrlr.GetComponent<controller>().doors[index - 1].GetComponent<doorBehavior>().close = false;
+                }
+                // 移动车模到车库外
+                if (myCar.transform.position.z > 8f)
+                {
+                    ctrlr.GetComponent<controller>().DestroyCar(myCar);
+                    terminalIndex = -1;
+                    state = 0;
+                }else if (myCar.transform.position.z > 2.6f || (!ctrlr.GetComponent<controller>().doors[index - 1].GetComponent<doorBehavior>().close ))
+                {
+                    myCar.transform.Translate(Vector3.forward * xSpeed * Time.deltaTime);
+                }
+                // 移动出去则关门
+                if(myCar.transform.position.z > 2.6f)
+                {
+                    ctrlr.GetComponent<controller>().doors[index - 1].GetComponent<doorBehavior>().close = true;
+                }
                 break;
 
             default: break;

+ 239 - 0
Assets/scanBoardBehavior.cs

@@ -0,0 +1,239 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class scanBoardBehavior : MonoBehaviour
+{
+    public GameObject ctrlr;
+    public GameObject arm;
+    public int targetTerm;
+    /// <summary>
+    /// 待controller清除
+    /// </summary>
+    public bool scanned;
+    public float speedX;
+    // 0空闲 1检查门状态加锁 2运动
+    public int state;
+    private static float[] termPosX = { -1.5f, 1.2f, 6.2f, 8.7f, 13.7f, 16.2f, 21.2f, 24f };
+
+    /// <summary>
+    /// 获取当前位置终端号,1-6
+    /// </summary>
+    /// <returns></returns>
+    public int GetPos()
+    {
+        float dist = 99;
+        int index = -1;
+        for (int i = 0; i < termPosX.Length; i++)
+        {
+            if(Mathf.Abs(transform.position.x - termPosX[i]) < dist)
+            {
+                dist = Mathf.Abs(transform.position.x - termPosX[i]);
+                index = i;
+            }
+        }
+        return index;
+    }
+
+    /// <summary>
+    ///  获取离扫描板最近终端编号0-5
+    /// </summary>
+    /// <returns></returns>
+    public int GetNearestTerm()
+    {
+        // 已靠边
+        if (transform.position.x < -1 || transform.position.x > 23)
+        {
+            return -1;
+        }
+        else
+        {
+            float diff = 99f;
+            int index = -1;
+            for (int i = 1; i < termPosX.Length-1; i++)
+            {
+                if (diff > Mathf.Abs(transform.position.x - termPosX[i]))
+                {
+                    diff = Mathf.Abs(transform.position.x - termPosX[i]);
+                    index = i;
+                }
+            }
+            return index-1;
+        }
+    }
+
+    public void BoardMove(float diff, int toState)
+    {
+        if (diff > 0)
+        {
+            for (int i = termPosX.Length - 2; i >= 1; i--)
+            {
+                // 找到其右边第一个终端
+                if (transform.position.x > termPosX[i])
+                {
+                    // 未上锁等待
+                    if (ctrlr.GetComponent<controller>().doorLock[i - 1] != 1)
+                    {
+                        Debug.Log("扫描板等待锁门");
+                        return;
+                    }
+                }
+            }
+            //diff = transform.position.x - termPosX[0];
+            transform.Translate(Vector3.left * speedX * Time.deltaTime);
+        }
+        else
+        {
+            for (int i = 1; i < termPosX.Length - 1; i++)
+            {
+                // 找到其左边第一个终端
+                if (transform.position.x < termPosX[i])
+                {
+                    // 未上锁等待
+                    if (ctrlr.GetComponent<controller>().doorLock[i - 1] != 1)
+                    {
+                        Debug.Log("扫描板等待锁门");
+                        return;
+                    }
+                }
+            }
+            //diff = transform.position.x - termPosX[termPosX.Length-1];
+            transform.Translate(Vector3.right * speedX * Time.deltaTime);
+        }
+        if (Mathf.Abs(diff) < speedX * 0.1f)
+        {
+            state = toState;
+
+        }
+    }
+
+    // Start is called before the first frame update
+    void Start()
+    {
+        targetTerm = -1;
+        speedX = 6f;
+        state = 0;
+        scanned = false;
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (ctrlr.GetComponent<controller>().doors.Length != 6)
+            return;
+        // 与机械手存在碰撞风险,暂停扫描工作,专心避让
+        if(arm.GetComponent<machineArmBehavior>().state == 11 || arm.GetComponent<machineArmBehavior>().state == 12 || arm.GetComponent<machineArmBehavior>().state == 13 || 
+            arm.GetComponent<machineArmBehavior>().state == 26 || arm.GetComponent<machineArmBehavior>().state == 17 || arm.GetComponent<machineArmBehavior>().state == 18)
+        {
+            if (Mathf.Abs(transform.position.x - arm.GetComponent<machineArmBehavior>().transform.position.x) < 4f)
+            {
+                int term = GetNearestTerm();
+                float diff = 0;
+                if (term != -1)
+                {
+                    // 往右
+                    diff = transform.position.x - termPosX[term];
+                }
+                BoardMove(diff, state);
+                return;
+            }
+        }
+        switch (state)
+        {
+            case 0:
+                if (targetTerm == -1)
+                {
+                    //if (Mathf.Abs(transform.position.x - termPosX[0]) < Mathf.Abs(transform.position.x - termPosX[termPosX.Length - 1]))
+                    //{
+                    //    //diff = transform.position.x - termPosX[0];
+                    //    //if (diff < speedX * 0.05f)
+                    //    //{
+                    //        transform.Translate(Vector3.left * speedX * Time.deltaTime);
+                    //    //}
+                    //}
+                    //else
+                    //{
+                    //    //diff = 
+                    //    transform.Translate(Vector3.right * speedX * Time.deltaTime);
+                    //}
+                }
+                else
+                {
+                    state = 1;
+                }
+                break;
+            case 1:
+                float diff = transform.position.x - termPosX[targetTerm];
+                int occupiedPlace = -1;
+                // 限定扫描范围
+                for (int i = 0; i < termPosX.Length; i++)
+                {
+                    if (diff > 0)
+                    {
+                        if (transform.position.x <= (termPosX[i] + 0.25f))
+                        {
+                            occupiedPlace = i; break;
+                        }
+                    }
+                    else
+                    {
+                        if (transform.position.x > (termPosX[i] - 0.25f))
+                        {
+                            occupiedPlace = i;
+                        }
+                    }
+                }
+                if (occupiedPlace < 1) occupiedPlace = 1;
+                if (occupiedPlace > 6) occupiedPlace = 6;
+                int targetClamp = targetTerm;
+                targetClamp = targetClamp < 1 ? 1 : targetClamp;
+                targetClamp = targetClamp > 6 ? 6 : targetClamp;
+                // 等待关门,门上锁,检查上锁情况
+                if (diff > 0)
+                {
+                    for (int i = targetClamp; i <= occupiedPlace; i++)
+                    {
+                        // 未关门,停止动作等待
+                        if (!ctrlr.GetComponent<controller>().doors[i - 1].GetComponent<doorBehavior>().close) return;
+                        //else if (ctrlr.GetComponent<controller>().doorLock[i - 1] == 0)
+                        //    ctrlr.GetComponent<controller>().doorLock[i - 1] = 1;
+                    }
+                    for (int i = targetClamp; i <= occupiedPlace; i++)
+                    {
+                        if (!ctrlr.GetComponent<controller>().doors[i - 1].GetComponent<doorBehavior>().close || !(ctrlr.GetComponent<controller>().doorLock[i - 1] == 1)) return;
+                    }
+                }
+                else
+                {
+                    for (int i = occupiedPlace; i <= targetClamp; i++)
+                    {
+                        // 未关门,停止动作等待
+                        if (!ctrlr.GetComponent<controller>().doors[i - 1].GetComponent<doorBehavior>().close) return;
+                        //else if (ctrlr.GetComponent<controller>().doorLock[i - 1] == 0)
+                        //    ctrlr.GetComponent<controller>().doorLock[i - 1] = 1;
+                    }
+                    for (int i = occupiedPlace; i <= targetClamp; i++)
+                    {
+                        if (!ctrlr.GetComponent<controller>().doors[i - 1].GetComponent<doorBehavior>().close || !(ctrlr.GetComponent<controller>().doorLock[i - 1] == 1)) return;
+                    }
+                }
+                // 等待机械手运动结束
+                int armState = arm.GetComponent<machineArmBehavior>().state;
+                if (armState == 0)
+                {
+                    state = 2;
+                }
+                break;
+            case 2:
+                diff = transform.position.x - termPosX[targetTerm];
+                BoardMove(diff,3);
+                break;
+            case 3:
+                targetTerm = -1;
+                state = 0;
+                scanned = true;
+                break;
+            default: break;
+        }
+    }
+}

+ 11 - 0
Assets/scanBoardBehavior.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2c5e39be8c32e7042997f8b83acf5b2a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 87 - 34
Assets/transferBehavior.cs

@@ -24,9 +24,10 @@ public class transferBehavior : MonoBehaviour
     public bool waitForElevator;
     public bool oneDirection;
 
-    private const float maxX = 21.0f;
-    private const float minX = -1.2f;
+    private const float maxX = 24f;
+    private const float minX = -2f;
     private bool currElevatorLeft;
+    private static float[] termPosX = { 1.2f, 6.2f, 8.7f, 13.7f, 16.2f, 21.2f };
 
     // Start is called before the first frame update
     void Start()
@@ -71,10 +72,58 @@ public class transferBehavior : MonoBehaviour
         return Mathf.RoundToInt((transform.position.x + 6.3f) * 14.0f / 35.0f) + 1;
     }
 
-    void TransferMove(int axis, float diff, int toState)
+    /// <summary>
+    ///  获取离中跑车最近终端编号0-5
+    /// </summary>
+    /// <returns></returns>
+    public int GetNearestTerm()
+    {
+        // 非二层
+        if (currPos.y > 5f)
+        {
+            return -1;
+        }
+        // 已靠边
+        if (currPos.x < -1 || currPos.x > 23)
+        {
+            return -1;
+        }
+        else
+        {
+            float diff = 99f;
+            int index = -1;
+            for (int i = 0; i < termPosX.Length; i++)
+            {
+                if(diff > Mathf.Abs(currPos.x - termPosX[i]))
+                {
+                    diff = Mathf.Abs(currPos.x - termPosX[i]);
+                    index = i;
+                }
+            }
+            return index;
+        }
+    }
+
+    public void TransferMove(int axis, float diff, int toState)
     {
         if (axis == 0)
         {
+            if (currPos.y < 5f)//2楼运动检查
+            {
+                for (int i = termPosX.Length - 1; i >= 0; i--)
+                {
+                    // 找到其右边第一个终端
+                    if (currPos.x > termPosX[i])
+                    {
+                        // 未上锁等待
+                        if (controller.GetComponent<controller>().doorLock[i] != 1)
+                        {
+                            Debug.Log("二楼中跑车等待锁门");
+                            return;
+                        }
+                    }
+                }
+            }
             if (Mathf.Abs(diff) < Time.deltaTime * 15)
             {
                 state = toState;
@@ -131,11 +180,11 @@ public class transferBehavior : MonoBehaviour
             case 1:// 运动到电梯
                 waitForElevator = true;
                 float diff = 0f;
-
-                if (currPos.x >= maxX - 0.5f && Mathf.Abs(left_elevator.GetComponent<elevatorBehavior>().GetFloor() - currPos.y) < Time.deltaTime * 25 && left_elevator.GetComponent<elevatorBehavior>().state == 0)
+                // 已经在左电梯上
+                if (currPos.x >= maxX - 0.5f && Mathf.Abs(left_elevator.GetComponent<elevatorBehavior>().GetFloor() - currPos.y) < 0.5f && left_elevator.GetComponent<elevatorBehavior>().state == 0)
                 {
                     currElevatorLeft = true;
-                    if (currPos.x < 25f)
+                    if (currPos.x < 27f)
                     {
                         transform.Translate(Vector3.right * xSpeed * Time.deltaTime);
                     }
@@ -145,7 +194,8 @@ public class transferBehavior : MonoBehaviour
                         state = 2;
                     }
                 }
-                else if (currPos.x < minX + 0.5f && Mathf.Abs(right_elevator.GetComponent<elevatorBehavior>().GetFloor() - currPos.y) < Time.deltaTime * 25 && left_elevator.GetComponent<elevatorBehavior>().state == 0)
+                // 已经在右电梯上
+                else if (currPos.x < minX + 0.5f && Mathf.Abs(right_elevator.GetComponent<elevatorBehavior>().GetFloor() - currPos.y) < 0.5f && left_elevator.GetComponent<elevatorBehavior>().state == 0)
                 {
                     currElevatorLeft = false;
                     if (currPos.x > -5f)
@@ -162,15 +212,18 @@ public class transferBehavior : MonoBehaviour
                 {
                     if (oneDirection)
                     {
-                        if (currPos.y < 4f)
+                        // 二楼,去右电梯
+                        if (currPos.y < 5f)
                         {
-                            diff = currPos.x - maxX;
+                            diff = currPos.x - minX;
                         }
+                        // 其他楼层, 去左电梯
                         else
                         {
-                            diff = currPos.x - minX;
+                            diff = currPos.x - maxX;
                         }
                     }
+                    // 否则就近找电梯
                     else
                     {
                         if (Mathf.Abs(currPos.x - maxX) > Mathf.Abs(currPos.x - minX))
@@ -186,7 +239,7 @@ public class transferBehavior : MonoBehaviour
                 }
                 break;
             case 2: // 跟随电梯运行
-                if (Mathf.Abs(currPos.y - (targetFloor - 1) * 3.0f-0.1f) > 0.5f)
+                if (Mathf.Abs(currPos.y - (targetFloor - 1) * 3.0f - 0.1f) > 0.5f)
                 {
                     GetComponent<Transform>().position = new Vector3(currPos.x, (currElevatorLeft ? left_elevator : right_elevator).GetComponent<Transform>().position.y + 0.15f, currPos.z);
                 }
@@ -194,27 +247,27 @@ public class transferBehavior : MonoBehaviour
                 {
                     if (currElevatorLeft)
                     {
-                        if (currPos.x > 20.5)
-                        {
-                            transform.Translate(Vector3.left * xSpeed * Time.deltaTime);
-                        }
-                        else
-                        {
-                            transform.position = new Vector3(currPos.x, (targetFloor-1)*3.0f, currPos.z);
-                            state = 3;
-                        }
+                        //if (currPos.x > maxX)
+                        //{
+                        //    transform.Translate(Vector3.left * xSpeed * Time.deltaTime);
+                        //}
+                        //else
+                        //{
+                        transform.position = new Vector3(currPos.x, (targetFloor - 1) * 3.0f, currPos.z);
+                        state = 3;
+                        //}
                     }
                     else
                     {
-                        if (currPos.x < -1.2f)
-                        {
-                            transform.Translate(Vector3.right * xSpeed * Time.deltaTime);
-                        }
-                        else
-                        {
-                            transform.position = new Vector3(currPos.x, (targetFloor - 1) * 3.0f, currPos.z);
-                            state = 3;
-                        }
+                        //if (currPos.x < minX)
+                        //{
+                        //    transform.Translate(Vector3.right * xSpeed * Time.deltaTime);
+                        //}
+                        //else
+                        //{
+                        transform.position = new Vector3(currPos.x, (targetFloor - 1) * 3.0f, currPos.z);
+                        state = 3;
+                        //}
                     }
                 }
                 break;
@@ -222,7 +275,7 @@ public class transferBehavior : MonoBehaviour
                 int armState = machineArm.GetComponent<machineArmBehavior>().state;
                 float armX = machineArm.GetComponent<Transform>().position.x;
                 float myFloor = currPos.y / 3.0f + 1;
-                
+
                 if (armState == 0 || (armState != 12 && armState != 22 && armState != 13 && armState != 160 && armState != 17 && armState != 27 && armState != 18))
                 {
                     // 判断运行楼层,5层以上和2层不与机械手上部分冲突
@@ -230,19 +283,19 @@ public class transferBehavior : MonoBehaviour
                     {
                         //Debug.Log(myFloor);
                         float target = (targetX - 1) * 35.0f / 14.0f - 6.3f;
-                        if (targetX > 3 && targetX < 13)
+                        if (targetX > 2 && targetX < 14)
                         {
                             diff = currPos.x - target;
                             TransferMove(0, diff, 4);
                             //Debug.Log(diff);
                         }
                         //等电梯
-                        else if (targetX <= 3 && right_elevator.GetComponent<elevatorBehavior>().state == 0 && Mathf.Abs(right_elevator.GetComponent<Transform>().position.y - currPos.y) < 0.25f)
+                        else if (targetX <= 2 && right_elevator.GetComponent<elevatorBehavior>().state == 0 && Mathf.Abs(right_elevator.GetComponent<Transform>().position.y - currPos.y) < 0.25f)
                         {
                             diff = currPos.x - target;
                             TransferMove(0, diff, 4);
                         }
-                        else if (targetX >= 13 && left_elevator.GetComponent<elevatorBehavior>().state == 0 && Mathf.Abs(left_elevator.GetComponent<Transform>().position.y - currPos.y) < 0.25f)
+                        else if (targetX >= 14 && left_elevator.GetComponent<elevatorBehavior>().state == 0 && Mathf.Abs(left_elevator.GetComponent<Transform>().position.y - currPos.y) < 0.25f)
                         {
                             diff = currPos.x - target;
                             TransferMove(0, diff, 4);
@@ -318,7 +371,7 @@ public class transferBehavior : MonoBehaviour
                 {
                     // 加入车库
                     //Debug.Log(load);
-                    controller.GetComponent<controller>().AddToGarage(load,targetFloor,targetX);
+                    controller.GetComponent<controller>().AddToGarage(load, targetFloor, targetX);
                     load = null;
                 }
                 else if (cmd == 3)

+ 1 - 0
ProjectSettings/TagManager.asset

@@ -5,6 +5,7 @@ TagManager:
   serializedVersion: 2
   tags:
   - transfer
+  - door
   layers:
   - Default
   - TransparentFX