Compare commits
57 Commits
803e87688a
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ac87f2f8ef | |||
| 856ff3ca40 | |||
| 693b3a572e | |||
| 8977957054 | |||
| b563be1158 | |||
| 616532e69c | |||
| 450efe675a | |||
| cce7492556 | |||
| e197206d0a | |||
| dc7aa3b9b9 | |||
| 54d44afcec | |||
| 15c2e62e92 | |||
| c4fafd1dd3 | |||
| 1c03f1773b | |||
| ef3bc5da39 | |||
| ed66253b06 | |||
| 6b8c3b6fbb | |||
| cb73b9cbbc | |||
| 07cdba6097 | |||
| b9448fb4c7 | |||
| 4b1d8ea5bd | |||
| 6a76fa038f | |||
| 8af4eff8c7 | |||
| b38461fc52 | |||
| e5baba75cf | |||
| b9515d50d0 | |||
| e06b0206c8 | |||
| cd0313e693 | |||
| 1580f40636 | |||
| f5ba95849e | |||
| c5b90be63f | |||
| 5a41559b88 | |||
| 5ab753f4b5 | |||
| dab664b62a | |||
| 9d389a3296 | |||
| d269226b4b | |||
| 47d505a1ba | |||
| e7ad8e6fd4 | |||
| 36e3b95645 | |||
| b012ae17b2 | |||
| b9ccfb1c3a | |||
| cdd6a2e96d | |||
| 9af005b651 | |||
| e9b013a904 | |||
| 262a67293e | |||
| ab2406c367 | |||
| 0f409ddb08 | |||
| 4aa139be24 | |||
| b4c665abe4 | |||
|
|
b84e1b7837 | ||
|
|
e9fe4cb559 | ||
| d2673f52e1 | |||
| e6045f7775 | |||
| e6ddcc7390 | |||
| 75cfdd7a48 | |||
|
|
071c1db4f4 | ||
|
|
9bd8601edb |
@@ -4,6 +4,7 @@ using FishNet.Discovery;
|
||||
using FishNet.Managing.Scened;
|
||||
using FishNet.Object;
|
||||
using System.Collections;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using TMPro;
|
||||
@@ -13,6 +14,9 @@ using UnityEngine.UI;
|
||||
|
||||
public class NetworkMenuUI : MonoBehaviour
|
||||
{
|
||||
|
||||
|
||||
private ConcurrentQueue<System.Action> mainThreadQueue = new();
|
||||
[Header("UI References")]
|
||||
public Toggle VRToggle;
|
||||
|
||||
@@ -29,12 +33,14 @@ public class NetworkMenuUI : MonoBehaviour
|
||||
public Camera uiCamera;
|
||||
public AudioListener placeholderAudioListener;
|
||||
private bool _useVR;
|
||||
|
||||
//public Image coverImage;
|
||||
|
||||
private readonly List<IPEndPoint> foundServers = new();
|
||||
|
||||
private void Start()
|
||||
{
|
||||
|
||||
if (networkDiscovery == null)
|
||||
networkDiscovery = FindObjectOfType<NetworkDiscovery>();
|
||||
|
||||
@@ -55,9 +61,23 @@ public class NetworkMenuUI : MonoBehaviour
|
||||
joinMultiplayerButton.onClick.AddListener(OnJoinMultiplayer);
|
||||
quitButton.onClick.AddListener(OnQuit);
|
||||
|
||||
networkDiscovery.ServerFoundCallback += OnServerFound;
|
||||
networkDiscovery.ServerFoundCallback += (endPoint) =>
|
||||
{
|
||||
Debug.Log("Found a server");
|
||||
// Only queue the endpoint for main-thread processing
|
||||
mainThreadQueue.Enqueue(() =>
|
||||
{
|
||||
StartCoroutine(ProcessServerFound(endPoint));
|
||||
});
|
||||
};
|
||||
}
|
||||
private void Update()
|
||||
{
|
||||
while (mainThreadQueue.TryDequeue(out var action))
|
||||
{
|
||||
action.Invoke(); // safely runs on main thread
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStartPlaying()
|
||||
{
|
||||
statusText.text = "Starting host...";
|
||||
@@ -100,8 +120,11 @@ public class NetworkMenuUI : MonoBehaviour
|
||||
private void OnJoinMultiplayer()
|
||||
{
|
||||
statusText.text = "Searching for servers...";
|
||||
networkDiscovery.StopSearchingForServers();
|
||||
ClearServerList();
|
||||
//Debug.Log(foundServers.Count);
|
||||
foundServers.Clear();
|
||||
//Debug.Log(foundServers.Count);
|
||||
networkDiscovery.StartSearchingForServers();
|
||||
}
|
||||
|
||||
@@ -111,45 +134,57 @@ public class NetworkMenuUI : MonoBehaviour
|
||||
Application.Quit();
|
||||
}
|
||||
|
||||
private void OnServerFound(IPEndPoint endPoint)
|
||||
private IEnumerator ProcessServerFound(IPEndPoint endPoint)
|
||||
{
|
||||
if (foundServers.Contains(endPoint)) return;
|
||||
Debug.Log("server found");
|
||||
//Debug.Log(endPoint.Address.ToString());
|
||||
//Debug.Log(foundServers.Count);
|
||||
if (foundServers.Contains(endPoint)) yield return null;
|
||||
foundServers.Add(endPoint);
|
||||
|
||||
// Auto-join if started as host
|
||||
if (InstanceFinder.IsServer)
|
||||
{
|
||||
//networkDiscovery.StopAdvertisingServer();
|
||||
networkDiscovery.StopSearchingForServers();
|
||||
Debug.Log($"Server found {endPoint}");
|
||||
// Auto-join if started as host
|
||||
if (InstanceFinder.IsServer)
|
||||
{
|
||||
Debug.Log("Server is local");
|
||||
//networkDiscovery.StopAdvertisingServer();
|
||||
networkDiscovery.StopSearchingForServers();
|
||||
|
||||
uiCamera.enabled = false;
|
||||
Debug.Log("Disabled placeholder audio source");
|
||||
placeholderAudioListener.enabled = false;
|
||||
//coverImage.gameObject.SetActive(false);
|
||||
|
||||
InstanceFinder.ClientManager.StartConnection(endPoint.Address.ToString());
|
||||
statusText.text = $"Joined server: {endPoint.Address}";
|
||||
return;
|
||||
}
|
||||
|
||||
// Display in UI for manual joining
|
||||
GameObject item = Instantiate(serverListItemPrefab, serverListContainer);
|
||||
TMP_Text label = item.GetComponentInChildren<TMP_Text>();
|
||||
label.text = endPoint.Address.ToString();
|
||||
|
||||
Button btn = item.GetComponent<Button>();
|
||||
btn.onClick.AddListener(() =>
|
||||
{
|
||||
networkDiscovery.StopSearchingForServers();
|
||||
if (uiCamera != null) uiCamera.enabled = false;
|
||||
if (placeholderAudioListener != null) {
|
||||
uiCamera.enabled = false;
|
||||
Debug.Log("Disabled placeholder audio source");
|
||||
placeholderAudioListener.enabled = false;
|
||||
placeholderAudioListener.enabled = false;
|
||||
//coverImage.gameObject.SetActive(false);
|
||||
|
||||
InstanceFinder.ClientManager.StartConnection(endPoint.Address.ToString());
|
||||
statusText.text = $"Joined server: {endPoint.Address}";
|
||||
yield return null;
|
||||
}
|
||||
//coverImage.gameObject.SetActive(false);
|
||||
InstanceFinder.ClientManager.StartConnection(endPoint.Address.ToString());
|
||||
statusText.text = $"Joined server: {endPoint.Address}";
|
||||
});
|
||||
|
||||
Debug.Log("Server is foregin");
|
||||
GameObject item = Instantiate(serverListItemPrefab, serverListContainer);
|
||||
|
||||
|
||||
|
||||
TMP_Text label = item.GetComponentInChildren<TMP_Text>();
|
||||
if (label != null)
|
||||
label.text = endPoint.Address.ToString();
|
||||
|
||||
Button btn = item.GetComponent<Button>();
|
||||
btn.onClick.RemoveAllListeners(); // clear any old listener
|
||||
btn.onClick.AddListener(() =>
|
||||
{
|
||||
networkDiscovery.StopSearchingForServers();
|
||||
if (uiCamera != null) uiCamera.enabled = false;
|
||||
if (placeholderAudioListener != null)
|
||||
{
|
||||
Debug.Log("Disabled placeholder audio source");
|
||||
placeholderAudioListener.enabled = false;
|
||||
}
|
||||
//coverImage.gameObject.SetActive(false);
|
||||
InstanceFinder.ClientManager.StartConnection(endPoint.Address.ToString());
|
||||
statusText.text = $"Joined server: {endPoint.Address}";
|
||||
});
|
||||
|
||||
}
|
||||
private Coroutine joinRoutine;
|
||||
|
||||
|
||||
262
Assets/_PROJECT/Components/Overlay UI/IP Button.prefab
Normal file
262
Assets/_PROJECT/Components/Overlay UI/IP Button.prefab
Normal file
@@ -0,0 +1,262 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1718131600983244308
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2576899869751053199}
|
||||
- component: {fileID: 3637504309793555790}
|
||||
- component: {fileID: 7198265083142013856}
|
||||
m_Layer: 0
|
||||
m_Name: Text (TMP)
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &2576899869751053199
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1718131600983244308}
|
||||
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_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 6142704360089163846}
|
||||
m_RootOrder: -1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &3637504309793555790
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1718131600983244308}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &7198265083142013856
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1718131600983244308}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_text: Sample IP
|
||||
m_isRightToLeft: 0
|
||||
m_fontAsset: {fileID: 11400000, guid: 254d33525bc3919439f569ea33703c5b, type: 2}
|
||||
m_sharedMaterial: {fileID: 4369893532151414794, guid: 254d33525bc3919439f569ea33703c5b,
|
||||
type: 2}
|
||||
m_fontSharedMaterials: []
|
||||
m_fontMaterial: {fileID: 0}
|
||||
m_fontMaterials: []
|
||||
m_fontColor32:
|
||||
serializedVersion: 2
|
||||
rgba: 4294967295
|
||||
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_enableVertexGradient: 0
|
||||
m_colorMode: 3
|
||||
m_fontColorGradient:
|
||||
topLeft: {r: 1, g: 1, b: 1, a: 1}
|
||||
topRight: {r: 1, g: 1, b: 1, a: 1}
|
||||
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
|
||||
bottomRight: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_fontColorGradientPreset: {fileID: 0}
|
||||
m_spriteAsset: {fileID: 0}
|
||||
m_tintAllSprites: 0
|
||||
m_StyleSheet: {fileID: 0}
|
||||
m_TextStyleHashCode: -1183493901
|
||||
m_overrideHtmlColors: 0
|
||||
m_faceColor:
|
||||
serializedVersion: 2
|
||||
rgba: 4294967295
|
||||
m_fontSize: 20
|
||||
m_fontSizeBase: 20
|
||||
m_fontWeight: 400
|
||||
m_enableAutoSizing: 0
|
||||
m_fontSizeMin: 18
|
||||
m_fontSizeMax: 72
|
||||
m_fontStyle: 0
|
||||
m_HorizontalAlignment: 2
|
||||
m_VerticalAlignment: 512
|
||||
m_textAlignment: 65535
|
||||
m_characterSpacing: 0
|
||||
m_wordSpacing: 0
|
||||
m_lineSpacing: 0
|
||||
m_lineSpacingMax: 0
|
||||
m_paragraphSpacing: 0
|
||||
m_charWidthMaxAdj: 0
|
||||
m_TextWrappingMode: 1
|
||||
m_wordWrappingRatios: 0.4
|
||||
m_overflowMode: 0
|
||||
m_linkedTextComponent: {fileID: 0}
|
||||
parentLinkedComponent: {fileID: 0}
|
||||
m_enableKerning: 0
|
||||
m_ActiveFontFeatures: 6e72656b
|
||||
m_enableExtraPadding: 0
|
||||
checkPaddingRequired: 0
|
||||
m_isRichText: 1
|
||||
m_EmojiFallbackSupport: 1
|
||||
m_parseCtrlCharacters: 1
|
||||
m_isOrthographic: 1
|
||||
m_isCullingEnabled: 0
|
||||
m_horizontalMapping: 0
|
||||
m_verticalMapping: 0
|
||||
m_uvLineOffset: 0
|
||||
m_geometrySortingOrder: 0
|
||||
m_IsTextObjectScaleStatic: 0
|
||||
m_VertexBufferAutoSizeReduction: 0
|
||||
m_useMaxVisibleDescender: 1
|
||||
m_pageToDisplay: 1
|
||||
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_isUsingLegacyAnimationComponent: 0
|
||||
m_isVolumetricText: 0
|
||||
m_hasFontAssetChanged: 0
|
||||
m_baseMaterial: {fileID: 0}
|
||||
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
|
||||
--- !u!1 &8155264290485183093
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6142704360089163846}
|
||||
- component: {fileID: 6886962170738448281}
|
||||
- component: {fileID: 636455074159682324}
|
||||
- component: {fileID: 5691563554839744214}
|
||||
m_Layer: 0
|
||||
m_Name: IP Button
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &6142704360089163846
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8155264290485183093}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1.2, y: 1.2, z: 1.2}
|
||||
m_ConstrainProportionsScale: 1
|
||||
m_Children:
|
||||
- {fileID: 2576899869751053199}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: -1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 160, y: 30}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &6886962170738448281
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8155264290485183093}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &636455074159682324
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8155264290485183093}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Type: 1
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!114 &5691563554839744214
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8155264290485183093}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Navigation:
|
||||
m_Mode: 3
|
||||
m_WrapAround: 0
|
||||
m_SelectOnUp: {fileID: 0}
|
||||
m_SelectOnDown: {fileID: 0}
|
||||
m_SelectOnLeft: {fileID: 0}
|
||||
m_SelectOnRight: {fileID: 0}
|
||||
m_Transition: 1
|
||||
m_Colors:
|
||||
m_NormalColor: {r: 0.21698111, g: 0.21698111, b: 0.21698111, a: 0.9019608}
|
||||
m_HighlightedColor: {r: 0.21960784, g: 0.21960784, b: 0.21960784, a: 1}
|
||||
m_PressedColor: {r: 0.21960784, g: 0.21960784, b: 0.21960784, a: 1}
|
||||
m_SelectedColor: {r: 0.21960784, g: 0.21960784, b: 0.21960784, a: 1}
|
||||
m_DisabledColor: {r: 0.21960784, g: 0.21960784, b: 0.21960784, a: 0.5019608}
|
||||
m_ColorMultiplier: 1
|
||||
m_FadeDuration: 0.1
|
||||
m_SpriteState:
|
||||
m_HighlightedSprite: {fileID: 0}
|
||||
m_PressedSprite: {fileID: 0}
|
||||
m_SelectedSprite: {fileID: 0}
|
||||
m_DisabledSprite: {fileID: 0}
|
||||
m_AnimationTriggers:
|
||||
m_NormalTrigger: Normal
|
||||
m_HighlightedTrigger: Highlighted
|
||||
m_PressedTrigger: Pressed
|
||||
m_SelectedTrigger: Selected
|
||||
m_DisabledTrigger: Disabled
|
||||
m_Interactable: 1
|
||||
m_TargetGraphic: {fileID: 636455074159682324}
|
||||
m_OnClick:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 161eef8a6244baa46b0988be67d74a08
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
Doc/Readme-Footer.png
LFS
Normal file
BIN
Doc/Readme-Footer.png
LFS
Normal file
Binary file not shown.
BIN
Doc/Readme-Header.png
LFS
Normal file
BIN
Doc/Readme-Header.png
LFS
Normal file
Binary file not shown.
BIN
Doc/ReadmeIllustrations.afdesign
Normal file
BIN
Doc/ReadmeIllustrations.afdesign
Normal file
Binary file not shown.
BIN
Doc/clips/Bolt-Car-Network-Problem-Clip.gif
LFS
Normal file
BIN
Doc/clips/Bolt-Car-Network-Problem-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Bolt-Car-Network-Results-Clip.gif
LFS
Normal file
BIN
Doc/clips/Bolt-Car-Network-Results-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Bolt-Self-Driving-Car-Clip.gif
LFS
Normal file
BIN
Doc/clips/Bolt-Self-Driving-Car-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Camera-Collider-Clip.gif
LFS
Normal file
BIN
Doc/clips/Camera-Collider-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Doors-Issue-Clip.gif
LFS
Normal file
BIN
Doc/clips/Doors-Issue-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Elevator-Move-Between-Floors-Clip.gif
LFS
Normal file
BIN
Doc/clips/Elevator-Move-Between-Floors-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Elevator-Open-Close-Doors-Clip.gif
LFS
Normal file
BIN
Doc/clips/Elevator-Open-Close-Doors-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Elevator-network-problem-Clip.gif
LFS
Normal file
BIN
Doc/clips/Elevator-network-problem-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Elevator-network-results-Clip.gif
LFS
Normal file
BIN
Doc/clips/Elevator-network-results-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Explore-Clip.gif
LFS
Normal file
BIN
Doc/clips/Explore-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Hand-Collider-Prototype-Clip.gif
LFS
Normal file
BIN
Doc/clips/Hand-Collider-Prototype-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Interactive-Map-Clip.gif
LFS
Normal file
BIN
Doc/clips/Interactive-Map-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Multiplayer-join-Clip.gif
LFS
Normal file
BIN
Doc/clips/Multiplayer-join-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Old-menu.gif
LFS
Normal file
BIN
Doc/clips/Old-menu.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Open-Elevator-Doors-Same-Floor-Clip.gif
LFS
Normal file
BIN
Doc/clips/Open-Elevator-Doors-Same-Floor-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Player-Collide-Offset-Clip.gif
LFS
Normal file
BIN
Doc/clips/Player-Collide-Offset-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Player-Hand-Collision-Complete-Clip.gif
LFS
Normal file
BIN
Doc/clips/Player-Hand-Collision-Complete-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Player-Hand-No-Collision-Clip.gif
LFS
Normal file
BIN
Doc/clips/Player-Hand-No-Collision-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Quit-Clip.gif
LFS
Normal file
BIN
Doc/clips/Quit-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Server-Room-Clip.gif
LFS
Normal file
BIN
Doc/clips/Server-Room-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Singleplayer-Join-Clip.gif
LFS
Normal file
BIN
Doc/clips/Singleplayer-Join-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Skywalk-Clip.gif
LFS
Normal file
BIN
Doc/clips/Skywalk-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Summon-Elevator-Clip.gif
LFS
Normal file
BIN
Doc/clips/Summon-Elevator-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/UFO-Bow-Game-Clip.gif
LFS
Normal file
BIN
Doc/clips/UFO-Bow-Game-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/VR-Elevator-Example-Clip.gif
LFS
Normal file
BIN
Doc/clips/VR-Elevator-Example-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/clips/Whiteboard-Clip.gif
LFS
Normal file
BIN
Doc/clips/Whiteboard-Clip.gif
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Elevator-buttons-inside.png
LFS
Normal file
BIN
Doc/designs/Elevator-buttons-inside.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Icons.afdesign
Normal file
BIN
Doc/designs/Icons.afdesign
Normal file
Binary file not shown.
BIN
Doc/designs/Map.afdesign
Normal file
BIN
Doc/designs/Map.afdesign
Normal file
Binary file not shown.
BIN
Doc/designs/Model-Collider-Rework-Concept.png
LFS
Normal file
BIN
Doc/designs/Model-Collider-Rework-Concept.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Moder-Collider-Rework-Results.png
LFS
Normal file
BIN
Doc/designs/Moder-Collider-Rework-Results.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Network-Player-mirror.png
LFS
Normal file
BIN
Doc/designs/Network-Player-mirror.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Original-elevator-state-diagram.png
LFS
Normal file
BIN
Doc/designs/Original-elevator-state-diagram.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Player-Hand-Colliders.png
LFS
Normal file
BIN
Doc/designs/Player-Hand-Colliders.png
LFS
Normal file
Binary file not shown.
BIN
Doc/designs/Two-Elevators.png
LFS
Normal file
BIN
Doc/designs/Two-Elevators.png
LFS
Normal file
Binary file not shown.
BIN
Doc/posters/MainPoster-2025.afdesign
Normal file
BIN
Doc/posters/MainPoster-2025.afdesign
Normal file
Binary file not shown.
BIN
Doc/posters/MainPoster-2025.pdf
Normal file
BIN
Doc/posters/MainPoster-2025.pdf
Normal file
Binary file not shown.
Binary file not shown.
95
README.md
95
README.md
@@ -1,29 +1,94 @@
|
||||
# DeltaVR
|
||||

