├── .gitignore ├── Assets ├── SampleScene.unity ├── SampleScene.unity.meta ├── udptest.cs └── udptest.cs.meta ├── LICENSE.txt ├── Packages └── manifest.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset └── XRSettings.asset ├── README.md └── udptest.ino /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Asset meta data should only be ignored when the corresponding asset is also ignored 18 | !/[Aa]ssets/**/*.meta 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.unitypackage 61 | 62 | # Crashlytics generated file 63 | crashlytics-build.properties 64 | 65 | -------------------------------------------------------------------------------- /Assets/SampleScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 705507994} 41 | m_IndirectSpecularColor: {r: 0.44784945, g: 0.49783915, b: 0.5754529, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 11 47 | m_GIWorkflowMode: 0 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_UseShadowmask: 1 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | debug: 122 | m_Flags: 0 123 | m_NavMeshData: {fileID: 0} 124 | --- !u!1 &187181135 125 | GameObject: 126 | m_ObjectHideFlags: 0 127 | m_CorrespondingSourceObject: {fileID: 0} 128 | m_PrefabInstance: {fileID: 0} 129 | m_PrefabAsset: {fileID: 0} 130 | serializedVersion: 6 131 | m_Component: 132 | - component: {fileID: 187181136} 133 | - component: {fileID: 187181139} 134 | - component: {fileID: 187181138} 135 | - component: {fileID: 187181137} 136 | m_Layer: 5 137 | m_Name: Button 138 | m_TagString: Untagged 139 | m_Icon: {fileID: 0} 140 | m_NavMeshLayer: 0 141 | m_StaticEditorFlags: 0 142 | m_IsActive: 1 143 | --- !u!224 &187181136 144 | RectTransform: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 187181135} 150 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 151 | m_LocalPosition: {x: 0, y: 0, z: 0} 152 | m_LocalScale: {x: 1, y: 1, z: 1} 153 | m_Children: 154 | - {fileID: 1724185871} 155 | m_Father: {fileID: 2029834809} 156 | m_RootOrder: 1 157 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 158 | m_AnchorMin: {x: 0.5, y: 0.5} 159 | m_AnchorMax: {x: 0.5, y: 0.5} 160 | m_AnchoredPosition: {x: -4.5282288, y: -3.1419525} 161 | m_SizeDelta: {x: 160, y: 30} 162 | m_Pivot: {x: 0.5, y: 0.5} 163 | --- !u!114 &187181137 164 | MonoBehaviour: 165 | m_ObjectHideFlags: 0 166 | m_CorrespondingSourceObject: {fileID: 0} 167 | m_PrefabInstance: {fileID: 0} 168 | m_PrefabAsset: {fileID: 0} 169 | m_GameObject: {fileID: 187181135} 170 | m_Enabled: 1 171 | m_EditorHideFlags: 0 172 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 173 | m_Name: 174 | m_EditorClassIdentifier: 175 | m_Navigation: 176 | m_Mode: 3 177 | m_SelectOnUp: {fileID: 0} 178 | m_SelectOnDown: {fileID: 0} 179 | m_SelectOnLeft: {fileID: 0} 180 | m_SelectOnRight: {fileID: 0} 181 | m_Transition: 1 182 | m_Colors: 183 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 184 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 185 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 186 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 187 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 188 | m_ColorMultiplier: 1 189 | m_FadeDuration: 0.1 190 | m_SpriteState: 191 | m_HighlightedSprite: {fileID: 0} 192 | m_PressedSprite: {fileID: 0} 193 | m_SelectedSprite: {fileID: 0} 194 | m_DisabledSprite: {fileID: 0} 195 | m_AnimationTriggers: 196 | m_NormalTrigger: Normal 197 | m_HighlightedTrigger: Highlighted 198 | m_PressedTrigger: Pressed 199 | m_SelectedTrigger: Selected 200 | m_DisabledTrigger: Disabled 201 | m_Interactable: 1 202 | m_TargetGraphic: {fileID: 187181138} 203 | m_OnClick: 204 | m_PersistentCalls: 205 | m_Calls: 206 | - m_Target: {fileID: 1548856026} 207 | m_MethodName: senddataUDP 208 | m_Mode: 1 209 | m_Arguments: 210 | m_ObjectArgument: {fileID: 0} 211 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 212 | m_IntArgument: 0 213 | m_FloatArgument: 0 214 | m_StringArgument: 215 | m_BoolArgument: 0 216 | m_CallState: 2 217 | --- !u!114 &187181138 218 | MonoBehaviour: 219 | m_ObjectHideFlags: 0 220 | m_CorrespondingSourceObject: {fileID: 0} 221 | m_PrefabInstance: {fileID: 0} 222 | m_PrefabAsset: {fileID: 0} 223 | m_GameObject: {fileID: 187181135} 224 | m_Enabled: 1 225 | m_EditorHideFlags: 0 226 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 227 | m_Name: 228 | m_EditorClassIdentifier: 229 | m_Material: {fileID: 0} 230 | m_Color: {r: 1, g: 1, b: 1, a: 1} 231 | m_RaycastTarget: 1 232 | m_OnCullStateChanged: 233 | m_PersistentCalls: 234 | m_Calls: [] 235 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 236 | m_Type: 1 237 | m_PreserveAspect: 0 238 | m_FillCenter: 1 239 | m_FillMethod: 4 240 | m_FillAmount: 1 241 | m_FillClockwise: 1 242 | m_FillOrigin: 0 243 | m_UseSpriteMesh: 0 244 | m_PixelsPerUnitMultiplier: 1 245 | --- !u!222 &187181139 246 | CanvasRenderer: 247 | m_ObjectHideFlags: 0 248 | m_CorrespondingSourceObject: {fileID: 0} 249 | m_PrefabInstance: {fileID: 0} 250 | m_PrefabAsset: {fileID: 0} 251 | m_GameObject: {fileID: 187181135} 252 | m_CullTransparentMesh: 0 253 | --- !u!1 &705507993 254 | GameObject: 255 | m_ObjectHideFlags: 0 256 | m_CorrespondingSourceObject: {fileID: 0} 257 | m_PrefabInstance: {fileID: 0} 258 | m_PrefabAsset: {fileID: 0} 259 | serializedVersion: 6 260 | m_Component: 261 | - component: {fileID: 705507995} 262 | - component: {fileID: 705507994} 263 | m_Layer: 0 264 | m_Name: Directional Light 265 | m_TagString: Untagged 266 | m_Icon: {fileID: 0} 267 | m_NavMeshLayer: 0 268 | m_StaticEditorFlags: 0 269 | m_IsActive: 1 270 | --- !u!108 &705507994 271 | Light: 272 | m_ObjectHideFlags: 0 273 | m_CorrespondingSourceObject: {fileID: 0} 274 | m_PrefabInstance: {fileID: 0} 275 | m_PrefabAsset: {fileID: 0} 276 | m_GameObject: {fileID: 705507993} 277 | m_Enabled: 1 278 | serializedVersion: 10 279 | m_Type: 1 280 | m_Shape: 0 281 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 282 | m_Intensity: 1 283 | m_Range: 10 284 | m_SpotAngle: 30 285 | m_InnerSpotAngle: 21.80208 286 | m_CookieSize: 10 287 | m_Shadows: 288 | m_Type: 2 289 | m_Resolution: -1 290 | m_CustomResolution: -1 291 | m_Strength: 1 292 | m_Bias: 0.05 293 | m_NormalBias: 0.4 294 | m_NearPlane: 0.2 295 | m_CullingMatrixOverride: 296 | e00: 1 297 | e01: 0 298 | e02: 0 299 | e03: 0 300 | e10: 0 301 | e11: 1 302 | e12: 0 303 | e13: 0 304 | e20: 0 305 | e21: 0 306 | e22: 1 307 | e23: 0 308 | e30: 0 309 | e31: 0 310 | e32: 0 311 | e33: 1 312 | m_UseCullingMatrixOverride: 0 313 | m_Cookie: {fileID: 0} 314 | m_DrawHalo: 0 315 | m_Flare: {fileID: 0} 316 | m_RenderMode: 0 317 | m_CullingMask: 318 | serializedVersion: 2 319 | m_Bits: 4294967295 320 | m_RenderingLayerMask: 1 321 | m_Lightmapping: 1 322 | m_LightShadowCasterMode: 0 323 | m_AreaSize: {x: 1, y: 1} 324 | m_BounceIntensity: 1 325 | m_ColorTemperature: 6570 326 | m_UseColorTemperature: 0 327 | m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 2.1e-44} 328 | m_UseBoundingSphereOverride: 0 329 | m_ShadowRadius: 0 330 | m_ShadowAngle: 0 331 | --- !u!4 &705507995 332 | Transform: 333 | m_ObjectHideFlags: 0 334 | m_CorrespondingSourceObject: {fileID: 0} 335 | m_PrefabInstance: {fileID: 0} 336 | m_PrefabAsset: {fileID: 0} 337 | m_GameObject: {fileID: 705507993} 338 | m_LocalRotation: {x: 0.46983144, y: -0.030384537, z: 0.48442125, w: 0.73734075} 339 | m_LocalPosition: {x: 1.91, y: 3, z: 0} 340 | m_LocalScale: {x: 1, y: 1, z: 1} 341 | m_Children: [] 342 | m_Father: {fileID: 0} 343 | m_RootOrder: 1 344 | m_LocalEulerAnglesHint: {x: 46.244003, y: 36.398003, z: 82.590004} 345 | --- !u!1 &855806167 346 | GameObject: 347 | m_ObjectHideFlags: 0 348 | m_CorrespondingSourceObject: {fileID: 0} 349 | m_PrefabInstance: {fileID: 0} 350 | m_PrefabAsset: {fileID: 0} 351 | serializedVersion: 6 352 | m_Component: 353 | - component: {fileID: 855806168} 354 | - component: {fileID: 855806170} 355 | - component: {fileID: 855806169} 356 | m_Layer: 5 357 | m_Name: Text 358 | m_TagString: Untagged 359 | m_Icon: {fileID: 0} 360 | m_NavMeshLayer: 0 361 | m_StaticEditorFlags: 0 362 | m_IsActive: 1 363 | --- !u!224 &855806168 364 | RectTransform: 365 | m_ObjectHideFlags: 0 366 | m_CorrespondingSourceObject: {fileID: 0} 367 | m_PrefabInstance: {fileID: 0} 368 | m_PrefabAsset: {fileID: 0} 369 | m_GameObject: {fileID: 855806167} 370 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 371 | m_LocalPosition: {x: 0, y: 0, z: 0} 372 | m_LocalScale: {x: 1, y: 1, z: 1} 373 | m_Children: [] 374 | m_Father: {fileID: 2029834809} 375 | m_RootOrder: 0 376 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 377 | m_AnchorMin: {x: 0.5, y: 0.5} 378 | m_AnchorMax: {x: 0.5, y: 0.5} 379 | m_AnchoredPosition: {x: -184.9, y: -17.5} 380 | m_SizeDelta: {x: 399.38, y: 300} 381 | m_Pivot: {x: 0.5, y: 0.5} 382 | --- !u!114 &855806169 383 | MonoBehaviour: 384 | m_ObjectHideFlags: 0 385 | m_CorrespondingSourceObject: {fileID: 0} 386 | m_PrefabInstance: {fileID: 0} 387 | m_PrefabAsset: {fileID: 0} 388 | m_GameObject: {fileID: 855806167} 389 | m_Enabled: 1 390 | m_EditorHideFlags: 0 391 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 392 | m_Name: 393 | m_EditorClassIdentifier: 394 | m_Material: {fileID: 0} 395 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 396 | m_RaycastTarget: 1 397 | m_OnCullStateChanged: 398 | m_PersistentCalls: 399 | m_Calls: [] 400 | m_FontData: 401 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 402 | m_FontSize: 37 403 | m_FontStyle: 0 404 | m_BestFit: 0 405 | m_MinSize: 10 406 | m_MaxSize: 46 407 | m_Alignment: 0 408 | m_AlignByGeometry: 0 409 | m_RichText: 1 410 | m_HorizontalOverflow: 0 411 | m_VerticalOverflow: 0 412 | m_LineSpacing: 1 413 | m_Text: 'Play to start 414 | 415 | data -> check Console window.' 416 | --- !u!222 &855806170 417 | CanvasRenderer: 418 | m_ObjectHideFlags: 0 419 | m_CorrespondingSourceObject: {fileID: 0} 420 | m_PrefabInstance: {fileID: 0} 421 | m_PrefabAsset: {fileID: 0} 422 | m_GameObject: {fileID: 855806167} 423 | m_CullTransparentMesh: 0 424 | --- !u!1 &963194225 425 | GameObject: 426 | m_ObjectHideFlags: 0 427 | m_CorrespondingSourceObject: {fileID: 0} 428 | m_PrefabInstance: {fileID: 0} 429 | m_PrefabAsset: {fileID: 0} 430 | serializedVersion: 6 431 | m_Component: 432 | - component: {fileID: 963194228} 433 | - component: {fileID: 963194227} 434 | - component: {fileID: 963194226} 435 | m_Layer: 0 436 | m_Name: Main Camera 437 | m_TagString: MainCamera 438 | m_Icon: {fileID: 0} 439 | m_NavMeshLayer: 0 440 | m_StaticEditorFlags: 0 441 | m_IsActive: 1 442 | --- !u!81 &963194226 443 | AudioListener: 444 | m_ObjectHideFlags: 0 445 | m_CorrespondingSourceObject: {fileID: 0} 446 | m_PrefabInstance: {fileID: 0} 447 | m_PrefabAsset: {fileID: 0} 448 | m_GameObject: {fileID: 963194225} 449 | m_Enabled: 1 450 | --- !u!20 &963194227 451 | Camera: 452 | m_ObjectHideFlags: 0 453 | m_CorrespondingSourceObject: {fileID: 0} 454 | m_PrefabInstance: {fileID: 0} 455 | m_PrefabAsset: {fileID: 0} 456 | m_GameObject: {fileID: 963194225} 457 | m_Enabled: 1 458 | serializedVersion: 2 459 | m_ClearFlags: 1 460 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 461 | m_projectionMatrixMode: 1 462 | m_GateFitMode: 2 463 | m_FOVAxisMode: 0 464 | m_SensorSize: {x: 36, y: 24} 465 | m_LensShift: {x: 0, y: 0} 466 | m_FocalLength: 50 467 | m_NormalizedViewPortRect: 468 | serializedVersion: 2 469 | x: 0 470 | y: 0 471 | width: 1 472 | height: 1 473 | near clip plane: 0.3 474 | far clip plane: 1000 475 | field of view: 60 476 | orthographic: 0 477 | orthographic size: 5 478 | m_Depth: -1 479 | m_CullingMask: 480 | serializedVersion: 2 481 | m_Bits: 4294967295 482 | m_RenderingPath: -1 483 | m_TargetTexture: {fileID: 0} 484 | m_TargetDisplay: 0 485 | m_TargetEye: 3 486 | m_HDR: 1 487 | m_AllowMSAA: 1 488 | m_AllowDynamicResolution: 0 489 | m_ForceIntoRT: 0 490 | m_OcclusionCulling: 1 491 | m_StereoConvergence: 10 492 | m_StereoSeparation: 0.022 493 | --- !u!4 &963194228 494 | Transform: 495 | m_ObjectHideFlags: 0 496 | m_CorrespondingSourceObject: {fileID: 0} 497 | m_PrefabInstance: {fileID: 0} 498 | m_PrefabAsset: {fileID: 0} 499 | m_GameObject: {fileID: 963194225} 500 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 501 | m_LocalPosition: {x: 0, y: 1, z: -10} 502 | m_LocalScale: {x: 1, y: 1, z: 1} 503 | m_Children: [] 504 | m_Father: {fileID: 0} 505 | m_RootOrder: 0 506 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 507 | --- !u!1 &1548856025 508 | GameObject: 509 | m_ObjectHideFlags: 0 510 | m_CorrespondingSourceObject: {fileID: 0} 511 | m_PrefabInstance: {fileID: 0} 512 | m_PrefabAsset: {fileID: 0} 513 | serializedVersion: 6 514 | m_Component: 515 | - component: {fileID: 1548856027} 516 | - component: {fileID: 1548856026} 517 | m_Layer: 0 518 | m_Name: UDPcontrol 519 | m_TagString: Untagged 520 | m_Icon: {fileID: 0} 521 | m_NavMeshLayer: 0 522 | m_StaticEditorFlags: 0 523 | m_IsActive: 1 524 | --- !u!114 &1548856026 525 | MonoBehaviour: 526 | m_ObjectHideFlags: 0 527 | m_CorrespondingSourceObject: {fileID: 0} 528 | m_PrefabInstance: {fileID: 0} 529 | m_PrefabAsset: {fileID: 0} 530 | m_GameObject: {fileID: 1548856025} 531 | m_Enabled: 1 532 | m_EditorHideFlags: 0 533 | m_Script: {fileID: 11500000, guid: ee18cbded885e1e439f41f96f1a260ca, type: 3} 534 | m_Name: 535 | m_EditorClassIdentifier: 536 | --- !u!4 &1548856027 537 | Transform: 538 | m_ObjectHideFlags: 0 539 | m_CorrespondingSourceObject: {fileID: 0} 540 | m_PrefabInstance: {fileID: 0} 541 | m_PrefabAsset: {fileID: 0} 542 | m_GameObject: {fileID: 1548856025} 543 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 544 | m_LocalPosition: {x: 404.5, y: 7, z: 0} 545 | m_LocalScale: {x: 1, y: 1, z: 1} 546 | m_Children: [] 547 | m_Father: {fileID: 0} 548 | m_RootOrder: 4 549 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 550 | --- !u!1 &1596735649 551 | GameObject: 552 | m_ObjectHideFlags: 0 553 | m_CorrespondingSourceObject: {fileID: 0} 554 | m_PrefabInstance: {fileID: 0} 555 | m_PrefabAsset: {fileID: 0} 556 | serializedVersion: 6 557 | m_Component: 558 | - component: {fileID: 1596735652} 559 | - component: {fileID: 1596735651} 560 | - component: {fileID: 1596735650} 561 | m_Layer: 0 562 | m_Name: EventSystem 563 | m_TagString: Untagged 564 | m_Icon: {fileID: 0} 565 | m_NavMeshLayer: 0 566 | m_StaticEditorFlags: 0 567 | m_IsActive: 1 568 | --- !u!114 &1596735650 569 | MonoBehaviour: 570 | m_ObjectHideFlags: 0 571 | m_CorrespondingSourceObject: {fileID: 0} 572 | m_PrefabInstance: {fileID: 0} 573 | m_PrefabAsset: {fileID: 0} 574 | m_GameObject: {fileID: 1596735649} 575 | m_Enabled: 1 576 | m_EditorHideFlags: 0 577 | m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} 578 | m_Name: 579 | m_EditorClassIdentifier: 580 | m_HorizontalAxis: Horizontal 581 | m_VerticalAxis: Vertical 582 | m_SubmitButton: Submit 583 | m_CancelButton: Cancel 584 | m_InputActionsPerSecond: 10 585 | m_RepeatDelay: 0.5 586 | m_ForceModuleActive: 0 587 | --- !u!114 &1596735651 588 | MonoBehaviour: 589 | m_ObjectHideFlags: 0 590 | m_CorrespondingSourceObject: {fileID: 0} 591 | m_PrefabInstance: {fileID: 0} 592 | m_PrefabAsset: {fileID: 0} 593 | m_GameObject: {fileID: 1596735649} 594 | m_Enabled: 1 595 | m_EditorHideFlags: 0 596 | m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} 597 | m_Name: 598 | m_EditorClassIdentifier: 599 | m_FirstSelected: {fileID: 0} 600 | m_sendNavigationEvents: 1 601 | m_DragThreshold: 10 602 | --- !u!4 &1596735652 603 | Transform: 604 | m_ObjectHideFlags: 0 605 | m_CorrespondingSourceObject: {fileID: 0} 606 | m_PrefabInstance: {fileID: 0} 607 | m_PrefabAsset: {fileID: 0} 608 | m_GameObject: {fileID: 1596735649} 609 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 610 | m_LocalPosition: {x: 0, y: 0, z: 0} 611 | m_LocalScale: {x: 1, y: 1, z: 1} 612 | m_Children: [] 613 | m_Father: {fileID: 0} 614 | m_RootOrder: 3 615 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 616 | --- !u!1 &1724185870 617 | GameObject: 618 | m_ObjectHideFlags: 0 619 | m_CorrespondingSourceObject: {fileID: 0} 620 | m_PrefabInstance: {fileID: 0} 621 | m_PrefabAsset: {fileID: 0} 622 | serializedVersion: 6 623 | m_Component: 624 | - component: {fileID: 1724185871} 625 | - component: {fileID: 1724185873} 626 | - component: {fileID: 1724185872} 627 | m_Layer: 5 628 | m_Name: Text 629 | m_TagString: Untagged 630 | m_Icon: {fileID: 0} 631 | m_NavMeshLayer: 0 632 | m_StaticEditorFlags: 0 633 | m_IsActive: 1 634 | --- !u!224 &1724185871 635 | RectTransform: 636 | m_ObjectHideFlags: 0 637 | m_CorrespondingSourceObject: {fileID: 0} 638 | m_PrefabInstance: {fileID: 0} 639 | m_PrefabAsset: {fileID: 0} 640 | m_GameObject: {fileID: 1724185870} 641 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 642 | m_LocalPosition: {x: 0, y: 0, z: 0} 643 | m_LocalScale: {x: 1, y: 1, z: 1} 644 | m_Children: [] 645 | m_Father: {fileID: 187181136} 646 | m_RootOrder: 0 647 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 648 | m_AnchorMin: {x: 0, y: 0} 649 | m_AnchorMax: {x: 1, y: 1} 650 | m_AnchoredPosition: {x: 0, y: 0} 651 | m_SizeDelta: {x: 0, y: 0} 652 | m_Pivot: {x: 0.5, y: 0.5} 653 | --- !u!114 &1724185872 654 | MonoBehaviour: 655 | m_ObjectHideFlags: 0 656 | m_CorrespondingSourceObject: {fileID: 0} 657 | m_PrefabInstance: {fileID: 0} 658 | m_PrefabAsset: {fileID: 0} 659 | m_GameObject: {fileID: 1724185870} 660 | m_Enabled: 1 661 | m_EditorHideFlags: 0 662 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 663 | m_Name: 664 | m_EditorClassIdentifier: 665 | m_Material: {fileID: 0} 666 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 667 | m_RaycastTarget: 1 668 | m_OnCullStateChanged: 669 | m_PersistentCalls: 670 | m_Calls: [] 671 | m_FontData: 672 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 673 | m_FontSize: 14 674 | m_FontStyle: 0 675 | m_BestFit: 0 676 | m_MinSize: 10 677 | m_MaxSize: 40 678 | m_Alignment: 4 679 | m_AlignByGeometry: 0 680 | m_RichText: 1 681 | m_HorizontalOverflow: 0 682 | m_VerticalOverflow: 0 683 | m_LineSpacing: 1 684 | m_Text: Send test 685 | --- !u!222 &1724185873 686 | CanvasRenderer: 687 | m_ObjectHideFlags: 0 688 | m_CorrespondingSourceObject: {fileID: 0} 689 | m_PrefabInstance: {fileID: 0} 690 | m_PrefabAsset: {fileID: 0} 691 | m_GameObject: {fileID: 1724185870} 692 | m_CullTransparentMesh: 0 693 | --- !u!1 &2029834805 694 | GameObject: 695 | m_ObjectHideFlags: 0 696 | m_CorrespondingSourceObject: {fileID: 0} 697 | m_PrefabInstance: {fileID: 0} 698 | m_PrefabAsset: {fileID: 0} 699 | serializedVersion: 6 700 | m_Component: 701 | - component: {fileID: 2029834809} 702 | - component: {fileID: 2029834808} 703 | - component: {fileID: 2029834807} 704 | - component: {fileID: 2029834806} 705 | m_Layer: 5 706 | m_Name: Canvas 707 | m_TagString: Untagged 708 | m_Icon: {fileID: 0} 709 | m_NavMeshLayer: 0 710 | m_StaticEditorFlags: 0 711 | m_IsActive: 1 712 | --- !u!114 &2029834806 713 | MonoBehaviour: 714 | m_ObjectHideFlags: 0 715 | m_CorrespondingSourceObject: {fileID: 0} 716 | m_PrefabInstance: {fileID: 0} 717 | m_PrefabAsset: {fileID: 0} 718 | m_GameObject: {fileID: 2029834805} 719 | m_Enabled: 1 720 | m_EditorHideFlags: 0 721 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 722 | m_Name: 723 | m_EditorClassIdentifier: 724 | m_IgnoreReversedGraphics: 1 725 | m_BlockingObjects: 0 726 | m_BlockingMask: 727 | serializedVersion: 2 728 | m_Bits: 4294967295 729 | --- !u!114 &2029834807 730 | MonoBehaviour: 731 | m_ObjectHideFlags: 0 732 | m_CorrespondingSourceObject: {fileID: 0} 733 | m_PrefabInstance: {fileID: 0} 734 | m_PrefabAsset: {fileID: 0} 735 | m_GameObject: {fileID: 2029834805} 736 | m_Enabled: 1 737 | m_EditorHideFlags: 0 738 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 739 | m_Name: 740 | m_EditorClassIdentifier: 741 | m_UiScaleMode: 0 742 | m_ReferencePixelsPerUnit: 100 743 | m_ScaleFactor: 1 744 | m_ReferenceResolution: {x: 800, y: 600} 745 | m_ScreenMatchMode: 0 746 | m_MatchWidthOrHeight: 0 747 | m_PhysicalUnit: 3 748 | m_FallbackScreenDPI: 96 749 | m_DefaultSpriteDPI: 96 750 | m_DynamicPixelsPerUnit: 1 751 | --- !u!223 &2029834808 752 | Canvas: 753 | m_ObjectHideFlags: 0 754 | m_CorrespondingSourceObject: {fileID: 0} 755 | m_PrefabInstance: {fileID: 0} 756 | m_PrefabAsset: {fileID: 0} 757 | m_GameObject: {fileID: 2029834805} 758 | m_Enabled: 1 759 | serializedVersion: 3 760 | m_RenderMode: 0 761 | m_Camera: {fileID: 0} 762 | m_PlaneDistance: 100 763 | m_PixelPerfect: 0 764 | m_ReceivesEvents: 1 765 | m_OverrideSorting: 0 766 | m_OverridePixelPerfect: 0 767 | m_SortingBucketNormalizedSize: 0 768 | m_AdditionalShaderChannelsFlag: 0 769 | m_SortingLayerID: 0 770 | m_SortingOrder: 0 771 | m_TargetDisplay: 0 772 | --- !u!224 &2029834809 773 | RectTransform: 774 | m_ObjectHideFlags: 0 775 | m_CorrespondingSourceObject: {fileID: 0} 776 | m_PrefabInstance: {fileID: 0} 777 | m_PrefabAsset: {fileID: 0} 778 | m_GameObject: {fileID: 2029834805} 779 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 780 | m_LocalPosition: {x: 0, y: 0, z: 0} 781 | m_LocalScale: {x: 0, y: 0, z: 0} 782 | m_Children: 783 | - {fileID: 855806168} 784 | - {fileID: 187181136} 785 | m_Father: {fileID: 0} 786 | m_RootOrder: 2 787 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 788 | m_AnchorMin: {x: 0, y: 0} 789 | m_AnchorMax: {x: 0, y: 0} 790 | m_AnchoredPosition: {x: 0, y: 0} 791 | m_SizeDelta: {x: 0, y: 0} 792 | m_Pivot: {x: 0, y: 0} 793 | -------------------------------------------------------------------------------- /Assets/SampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/udptest.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Net; 5 | using System.Net.Sockets; 6 | using System.Text; 7 | using System.Threading; 8 | using System; 9 | using UnityEngine.Experimental.GlobalIllumination; 10 | 11 | //Unity でUDP通信受信 12 | //https://qiita.com/nenjiru/items/8fa8dfb27f55c0205651 13 | 14 | //パケット構造作ってる 15 | //https://younaship.com/2018/12/31/unity%E4%B8%8A%E3%81%A7websocket%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E9%80%9A%E4%BF%A1%E6%A9%9F%E8%83%BD%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AC%E3%82%A4%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99/ 16 | 17 | //タイムアウトについて 18 | //https://teratail.com/questions/56000 19 | 20 | public class udptest : MonoBehaviour 21 | { 22 | int LOCAL_PORT = 22222; 23 | static UdpClient udp; 24 | static UdpClient udp_send; 25 | 26 | Thread thread; 27 | 28 | const int datanum = 9; 29 | static float[] f_buf = new float[datanum]; 30 | static Int32[] i_buf = new Int32[datanum]; 31 | 32 | 33 | string host = "192.168.0.62"; 34 | int port = 22224; 35 | 36 | // Start is called before the first frame update 37 | void Start() 38 | { 39 | udp = new UdpClient(LOCAL_PORT); 40 | udp_send = new UdpClient(); 41 | udp.Client.ReceiveTimeout = 0; //0にしてみたら通信できたけど、タイムアウト0= 42 | udp_send.Connect(host, port); 43 | thread = new Thread(new ThreadStart(ThreadMethod)); 44 | thread.Start(); 45 | } 46 | 47 | // Update is called once per frame 48 | void Update() 49 | { 50 | //アクセス例 51 | //Debug.Log(i_buf[1].ToString()); 52 | //Debug.Log(f_buf[2].ToString()); 53 | } 54 | void OnApplicationQuit() 55 | { 56 | udp_send.Close(); 57 | thread.Abort(); 58 | } 59 | 60 | private static void ThreadMethod() 61 | { 62 | String test; 63 | 64 | while (true) 65 | { 66 | IPEndPoint remoteEP = null; 67 | byte[] data = udp.Receive(ref remoteEP); 68 | //Debug.Log(data.Length.ToString()); 69 | 70 | //パケットサイズが正しければ処理開始 71 | if (data.Length == datanum * 4 ) // float または Int32 のサイズとして 4 72 | { 73 | test = ""; 74 | 75 | for (int a = 0; a と、setup() 内の M5.begin() を有効にしてください。) 34 | 35 | 2. Arduino IDE 上で、コード内最初のWiFIアクセスポイントの SSID, pass、そして送り先PCのIPアドレス の3か所を各環境に合わせ入力し、書き込んでください。wifi接続されます。 36 | 37 |  (SSID はアクセスポイントの名前、送り先IPアドレスは、win 10 ならスタート→ 入力「cmd」 → 「Enter」 → 入力「ipconfig /all」 → 使ってるネットワークのアドレスを調べる(イーサネットやワイヤレスネットワークの IP v4 アドレス。192.168.0.10 等) virtualネットワーク等色々ありますので間違えないよう) ) 38 | 39 | 3. Unity でこのリポジトリをダウンロードし開きます。SampleScene シーンを開きます。 40 |  udptest.cs 最初の方の相手IPアドレス(ESP32)を入力します。(ESP32が正しくWiFI につながれば、Arduino IDE シリアルモニタ上で最初に表示されるはずです。見逃したらリセットボタンでも押してみてください。) 41 | 42 |  (UDPcontrolオブジェクトに、udptest.cs スクリプトをアタッチしております。) 43 | 44 | 4. 再生ボタンを押すと、画面に変化はありませんが、待ち受け状態になります。コンソールに受信したデータが表示されます。(されない場合はIPアドレスやポート番号等チェック) 45 | 46 | 5. 画面内の「send」ボタンを押すと、ESP32 へデータを送信します。 47 | 48 | 6. これで送受信できました! float または Int32 で送受信するサンプルとなりますので、適宜コードをご変更ください。 49 | 50 |  (つながらない場合は、Arduino, Unity が同じwifi ネットワークにあること、ポートを揃えてるかどうか等、ご確認下さい。) 51 | 52 | (PC再インストールして試したところ、Windows 10 のネットワークプロファイルが「パブリック」だとPCでUDP受信できず、「プライベート」にしたら受信できました。受信できないときは、ファイヤーウォール設定のポートの設定もご確認下さい。) 53 | 54 | 55 | # 参考にしたURL。 56 | 57 | ほぼこちらの方々のコードを参考にさせてもらっています。 ありがとうございます。 58 | 59 | 参考1 Qiita UnityでUDPを受信してみる 60 | 61 | https://qiita.com/Tsukkey/items/247285c703fbbc6c6cd2 62 | 63 | 参考2 Qiita ESP32でUDP通信やってみた(ESP32インストール手順解説あり) 64 | 65 | https://qiita.com/nenjiru/items/8fa8dfb27f55c0205651 66 | 67 | 参考3  M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 68 | 69 | https://www.mgo-tec.com/blog-entry-udp-wifi-m5stack.html/3#title09 70 | 71 | # その他 72 | 73 | 当環境 Unity 2019.1.10f1   Arduino IDE 1.8.9 74 | 75 | MIT License 76 | 77 | @devemin https://twitter.com/devemin 78 | 79 | もし良かったらスターやコメントお願い致します♪ 80 | 81 | -------------------------------------------------------------------------------- /udptest.ino: -------------------------------------------------------------------------------- 1 | //↓M5StickC ならこれを有効にし、Setup() でM5.begin() を行う 2 | //#include 3 | #include 4 | #include 5 | 6 | 7 | //ESP32 x Unity x UDP 8 | //WiFi UDPにて送受信するサンプルです。 9 | 10 | //参考: 11 | //ESP32でUDP通信やってみた(ESP32インストール手順解説あり) 12 | //https://qiita.com/Tsukkey/items/247285c703fbbc6c6cd2 13 | //M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 14 | //https://www.mgo-tec.com/blog-entry-udp-wifi-m5stack.html/3#title09 15 | //2バイト以上のデータタイプはビットシフトしてバイト分割して送る、float は共用体を利用して送る 16 | //https://hawksnowlog.blogspot.com/2016/11/sending-multibytes-with-serialwrite.html#float-4byte-%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95 17 | 18 | const char* ssid = "apname"; 19 | const char* password = "appassword"; 20 | 21 | const char* client_address = "192.168.0.33"; //送り先 22 | const int client_port = 22222; //送り先 23 | const int server_port = 22224; //このESP32 のポート番号 24 | 25 | 26 | #define RECVDATANUM 9 27 | #define SENDDATANUM 9 28 | 29 | WiFiUDP udp; 30 | 31 | //データ送受信のfloat のやり取りの為に、共用体を用いる。 32 | //共用体は、下記宣言で4byte のバイナリデータなのに、.ival や .fval 等とアクセスすることで中身を int や float に読み替えられる機能 33 | typedef union { 34 | int32_t ival; 35 | float fval; 36 | byte binary[4]; 37 | } uf; 38 | 39 | 40 | uf r_ufdata[RECVDATANUM]; 41 | uf s_ufdata[SENDDATANUM]; 42 | 43 | 44 | 45 | 46 | void setup() { 47 | Serial.begin(115200); 48 | 49 | //M5StickC の時は実行 50 | //M5.begin(); 51 | 52 | //WiFi 初期化 53 | Serial.println("[ESP32] Connecting to WiFi network: " + String(ssid)); 54 | WiFi.disconnect(true, true); 55 | delay(500); 56 | WiFi.begin(ssid, password); 57 | while( WiFi.status() != WL_CONNECTED) { 58 | delay(500); 59 | } 60 | Serial.println(""); 61 | Serial.println("WiFi connected"); 62 | Serial.println("IP address: "); 63 | Serial.println(WiFi.localIP()); 64 | 65 | 66 | //UDP 開始 67 | udp.begin(server_port); 68 | delay(500); 69 | 70 | } 71 | 72 | 73 | //受信 74 | //パケットが来ていれば、RECVDATANUM 分だけr_ufdata配列に保存する 75 | void receiveUDP(){ 76 | int packetSize = udp.parsePacket(); 77 | byte tmpbuf[128]; 78 | 79 | //今回はUnity にここに来る処理は入れてないが、RECVDATANUM 分のfloatが来た場合の処理 の想定 80 | if(packetSize == RECVDATANUM){ 81 | //Serial.println("recv"); 82 | for (int a=0; a