Added BaseModelSelector
This commit is contained in:
8
vr-configurator/Assets/Resources/Model.meta
Normal file
8
vr-configurator/Assets/Resources/Model.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 741bba6a653985f469595bf3c986afe7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3caefcfecae64c74cb9f6985827a6ca9
|
||||
guid: 3f76d1e5fb6326b40b55314712538ea1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -1,24 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e3a436e0ac6013f41999e23f2cc91370
|
||||
guid: 30167eeed586e01418cf36c1fe08bbdb
|
||||
ModelImporter:
|
||||
serializedVersion: 21300
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects:
|
||||
- first:
|
||||
type: UnityEngine:Material
|
||||
assembly: UnityEngine.CoreModule
|
||||
name: Mat Body
|
||||
second: {fileID: 2100000, guid: 86b0e327e34d45a489cc1e0096edff2b, type: 2}
|
||||
- first:
|
||||
type: UnityEngine:Material
|
||||
assembly: UnityEngine.CoreModule
|
||||
name: Mat Wheel
|
||||
second: {fileID: 2100000, guid: 04831b0bba159ed47af586ccb6e43617, type: 2}
|
||||
- first:
|
||||
type: UnityEngine:Material
|
||||
assembly: UnityEngine.CoreModule
|
||||
name: Textures
|
||||
second: {fileID: 2100000, guid: 3f0438abbf599464ab68c0998808a76b, type: 2}
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
@@ -29,10 +14,8 @@ ModelImporter:
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 1
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
@@ -55,6 +38,7 @@ ModelImporter:
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
@@ -82,6 +66,7 @@ ModelImporter:
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
@@ -114,16 +99,9 @@ ModelImporter:
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 262688
|
||||
packageName: Low-Poly Bicycle # 5
|
||||
packageVersion: 1.0
|
||||
assetPath: Assets/Models/Bicycle Models/Bicycle Model #5/Models/Low-Poly Bicycle
|
||||
# 5.FBX
|
||||
uploadId: 614110
|
||||
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
8
vr-configurator/Assets/Resources/Model/ERLbach.meta
Normal file
8
vr-configurator/Assets/Resources/Model/ERLbach.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a6438ab4730fc1499301a7bc95957c6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,11 @@
|
||||
using System;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
//Only one should exist at the same time
|
||||
public class BaseModelBehaviour : ModelBehaviour
|
||||
{
|
||||
BaseModel baseModel
|
||||
public BaseModel baseModel
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -16,11 +18,10 @@ public class BaseModelBehaviour : ModelBehaviour
|
||||
set
|
||||
{
|
||||
model = value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void UpdateChildPorts(BaseModel model)
|
||||
{
|
||||
base.UpdateModel(model);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,8 +24,5 @@ public class ChildModelBehaviour : ModelBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateModel(ChildModel model)
|
||||
{
|
||||
base.UpdateModel(model);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using Meta.XR.ImmersiveDebugger.UserInterface;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
@@ -6,7 +8,20 @@ using UnityEngine;
|
||||
/// </summary>
|
||||
public class ModelBehaviour : MonoBehaviour
|
||||
{
|
||||
internal Model model; //should be verified
|
||||
private Model _model;
|
||||
|
||||
internal Model model
|
||||
{
|
||||
get
|
||||
{
|
||||
return _model;
|
||||
}
|
||||
set
|
||||
{
|
||||
_model = value;
|
||||
UpdateModel( value);
|
||||
}
|
||||
} //should be verified
|
||||
internal List<GameObject> children;
|
||||
internal MeshFilter meshFilter;
|
||||
internal MeshRenderer meshRenderer;
|
||||
@@ -28,7 +43,7 @@ public class ModelBehaviour : MonoBehaviour
|
||||
meshRenderer = renderer;
|
||||
}
|
||||
|
||||
internal void UpdateModel(Model _model)
|
||||
private void UpdateModel(Model _model)
|
||||
{
|
||||
//kill old children
|
||||
foreach (var go in GetComponentsInChildren<ChildModelBehaviour>())
|
||||
@@ -36,7 +51,7 @@ public class ModelBehaviour : MonoBehaviour
|
||||
Debug.Log($"Destroying {go.name}");
|
||||
Destroy(go); // will be destroyed next frame
|
||||
}
|
||||
model = _model;
|
||||
|
||||
//spawn new childPorts
|
||||
if (model.hasPorts())
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@ public class ModelList
|
||||
{
|
||||
new BaseModel(
|
||||
"Fahrrad", "bike",
|
||||
Resources.Load<Mesh>("Bicycle/Models/Low-Poly Bicycle # 5"),
|
||||
Resources.Load<Mesh>($"Model/Bicycle/Models/Low-Poly Bicycle"),
|
||||
new Material(Shader.Find("VR/SpatialMapping/Occlusion")),
|
||||
new List<Port>
|
||||
{ //please dont ask about the numbers
|
||||
@@ -87,7 +87,7 @@ public class ModelList
|
||||
"idBikeWheel_Back1",
|
||||
"idBikeWheel_Front1",
|
||||
},
|
||||
Resources.LoadAll<Mesh>("Bicycle/Models/Low-Poly Bicycle # 5"),
|
||||
Resources.LoadAll<Mesh>($"Model/Bicycle/Models/Low-Poly Bicycle"),
|
||||
new Material[6] //mat
|
||||
{
|
||||
new Material(Shader.Find("VR/SpatialMapping/Occlusion")),
|
||||
|
||||
@@ -12,7 +12,8 @@ public class ModelManager : MonoBehaviour
|
||||
public List<BaseModel> baseModelList; //available BaseModels
|
||||
|
||||
public GameObject baseModel; //current baseModel
|
||||
|
||||
public AutoModelSelector autoModelSelector;
|
||||
|
||||
HashSet<ChildModel>.Enumerator enumerator;
|
||||
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
@@ -26,6 +27,7 @@ public class ModelManager : MonoBehaviour
|
||||
{
|
||||
registerBaseModel(baseModel);
|
||||
}
|
||||
|
||||
foreach (var childModel in ModelList.ChildModels)
|
||||
{
|
||||
registerChildModel(childModel);
|
||||
@@ -35,9 +37,10 @@ public class ModelManager : MonoBehaviour
|
||||
//TODO: send into model selection
|
||||
Debug.LogError("baseModel is null, fix the configuration");
|
||||
}
|
||||
baseModel.GetComponent<BaseModelBehaviour>().UpdateModel(baseModelList[0]); //TODO: change later when there is a model selection
|
||||
//baseModel.GetComponent<BaseModelBehaviour>().UpdateModel(baseModelList[0]); //TODO: change later when there is a model selection
|
||||
|
||||
enumerator = getChildModelsForPort("bikeB").GetEnumerator(); //TODO: implement GUI later
|
||||
|
||||
enumerator = getChildModelsForPort("bikeB").GetEnumerator(); // TODO: GUI später
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
@@ -45,9 +48,8 @@ public class ModelManager : MonoBehaviour
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Space)) //TODO: remove after testing
|
||||
{
|
||||
Debug.Log($"Space key was pressed {enumerator.Current}");
|
||||
baseModel.GetComponent<BaseModelBehaviour>().setFirstWithPort("bikeB", enumerator.Current);
|
||||
enumerator.MoveNext();
|
||||
Debug.Log($"Space key was pressed a{enumerator.Current}");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,11 +88,43 @@ public class ModelManager : MonoBehaviour
|
||||
|
||||
public HashSet<ChildModel> getChildModelsForPort(string port)
|
||||
{
|
||||
return portDict[port];
|
||||
// Überprüfen, ob der Schlüssel im Dictionary vorhanden ist
|
||||
if (portDict.TryGetValue(port, out HashSet<ChildModel> childModels))
|
||||
{
|
||||
return childModels; // Gibt die ChildModels zurück, die zu diesem Port gehören
|
||||
}
|
||||
else
|
||||
{
|
||||
// Wenn der Schlüssel nicht gefunden wird, gebe eine Warnung aus und gebe null oder ein leeres Set zurück
|
||||
Debug.LogWarning($"Kein Modell für den Port {port} gefunden.");
|
||||
return new HashSet<ChildModel>(); // Leeres Set zurückgeben
|
||||
}
|
||||
}
|
||||
|
||||
public ChildModel getById(string id)
|
||||
{
|
||||
return childModelDict[id];
|
||||
}
|
||||
|
||||
public void LoadSelectedModel(BaseModel baseModel)
|
||||
{
|
||||
if (this.baseModel == null)
|
||||
{
|
||||
// Neues GameObject für das BaseModel erstellen
|
||||
this.baseModel = new GameObject(baseModel.nameId);
|
||||
this.baseModel.AddComponent<BaseModelBehaviour>();
|
||||
// Positionieren
|
||||
this.baseModel.transform.position = new Vector3(0, 0, 1);
|
||||
this.baseModel.transform.rotation = Quaternion.Euler(0, 90, 0);
|
||||
}
|
||||
|
||||
this.baseModel.GetComponent<BaseModelBehaviour>().baseModel = baseModel;
|
||||
Debug.Log($"Modell {baseModel.nameHuman} geladen und platziert.");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
158
vr-configurator/Assets/Scripts/UI/AutoModelSelector.cs
Normal file
158
vr-configurator/Assets/Scripts/UI/AutoModelSelector.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.InputSystem.UI;
|
||||
|
||||
public class AutoModelSelector : MonoBehaviour
|
||||
{
|
||||
private Canvas canvas;
|
||||
private GameObject buttonPrefab;
|
||||
private Button[] modelButtons;
|
||||
private BaseModel selectedModel = null; // Gemerkte Auswahl!
|
||||
|
||||
public ModelManager modelManager; // <-- ziehen wir im Inspector rein
|
||||
void Start()
|
||||
{
|
||||
SetupEventSystem();
|
||||
SetupCanvas();
|
||||
SetupButtonPrefab();
|
||||
CreateButtons();
|
||||
}
|
||||
|
||||
void SetupEventSystem()
|
||||
{
|
||||
if (FindObjectOfType<EventSystem>() == null)
|
||||
{
|
||||
GameObject eventSystemGO = new GameObject("EventSystem");
|
||||
var eventSys = eventSystemGO.AddComponent<EventSystem>();
|
||||
var inputModule = eventSystemGO.AddComponent<UnityEngine.InputSystem.UI.InputSystemUIInputModule>(); //TODO: wenn Brille nicht klappt das auskommentieren
|
||||
var MetaInputModule = eventSystemGO.AddComponent<OVRInputModule>();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("EventSystem existiert bereits — neues wird nicht erstellt.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetupCanvas()
|
||||
{
|
||||
GameObject canvasGO = new GameObject("ModelSelectorCanvas");
|
||||
canvas = canvasGO.AddComponent<Canvas>();
|
||||
canvas.renderMode = RenderMode.WorldSpace;
|
||||
|
||||
var cameraRig = GameObject.Find("[BuildingBlock] Camera Rig");
|
||||
if (cameraRig != null)
|
||||
{
|
||||
var centerEye = cameraRig.transform.Find("TrackingSpace/CenterEyeAnchor");
|
||||
canvas.worldCamera = centerEye.GetComponent<Camera>();
|
||||
canvas.transform.position = centerEye.position + centerEye.forward * 2f;
|
||||
canvas.transform.rotation = Quaternion.LookRotation(canvas.transform.position - centerEye.position);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Camera Rig nicht gefunden!");
|
||||
}
|
||||
|
||||
canvasGO.AddComponent<CanvasScaler>().uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
|
||||
canvasGO.AddComponent<GraphicRaycaster>();
|
||||
canvasGO.AddComponent<OVRRaycaster>();
|
||||
}
|
||||
|
||||
void SetupButtonPrefab()
|
||||
{
|
||||
buttonPrefab = new GameObject("ButtonPrefab");
|
||||
buttonPrefab.SetActive(false); // Vorlage bleibt unsichtbar
|
||||
buttonPrefab.AddComponent<RectTransform>();
|
||||
|
||||
var image = buttonPrefab.AddComponent<Image>();
|
||||
image.color = Color.white;
|
||||
|
||||
var button = buttonPrefab.AddComponent<Button>();
|
||||
button.transition = Selectable.Transition.ColorTint;
|
||||
|
||||
GameObject textGO = new GameObject("Text");
|
||||
textGO.transform.SetParent(buttonPrefab.transform);
|
||||
Text text = textGO.AddComponent<Text>();
|
||||
text.font = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf");
|
||||
text.alignment = TextAnchor.MiddleCenter;
|
||||
text.color = Color.black;
|
||||
text.resizeTextForBestFit = true;
|
||||
|
||||
RectTransform textRT = textGO.GetComponent<RectTransform>();
|
||||
textRT.anchorMin = Vector2.zero;
|
||||
textRT.anchorMax = Vector2.one;
|
||||
textRT.offsetMin = Vector2.zero;
|
||||
textRT.offsetMax = Vector2.zero;
|
||||
|
||||
var collider = buttonPrefab.AddComponent<BoxCollider>();
|
||||
collider.size = new Vector3(160, 40, 1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CreateButtons()
|
||||
{
|
||||
float startY = 0; // Anfangsposition auf Y-Achse
|
||||
float buttonHeight = 60f; // Abstand zwischen den Buttons
|
||||
|
||||
foreach (var baseModel in ModelList.BaseModels)
|
||||
{
|
||||
GameObject buttonGO = Instantiate(buttonPrefab, canvas.transform);
|
||||
buttonGO.SetActive(true);
|
||||
var collider = buttonGO.AddComponent<BoxCollider>();
|
||||
RectTransform rt = buttonGO.GetComponent<RectTransform>();
|
||||
rt.sizeDelta = new Vector2(300, 50);
|
||||
rt.localScale = Vector3.one * 0.005f;// Größe des Buttons
|
||||
rt.localPosition = new Vector3(0, startY, 0); // Position im Canvas
|
||||
rt.localRotation = Quaternion.identity;
|
||||
|
||||
// Collider richtig setzen
|
||||
collider.size = new Vector3(rt.sizeDelta.x * rt.localScale.x, rt.sizeDelta.y * rt.localScale.y, 1f);
|
||||
collider.center = Vector3.zero;
|
||||
|
||||
Button button = buttonGO.GetComponent<Button>();
|
||||
button.GetComponentInChildren<Text>().text = baseModel.nameHuman;
|
||||
|
||||
|
||||
|
||||
|
||||
// WICHTIG: Capture der richtigen baseModel in einer lokalen Variable
|
||||
BaseModel modelToSelect = baseModel;
|
||||
button.onClick.AddListener(() => OnModelButtonClicked(modelToSelect));
|
||||
|
||||
startY -= buttonHeight; // Nächster Button weiter unten
|
||||
}
|
||||
}
|
||||
// Wenn ein Button geklickt wird
|
||||
public void OnModelButtonClicked(BaseModel model)
|
||||
{
|
||||
selectedModel = model;
|
||||
Debug.Log($"Ausgewähltes Modell: {selectedModel.nameHuman}");
|
||||
|
||||
if (modelManager != null)
|
||||
{
|
||||
modelManager.LoadSelectedModel(selectedModel);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("ModelManager ist nicht zugewiesen!");
|
||||
}
|
||||
// --> Canvas unsichtbar machen!
|
||||
if (canvas != null)
|
||||
{
|
||||
canvas.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Öffentliche Funktion: Aktuell gewähltes Modell zurückgeben
|
||||
public BaseModel GetSelectedModel()
|
||||
{
|
||||
return selectedModel;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a216c818db33d894387e9533b925b3d5
|
||||
Reference in New Issue
Block a user