|
||||
|
||||
DeltaVR is a virtual reality experience set in the Delta Centre of the University of Tartu. It was designed and implemented in a over three theses. The proiect used the Delta Building Visualization project as a basis for the building and built upon it, adding missing
|
||||
details and improving the performance. DeltaVR has multiplayer support, which allows players to explore the building together in PCVR, Quest 2 and non-VR versions.
|
||||
DeltaVR is a virtual reality experience set in the [Delta Centre](https://delta.ut.ee/) of the [University of Tartu](https://ut.ee/). The virtual Delta Building includes several interactive scenes that demonstrate the teaching and research actively done in the Delta Centre.
|
||||
|
||||
## Gameplay Sample Footage (DeltaVR 2021)
|
||||
The application works on PCVR, Meta Quest 2 and 3, HTC Vive, and regular Windows PC platforms. There is cross-platform multiplayer functionality that enables several users to be in the same virtual environment from both VR and PC platforms.
|
||||
|
||||
https://youtu.be/AoRN4eluiWY
|
||||
## Build
|
||||
|
||||
## History
|
||||
Download the **[[latest build]](https://cgvrgit.ulno.net/cgvr/DeltaVR/src/branch/master/Build.zip)** (last updated 15.09.2025)
|
||||
|
||||
2023 version:
|
||||
## Features
|
||||
|
||||
https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=77065&language=en
|
||||
### Exploration
|
||||
|
||||
(See Extras for build)
|
||||
DeltaVR features the first two floors of the Delta Educational Building for **exploration and discovery**. There are many diegetic elements representing the studies and research conducted at the Delta Building, such as robotics, the high-performance computing server room, video game development, and student life.
|
||||
|
||||
2022 version:
|
||||

|
||||
|
||||
https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=74390
|
||||
### UFO Bow Game
|
||||
|
||||
https://gitlab.com/Joonasp1/deltavr-multiplayer-builds
|
||||
At the terrace on the second floor, Delta explorers can defend the building from UFO-s using a bow and **achieve high scores**.
|
||||
|
||||
2021 version:
|
||||

|
||||
|
||||
https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=71682
|
||||
### Bolt Self-Driving Car
|
||||
|
||||
https://drive.google.com/file/d/1n19_Wa69vCX6s6zKYoSYKirpHcfJHqaM/view?usp=sharing
|
||||
The courtyard between the Educational and Entrepreneurial buildings of the Delta Centre, the explorers can see the Bolt Self-Driving Car. This car is developed by the [[http://adl.cs.ut.ee/|Autonomous Driving Lab]] of the [[https://cs.ut.ee|Institute of Computer Science]]. If one is brave enough, they can stop the car and catch a ride, simulating both the **feeling of being in a self-driving vehicle** as well as VR motion sickness.
|
||||
|
||||

|
||||
|
||||
### Space Walk
|
||||
|
||||
Where the actual Delta building has a set of skywalks connecting it with the entrepreneurship building, DeltaVR has a set of portals leading to the Space walk experience. In it, one can move in the **vastness of space** and experience **changes in gravity**. A fleet of UFO ships react to one's presence and come to investigate the arrival.
|
||||
|
||||

|
||||
|
||||
### Server Room
|
||||
|
||||
On the second floor, one can hear the humming of the servers. Should they investigate, they will find a room of server racks and a large red button. Should they push the button, they will trigger the **fire alarm** and have the server room fill with harmful invisible gas. This propms the player to escape the room. This largerly **auditory experience** is noted to be engaging and immersive. It represents the work of UT HPC in maintaining the servers of the University of Tartu.
|
||||
|
||||

|
||||
|
||||
### Interactive Map
|
||||
|
||||
To navigate the two floors of the large Delta Educational Building, explorers have an interactive map. This provides a clear overview of where they currently are and what other interactions are located across the building. Explorers can teleport to a **select interactive experiences**, while others are left for them to discover based on the hints on the map.
|
||||
|
||||

|
||||
|
||||
### Whiteboard
|
||||
|
||||
In the virtual Computer Graphics and Virtual Reality Study Lab, explorers can use spray paint cans to draw on a whiteboard. Surprisingly, this is one of the **more popular interactive experiences** of DeltaVR.
|
||||
|
||||

|
||||
|
||||
## Credits
|
||||
|
||||
**Ranno Samuel Adson**<br/>
|
||||
User experience design. Additional interactions. Interaction improvements.
|
||||
|
||||
**Toomas Tamm**<br/>
|
||||
Project architecture, model optimization, lighting. [Bachelor's Thesis](https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=71682) ([poster](https://courses.cs.ut.ee/student_projects/download/478.pdf)), [Master's Thesis](https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=77065&language=en).
|
||||
|
||||
**Joonas Püks**<br/>
|
||||
Multiplayer and cross-play functionality. [Bachelor's Thesis](https://comserv.cs.ut.ee/ati_thesis/datasheet.php?id=74390) ([poster](https://courses.cs.ut.ee/student_projects/download/534.pdf)).
|
||||
|
||||
**Raimond Tunnel**<br/>
|
||||
Project management, visual design.
|
||||
|
||||
**Timur Nizamov**<br/>
|
||||
Technical sound design.
|
||||
|
||||
Developed in the [Computer Graphcis and Virtual Reality Study Lab](https://cgvr.cs.ut.ee/) of the [Institute of Computer Science, University of Tartu](https://cs.ut.ee).
|
||||
|
||||
### Used Attributions
|
||||
|
||||
| Description | License | Source | Author |
|
||||
|-----------------------------------------------------|----------------------------------------------|---------------------------------------------------------------------------------------------|------------------|
|
||||
| Bold's car horn sound | Attribution 4.0 | [Link](https://freesound.org/people/ceberation/sounds/235506/) | ceberation |
|
||||
| Server rack model | Royalty Free, No AI License | [Link](https://www.cgtrader.com/free-3d-models/electronics/computer/simple-server-model) | anymelok |
|
||||
| Fire suppression button press sound | Creative Commons 0 | [Link](https://freesound.org/people/LamaMakesMusic/sounds/403556/) | LamaMakesMusic |
|
||||
| Fire suppression alarm sound | Attribution 3.0 | [Link](https://freesound.org/people/jobro/sounds/33737/) | jobro |
|
||||
| Fire-suppressing gas release sound | Creative Commons 0 | [Link](https://freesound.org/people/mrmccormack/sounds/182359/) | mrmccormack |
|
||||
| Coughing sound in response to fire-suppressing gas | Attribution 4.0 | [Link](https://freesound.org/people/qubodup/sounds/739416/) | qubodup |
|
||||
| Robot movement sound | Creative Commons 0 | [Link](https://freesound.org/people/Brazilio123/sounds/661435/) | Brazilio123 |
|
||||
| Spacewalk UFO sound | Attribution NonCommercial 4.0 | [Link](https://freesound.org/people/Speedenza/sounds/209366/) | Speedenza |
|
||||
| Keyboard icons | Creative Commons Attribution-NoDerivs 3.0 | [Link](https://icons8.com/) | icons8 |
|
||||
|
||||
-----
|
||||
|
||||
DeltaVR was moved to this repository in 2025. The previous repository is available here: [[https://gitlab.com/UT-CGVR/deltavr]]
|
||||
|
||||
-----
|
||||
|
||||

|
||||
|
||||
Reference in New Issue
Block a user