Added BaseModelSelector

This commit is contained in:
lachs218
2025-04-28 23:49:48 +02:00
parent 1ecb2f08dc
commit a2f368ce85
34 changed files with 339 additions and 13814 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 741bba6a653985f469595bf3c986afe7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3caefcfecae64c74cb9f6985827a6ca9
guid: 3f76d1e5fb6326b40b55314712538ea1
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -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

View File

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

View 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

View File

@@ -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);
}
}

View File

@@ -24,8 +24,5 @@ public class ChildModelBehaviour : ModelBehaviour
}
}
public void UpdateModel(ChildModel model)
{
base.UpdateModel(model);
}
}

View File

@@ -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())
{

View File

@@ -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")),

View File

@@ -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.");
}
}

View 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;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a216c818db33d894387e9533b925b3d5