From 7d65d1b79968b59c155fe2d665e1459ef9bf4cd6 Mon Sep 17 00:00:00 2001 From: "tom.hempel" Date: Fri, 26 Sep 2025 10:13:33 +0200 Subject: [PATCH] further work on bug fixing --- .../Assets/InputSystem_Actions.inputactions | 1077 +++++++++++++++++ .../InputSystem_Actions.inputactions.meta | 14 + .../ConvaiSimpleUDPAudioReceiver.cs | 83 +- .../Multiplayer/ConvaiSimpleUDPAudioSender.cs | 355 +++++- .../ProjectSettings/EditorBuildSettings.asset | 4 +- .../ProjectSettings/ProjectSettings.asset | 2 +- 6 files changed, 1492 insertions(+), 43 deletions(-) create mode 100644 Unity-Master/Assets/InputSystem_Actions.inputactions create mode 100644 Unity-Master/Assets/InputSystem_Actions.inputactions.meta diff --git a/Unity-Master/Assets/InputSystem_Actions.inputactions b/Unity-Master/Assets/InputSystem_Actions.inputactions new file mode 100644 index 0000000..76a8761 --- /dev/null +++ b/Unity-Master/Assets/InputSystem_Actions.inputactions @@ -0,0 +1,1077 @@ +{ + "name": "InputSystem_Actions", + "maps": [ + { + "name": "Player", + "id": "df70fa95-8a34-4494-b137-73ab6b9c7d37", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "6b444451-8a00-4d00-a97e-f47457f736a8", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Attack", + "type": "Button", + "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "852140f2-7766-474d-8707-702459ba45f3", + "expectedControlType": "", + "processors": "", + "interactions": "Hold", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Previous", + "type": "Button", + "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Next", + "type": "Button", + "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "641cd816-40e6-41b4-8c3d-04687c349290", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "sendVoice", + "type": "Button", + "id": "f402ad2c-ff1c-40cf-b1a8-cb68601c3038", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", + "path": "/w", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", + "path": "/s", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", + "path": "/a", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", + "path": "/d", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", + "path": "/primaryTouch/tap", + "interactions": "", + "processors": "", + "groups": ";Touch", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8255d333-5683-4943-a58a-ccb207ff1dce", + "path": "/{PrimaryAction}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", + "path": "/enter", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", + "path": "/dpad/right", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f2e9ba44-c423-42a7-ad56-f20975884794", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", + "path": "/leftStickPress", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "603f3daf-40bd-4854-8724-93e8017f59e3", + "path": "/secondaryButton", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", + "path": "/dpad/left", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "48ae8981-5edb-4cb6-b4cc-b648d976438f", + "path": "{RightHand}/primaryButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "sendVoice", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "272f6d14-89ba-496f-b7ff-215263d3219f", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "7607c7b6-cd76-4816-beef-bd0341cfe950", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "32b35790-4ed0-4e9a-aa41-69ac6d629449", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "3c7022bf-7922-4f7c-a998-c437916075ad", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "44b200b1-1557-4083-816c-b22cbdf77ddf", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "dad70c86-b58c-4b17-88ad-f5e53adf419e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "0489e84a-4833-4c40-bfae-cea84b696689", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDevicePosition", + "type": "PassThrough", + "id": "24908448-c609-4bc3-a128-ea258674378a", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDeviceOrientation", + "type": "PassThrough", + "id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "Gamepad", + "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2db08d65-c5fb-421b-983f-c71163608d67", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "58748904-2ea9-4a80-8579-b500e6a76df8", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcd248ae-a788-4676-a12e-f4d81205600b", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3db53b26-6601-41be-9887-63ac74e79d19", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "ff527021-f211-4c02-933e-5976594c46ed", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "74214943-c580-44e4-98eb-ad7eebe17902", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cea9b045-a000-445b-95b8-0c171af70a3b", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "8607c725-d935-4808-84b1-8354e29bab63", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", + "path": "/touch*/position", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", + "path": "/touch*/press", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "38c99815-14ea-4617-8627-164d27641299", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4c191405-5738-4d4b-a523-c6a301dbf754", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDevicePosition", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDeviceOrientation", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/Unity-Master/Assets/InputSystem_Actions.inputactions.meta b/Unity-Master/Assets/InputSystem_Actions.inputactions.meta new file mode 100644 index 0000000..712ad7a --- /dev/null +++ b/Unity-Master/Assets/InputSystem_Actions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 7bb00533d62df7744bfa20da5215c4bf +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs index af8931b..b0b7bef 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs @@ -39,7 +39,8 @@ namespace Convai.Scripts.Runtime.Multiplayer // Audio state tracking private bool _isReceivingAudio = false; private int _expectedSequence = 0; - private const uint MAGIC_NUMBER = 0xC0A1; // Simple magic number for packet validation + private const uint AUDIO_MAGIC = 0xC0A1; // Audio packet magic + private const uint ACK_MAGIC = 0xC0A2; // Ack packet magic // Timing for auto-stop private float _lastPacketTime; @@ -48,13 +49,12 @@ namespace Convai.Scripts.Runtime.Multiplayer // Packet structure (matching ConvaiSimpleUDPAudioSender) private struct AudioPacketData { - public uint magicNumber; public int sequence; public int sampleCount; public int microphonePosition; public bool isEndSignal; + public bool isStartSignal; public short[] audioSamples; - public long timestamp; } private void Start() @@ -216,9 +216,9 @@ namespace Convai.Scripts.Runtime.Multiplayer { try { - var packetData = ParseSimpleAudioPacket(data); + var packetData = ParseSimpleAudioPacket(data, sender); - if (packetData.HasValue) + if (packetData.HasValue) { var packet = packetData.Value; _lastPacketTime = Time.time; @@ -231,13 +231,17 @@ namespace Convai.Scripts.Runtime.Multiplayer ConvaiLogger.DebugLog($"Received audio packet {packet.sequence} with {packet.sampleCount} samples", ConvaiLogger.LogCategory.Character); } - if (packet.isEndSignal) + if (packet.isEndSignal) { StopTalkingSimulation(); OnAudioReceiving?.Invoke(false); } else { + if (packet.isStartSignal) + { + // START packet acknowledged earlier + } // If this is the first packet, start the talking simulation if (packet.sequence == 0 && !_isReceivingAudio) { @@ -251,8 +255,7 @@ namespace Convai.Scripts.Runtime.Multiplayer { // Not our audio packet format, might be a test message string message = System.Text.Encoding.UTF8.GetString(data); - if (enableDebugLogging) - ConvaiLogger.Info($"Received test message from {sender}: {message}", ConvaiLogger.LogCategory.Character); + ConvaiLogger.Info($"Received test message from {sender}: {message}", ConvaiLogger.LogCategory.Character); } } catch (Exception ex) @@ -302,44 +305,41 @@ namespace Convai.Scripts.Runtime.Multiplayer }); } - private AudioPacketData? ParseSimpleAudioPacket(byte[] data) + private AudioPacketData? ParseSimpleAudioPacket(byte[] data, IPEndPoint sender) { - if (data.Length < 24) // Minimum header size + // Sender uses a 17-byte header (no timestamp/padding). We also support older 24+ byte format gracefully. + if (data.Length < 17) return null; try { int offset = 0; - - // Read magic number + uint magic = BitConverter.ToUInt32(data, offset); offset += 4; - - if (magic != MAGIC_NUMBER) + if (magic != AUDIO_MAGIC) + { + // Might be a test message or something else return null; - - // Read header + } + int sequence = BitConverter.ToInt32(data, offset); offset += 4; - int sampleCount = BitConverter.ToInt32(data, offset); offset += 4; - int microphonePosition = BitConverter.ToInt32(data, offset); offset += 4; - - bool isEndSignal = BitConverter.ToBoolean(data, offset); + byte flag = data[offset]; offset += 1; - - // Skip padding - offset += 3; - - long timestamp = BitConverter.ToInt64(data, offset); - offset += 8; - - // Read audio data + + bool isEndSignal = (flag == 1); + bool isStartSignal = (flag == 2); + + // Send ACK immediately (for START and audio packets) + SendAck(sender, sequence); + short[] audioSamples = null; - if (!isEndSignal && sampleCount > 0) + if (!isEndSignal && !isStartSignal && sampleCount > 0) { int audioDataSize = sampleCount * sizeof(short); if (data.Length >= offset + audioDataSize) @@ -348,16 +348,15 @@ namespace Convai.Scripts.Runtime.Multiplayer Buffer.BlockCopy(data, offset, audioSamples, 0, audioDataSize); } } - + return new AudioPacketData { - magicNumber = magic, sequence = sequence, sampleCount = sampleCount, microphonePosition = microphonePosition, isEndSignal = isEndSignal, - audioSamples = audioSamples, - timestamp = timestamp + isStartSignal = isStartSignal, + audioSamples = audioSamples }; } catch (Exception ex) @@ -366,6 +365,24 @@ namespace Convai.Scripts.Runtime.Multiplayer return null; } } + + private void SendAck(IPEndPoint recipient, int sequence) + { + try + { + using (var client = new UdpClient()) + { + byte[] ack = new byte[8]; + Buffer.BlockCopy(BitConverter.GetBytes(ACK_MAGIC), 0, ack, 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(sequence), 0, ack, 4, 4); + client.Send(ack, ack.Length, recipient); + } + } + catch (Exception ex) + { + ConvaiLogger.Warn($"Failed to send ACK: {ex.Message}", ConvaiLogger.LogCategory.Character); + } + } // Event handler for when NPC becomes active private void HandleActiveNPCChanged(ConvaiNPC newActiveNPC) diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs index 9d8ff17..6df8f74 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs @@ -6,6 +6,9 @@ using System.Threading.Tasks; using Convai.Scripts.Runtime.LoggerSystem; using Convai.Scripts.Runtime.UI; using UnityEngine; +using UnityEngine.XR; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.XR; namespace Convai.Scripts.Runtime.Multiplayer { @@ -30,6 +33,11 @@ namespace Convai.Scripts.Runtime.Multiplayer [SerializeField] private KeyCode talkKey = KeyCode.T; [SerializeField] private bool useHoldToTalk = true; [SerializeField] private KeyCode controllerTalkButton = KeyCode.JoystickButton0; // A button on most controllers + [SerializeField] private bool useXRControllerAButton = true; // OpenXR primaryButton + [SerializeField] private XRNode xrControllerNode = XRNode.RightHand; // Quest A button is on right hand + [SerializeField] private bool useInputSystemXR = true; // Use new Input System for XR button + [SerializeField] private bool enableBButtonTest = true; // Press B/secondary to send test packet + [SerializeField] private InputActionReference sendVoiceActionReference; // Optional external action (e.g., QuestPro primaryButton) [Header("Debug")] [SerializeField] private bool enableDebugLogging = true; @@ -40,11 +48,25 @@ namespace Convai.Scripts.Runtime.Multiplayer private AudioClip _audioClip; private bool _isRecording = false; private CancellationTokenSource _cancellationTokenSource; + private CancellationTokenSource _ackCancellationTokenSource; private int _lastMicrophonePosition = 0; private float[] _audioBuffer; private string _selectedMicrophone; private int _packetSequence = 0; + private volatile bool _startAckReceived = false; + private bool _xrAButtonPrevPressed = false; + private InputAction _xrTalkAction; + private InputAction _xrTestAction; + private bool _usingExternalTalkAction = false; + private InputAction _externalTalkAction; + + // Protocol constants + private const uint AUDIO_MAGIC = 0xC0A1; + private const uint ACK_MAGIC = 0xC0A2; + private const byte FLAG_AUDIO = 0; + private const byte FLAG_END = 1; + private const byte FLAG_START = 2; public event Action OnRecordingStateChanged; @@ -63,6 +85,27 @@ namespace Convai.Scripts.Runtime.Multiplayer InitializeNetwork(); InitializeAudio(); _cancellationTokenSource = new CancellationTokenSource(); + _ackCancellationTokenSource = new CancellationTokenSource(); + + // Start ACK listener + _ = ListenForAcks(_ackCancellationTokenSource.Token); + + // Setup Input System action for XR A/primary button + if (useInputSystemXR) + { + if (sendVoiceActionReference != null && sendVoiceActionReference.action != null) + { + SetupExternalTalkInputAction(sendVoiceActionReference.action); + } + else + { + SetupXRTalkInputAction(); + } + if (enableBButtonTest) + { + SetupXRTestInputAction(); + } + } } private void Update() @@ -75,6 +118,13 @@ namespace Convai.Scripts.Runtime.Multiplayer StopRecording(); _cancellationTokenSource?.Cancel(); _cancellationTokenSource?.Dispose(); + _ackCancellationTokenSource?.Cancel(); + _ackCancellationTokenSource?.Dispose(); + if (_usingExternalTalkAction) + TeardownExternalTalkInputAction(); + else + TeardownXRTalkInputAction(); + TeardownXRTestInputAction(); _udpClient?.Close(); } @@ -127,21 +177,34 @@ namespace Convai.Scripts.Runtime.Multiplayer private void HandleInput() { + // Input System XR events handle XR button press/release. + // Here we keep keyboard/legacy controller as fallback. + bool xrDown = false; + bool xrUp = false; + + if (useXRControllerAButton && !useInputSystemXR) + { + bool xrPressed = GetXRPrimaryButtonPressed(xrControllerNode); + xrDown = xrPressed && !_xrAButtonPrevPressed; + xrUp = !xrPressed && _xrAButtonPrevPressed; + _xrAButtonPrevPressed = xrPressed; + } + // Handle talk key if (useHoldToTalk) { - if ((Input.GetKeyDown(talkKey) || Input.GetKeyDown(controllerTalkButton)) && !_isRecording) + if ((Input.GetKeyDown(talkKey) || Input.GetKeyDown(controllerTalkButton) || xrDown) && !_isRecording) { StartRecording(); } - else if ((Input.GetKeyUp(talkKey) || Input.GetKeyUp(controllerTalkButton)) && _isRecording) + else if ((Input.GetKeyUp(talkKey) || Input.GetKeyUp(controllerTalkButton) || xrUp) && _isRecording) { StopRecording(); } } else { - if (Input.GetKeyDown(talkKey) || Input.GetKeyDown(controllerTalkButton)) + if (Input.GetKeyDown(talkKey) || Input.GetKeyDown(controllerTalkButton) || xrDown) { if (_isRecording) StopRecording(); @@ -156,6 +219,196 @@ namespace Convai.Scripts.Runtime.Multiplayer TestConnection(); } } + + private void SetupXRTalkInputAction() + { + try + { + // Create button action + _xrTalkAction = new InputAction("XRTalk", InputActionType.Button); + + string handTag = xrControllerNode == XRNode.LeftHand ? "{LeftHand}" : "{RightHand}"; + + // Bind to common XR controller primary/A button paths + _xrTalkAction.AddBinding($"{handTag}/primaryButton"); + _xrTalkAction.AddBinding($"{handTag}/primaryButton"); + _xrTalkAction.AddBinding($"{handTag}/primaryButton"); + _xrTalkAction.AddBinding($"{handTag}/primaryButton"); + _xrTalkAction.AddBinding($"{handTag}/buttonSouth"); + // Gamepad A as additional fallback (useful in editor) + _xrTalkAction.AddBinding("/buttonSouth"); + + if (useHoldToTalk) + { + _xrTalkAction.started += ctx => { if (!_isRecording) StartRecording(); }; + _xrTalkAction.canceled += ctx => { if (_isRecording) StopRecording(); }; + } + else + { + _xrTalkAction.started += ctx => { if (_isRecording) StopRecording(); else StartRecording(); }; + } + + _xrTalkAction.Enable(); + } + catch (Exception ex) + { + ConvaiLogger.Warn($"Failed to setup XR InputAction: {ex.Message}", ConvaiLogger.LogCategory.Character); + } + } + + private void TeardownXRTalkInputAction() + { + try + { + if (_xrTalkAction != null) + { + _xrTalkAction.Disable(); + _xrTalkAction.Dispose(); + _xrTalkAction = null; + } + } + catch (Exception) + { + // ignore + } + } + + private void SetupExternalTalkInputAction(InputAction action) + { + try + { + _externalTalkAction = action; + _usingExternalTalkAction = true; + + if (useHoldToTalk) + { + _externalTalkAction.started += ctx => { if (!_isRecording) StartRecording(); }; + _externalTalkAction.canceled += ctx => { if (_isRecording) StopRecording(); }; + } + else + { + _externalTalkAction.started += ctx => { if (_isRecording) StopRecording(); else StartRecording(); }; + } + + if (!_externalTalkAction.enabled) + _externalTalkAction.Enable(); + } + catch (Exception ex) + { + ConvaiLogger.Warn($"Failed to setup external talk action: {ex.Message}", ConvaiLogger.LogCategory.Character); + _usingExternalTalkAction = false; + _externalTalkAction = null; + // Fallback to programmatic setup + SetupXRTalkInputAction(); + } + } + + private void TeardownExternalTalkInputAction() + { + try + { + if (_externalTalkAction != null) + { + // Remove handlers; do not disable/dispose external actions + if (useHoldToTalk) + { + _externalTalkAction.started -= ctx => { if (!_isRecording) StartRecording(); }; + _externalTalkAction.canceled -= ctx => { if (_isRecording) StopRecording(); }; + } + else + { + _externalTalkAction.started -= ctx => { if (_isRecording) StopRecording(); else StartRecording(); }; + } + } + } + catch (Exception) + { + // ignore + } + finally + { + _externalTalkAction = null; + _usingExternalTalkAction = false; + } + } + + private void SetupXRTestInputAction() + { + try + { + _xrTestAction = new InputAction("XRTest", InputActionType.Button); + string handTag = xrControllerNode == XRNode.LeftHand ? "{LeftHand}" : "{RightHand}"; + + // B button is typically secondaryButton or buttonEast + _xrTestAction.AddBinding($"{handTag}/secondaryButton"); + _xrTestAction.AddBinding($"{handTag}/secondaryButton"); + _xrTestAction.AddBinding($"{handTag}/secondaryButton"); + _xrTestAction.AddBinding($"{handTag}/buttonEast"); + _xrTestAction.AddBinding("/buttonEast"); + + _xrTestAction.started += ctx => { SendTestPacket(); }; + _xrTestAction.Enable(); + } + catch (Exception ex) + { + ConvaiLogger.Warn($"Failed to setup XR Test InputAction: {ex.Message}", ConvaiLogger.LogCategory.Character); + } + } + + private void TeardownXRTestInputAction() + { + try + { + if (_xrTestAction != null) + { + _xrTestAction.Disable(); + _xrTestAction.Dispose(); + _xrTestAction = null; + } + } + catch (Exception) + { + // ignore + } + } + + private async void SendTestPacket() + { + try + { + if (_udpClient == null || _targetEndPoint == null) + { + ConvaiLogger.Error("UDP client not initialized for test packet", ConvaiLogger.LogCategory.Character); + return; + } + + string testMessage = "Hello this is a Test"; + byte[] data = System.Text.Encoding.UTF8.GetBytes(testMessage); + await _udpClient.SendAsync(data, data.Length, _targetEndPoint); + ConvaiLogger.Info("Sent test packet: 'Hello this is a Test'", ConvaiLogger.LogCategory.Character); + } + catch (Exception ex) + { + ConvaiLogger.Error($"Failed to send test packet: {ex.Message}", ConvaiLogger.LogCategory.Character); + } + } + + private bool GetXRPrimaryButtonPressed(XRNode hand) + { + try + { + var device = InputDevices.GetDeviceAtXRNode(hand); + if (!device.isValid) + return false; + if (device.TryGetFeatureValue(UnityEngine.XR.CommonUsages.primaryButton, out bool pressed)) + return pressed; + } + catch (Exception) + { + // ignore errors and treat as not pressed + } + return false; + } public void StartRecording() { @@ -169,10 +422,14 @@ namespace Convai.Scripts.Runtime.Multiplayer _isRecording = true; _lastMicrophonePosition = 0; _packetSequence = 0; + _startAckReceived = false; ConvaiLogger.Info("Started recording for UDP transmission (Simple)", ConvaiLogger.LogCategory.Character); OnRecordingStateChanged?.Invoke(true); + // Send START control and wait briefly for ACK to ensure receiver is ready + _ = SendStartOfRecordingSignalAndAwaitAck(); + // Start continuous audio processing _ = ProcessAudioContinuously(_cancellationTokenSource.Token); } @@ -324,7 +581,7 @@ namespace Convai.Scripts.Runtime.Multiplayer int offset = 0; // Magic number - BitConverter.GetBytes((uint)0xC0A1).CopyTo(packet, offset); + BitConverter.GetBytes(AUDIO_MAGIC).CopyTo(packet, offset); offset += 4; // Packet sequence @@ -340,7 +597,7 @@ namespace Convai.Scripts.Runtime.Multiplayer offset += 4; // Flags (0 for normal audio) - packet[offset] = 0; + packet[offset] = FLAG_AUDIO; offset += 1; // Convert audio samples to bytes (same as Convai approach) @@ -366,7 +623,7 @@ namespace Convai.Scripts.Runtime.Multiplayer int offset = 0; // Magic number - BitConverter.GetBytes((uint)0xC0A1).CopyTo(packet, offset); + BitConverter.GetBytes(AUDIO_MAGIC).CopyTo(packet, offset); offset += 4; // Packet sequence @@ -382,7 +639,7 @@ namespace Convai.Scripts.Runtime.Multiplayer offset += 4; // Flags (1 for end of recording) - packet[offset] = 1; + packet[offset] = FLAG_END; _udpClient.SendAsync(packet, packet.Length, _targetEndPoint); } @@ -391,6 +648,90 @@ namespace Convai.Scripts.Runtime.Multiplayer ConvaiLogger.Error($"Failed to send end signal: {ex.Message}", ConvaiLogger.LogCategory.Character); } } + + private async Task SendStartOfRecordingSignalAndAwaitAck() + { + try + { + const int maxAttempts = 3; + const int ackTimeoutMs = 250; + + for (int attempt = 1; attempt <= maxAttempts && !_startAckReceived; attempt++) + { + // Build START control packet (no audio, special flag) + byte[] packet = new byte[17]; + int offset = 0; + BitConverter.GetBytes(AUDIO_MAGIC).CopyTo(packet, offset); + offset += 4; + // Use -1 as the special sequence for START control + BitConverter.GetBytes(-1).CopyTo(packet, offset); + offset += 4; + BitConverter.GetBytes(0).CopyTo(packet, offset); + offset += 4; + BitConverter.GetBytes(_lastMicrophonePosition).CopyTo(packet, offset); + offset += 4; + packet[offset] = FLAG_START; + + await _udpClient.SendAsync(packet, packet.Length, _targetEndPoint); + + // Wait for ACK + int waited = 0; + while (!_startAckReceived && waited < ackTimeoutMs) + { + await Task.Delay(10); + waited += 10; + } + + if (_startAckReceived) + { + if (enableDebugLogging) + ConvaiLogger.DebugLog("Received START ACK from receiver", ConvaiLogger.LogCategory.Character); + break; + } + else if (enableDebugLogging) + { + ConvaiLogger.Warn($"No START ACK (attempt {attempt}/{maxAttempts}), retrying...", ConvaiLogger.LogCategory.Character); + } + } + } + catch (Exception ex) + { + ConvaiLogger.Warn($"Error during START ACK process: {ex.Message}", ConvaiLogger.LogCategory.Character); + } + } + + private async Task ListenForAcks(CancellationToken token) + { + // Use the same UDP client; acks will be sent back to our ephemeral local port + while (!token.IsCancellationRequested) + { + try + { + var result = await _udpClient.ReceiveAsync(); + var data = result.Buffer; + if (data == null || data.Length < 8) + continue; + + uint magic = BitConverter.ToUInt32(data, 0); + if (magic != ACK_MAGIC) + continue; + + int seq = BitConverter.ToInt32(data, 4); + if (seq == -1) + { + _startAckReceived = true; + } + } + catch (ObjectDisposedException) + { + break; + } + catch (Exception) + { + // Ignore and keep listening + } + } + } // Public methods for external control public void SetTargetEndpoint(string ip, int port) diff --git a/Unity-Master/ProjectSettings/EditorBuildSettings.asset b/Unity-Master/ProjectSettings/EditorBuildSettings.asset index 804e607..290a860 100644 --- a/Unity-Master/ProjectSettings/EditorBuildSettings.asset +++ b/Unity-Master/ProjectSettings/EditorBuildSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4658e28e181dcf6a18f2aef369deae8cf96e8420f72070cb324683522f129e7 -size 994 +oid sha256:57814a7518569d818e2d6fd8ddb8c5543ec9a81bdd1b5c6266f4d9f5ea9eaf31 +size 1111 diff --git a/Unity-Master/ProjectSettings/ProjectSettings.asset b/Unity-Master/ProjectSettings/ProjectSettings.asset index f7d21f1..6737b1a 100644 --- a/Unity-Master/ProjectSettings/ProjectSettings.asset +++ b/Unity-Master/ProjectSettings/ProjectSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a2643c536bb34c3c4db6a008600a452a81ce34ada5145268e1832c14a4b239c +oid sha256:25399395d8561b9f40e5ee8dba94941698f075c0ff6f15636dc3519c76959af8 size 24640