오브젝트 선택창

This commit is contained in:
SullyunShin
2025-05-12 18:00:37 +09:00
parent d8c606fe6a
commit 8a1902d80d
30 changed files with 2625 additions and 1723 deletions

8
Assets/Materials.meta Normal file
View File

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

View File

@@ -0,0 +1,140 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-1815200313275628111
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 9
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Selected
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _DstBlendAlpha: 10
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _WorkflowMode: 1
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 0.97088087, b: 0, a: 0.39215687}
- _Color: {r: 1, g: 0.9708808, b: 0, a: 0.39215687}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7591d53ad5cbd6c46951d5be473a4771
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: AirConditioner
modelType: Resource
--- !u!1001 &356310399993745617
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: AssemblyLine
modelType: Move
--- !u!1001 &1510943800273267816
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: Container
modelType: Sink
--- !u!1001 &7399670728975469901
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: ForkLift
modelType: Move
--- !u!1001 &1036468470617570156
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: Machine
modelType: Process
--- !u!1001 &5436764548328971395
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: Pallet
modelType: Source
--- !u!1001 &2296878487467035130
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: RoboArm
modelType: Resource
--- !u!1001 &1391276699247169683
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -45,6 +45,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c1d14145e7d8b3546a7232d42ee091dc, type: 3}
m_Name:
m_EditorClassIdentifier:
modelName: StackBox
modelType: Wait
--- !u!1001 &4436474171055811137
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -0,0 +1,61 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1488549357035951910
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6645319519748063568}
- component: {fileID: 5074526274364539790}
- component: {fileID: 2996645230543678358}
m_Layer: 0
m_Name: ClickHandler
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6645319519748063568
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1488549357035951910}
serializedVersion: 2
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &5074526274364539790
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1488549357035951910}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 065cb44ed954caa4291b94d46f87785e, type: 3}
m_Name:
m_EditorClassIdentifier:
highLight: {fileID: 2996645230543678358}
--- !u!114 &2996645230543678358
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1488549357035951910}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1be79882f0b1f654e8361a2374b90194, type: 3}
m_Name:
m_EditorClassIdentifier:
highlightMaterial: {fileID: 2100000, guid: 7591d53ad5cbd6c46951d5be473a4771, type: 2}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6a9d8c08cbd13f3419d22b5bafd16c28
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a947fac65858b5246ac0544ea7bcdad0
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
using UnityEditor;
using UnityEngine;
public class ClickHandler : MonoBehaviour
{
public ClickHighlight highLight;
public ModelObjectStatus objStatus;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (UnityEngine.EventSystems.EventSystem.current?.IsPointerOverGameObject() == true)
return; // UI Ŭ¸¯ÀÌ¸é ¹«½Ã
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
if (hit.collider.TryGetComponent<IClickable>(out var clickable))
{
highLight.ShowHighlight((BoxCollider)hit.collider);
objStatus.gameObject.SetActive(true);
objStatus.SetStatus(hit.transform.GetComponent<SimulationModel>());
clickable.OnClick();
}
else
{
highLight.HideHighlight();
objStatus.gameObject.SetActive(false);
}
return;
}
highLight.HideHighlight();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 065cb44ed954caa4291b94d46f87785e

View File

@@ -0,0 +1,28 @@
using UnityEngine;
public class ClickHighlight : MonoBehaviour
{
public Material highlightMaterial; // 반투명한 머터리얼
private GameObject highlightBox;
public void ShowHighlight(BoxCollider target)
{
if (highlightBox == null)
{
highlightBox = GameObject.CreatePrimitive(PrimitiveType.Cube);
Destroy(highlightBox.GetComponent<Collider>()); // 충돌 제거
highlightBox.GetComponent<MeshRenderer>().material = highlightMaterial;
}
highlightBox.SetActive(true);
highlightBox.transform.SetParent(target.transform);
highlightBox.transform.position = target.transform.TransformPoint(target.center);
highlightBox.transform.rotation = target.transform.rotation;
highlightBox.transform.localScale = Vector3.Scale(target.transform.lossyScale, target.size);
}
public void HideHighlight()
{
if (highlightBox) highlightBox.SetActive(false);
}
}

View File

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

View File

@@ -0,0 +1,2 @@
using UnityEngine;
public interface IClickable { void OnClick(); }

View File

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

View File

@@ -7,7 +7,9 @@ public class DataManager : UnitySingleton<DataManager>
public void AddModel(SimulationModel model)
{
if (models.Any(x => x == model))
return;
return;
int objCount = models.FindAll(x => x.modelName.Contains(model.modelName)).Count;
model.modelName = model.modelName + "_" + objCount.ToString();
models.Add(model);
}
public void RemoveModel(SimulationModel model)

View File

@@ -0,0 +1,15 @@
using UnityEngine;
using TMPro;
public class ModelObjectStatus : MonoBehaviour
{
public TMP_Text textLogic;
public TMP_Text textName;
public TMP_Text textType;
public TMP_Text textID;
public void SetStatus(SimulationModel model)
{
textName.text = model.modelName;
textType.text = model.modelType;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 51caf4a2e97006b489af66aeaa813417

View File

@@ -0,0 +1,119 @@
using RTG;
using System.Collections.Generic;
using UnityEngine;
public class RTGController : UnitySingleton<RTGController>
{
public enum GizmoId
{
None = 0,
Move,
Rotate,
Scale,
Universal,
}
private ObjectTransformGizmo objectMoveGizmo;
private ObjectTransformGizmo objectRotationGizmo;
private ObjectTransformGizmo objectScaleGizmo;
private ObjectTransformGizmo objectUniversalGizmo;
private GizmoId workGizmoId;
private ObjectTransformGizmo workGizmo;
public List<GameObject> selectedObjects = new List<GameObject>();
public System.Action onTransformBegin;
public System.Action<List<GameObject>> onTransformChanged;
// Start is called once before the first execution of Update after the MonoBehaviour is created
public RTGController()
{
objectMoveGizmo = RTGizmosEngine.Get.CreateObjectMoveGizmo();
objectRotationGizmo = RTGizmosEngine.Get.CreateObjectRotationGizmo();
objectScaleGizmo = RTGizmosEngine.Get.CreateObjectScaleGizmo();
objectUniversalGizmo = RTGizmosEngine.Get.CreateObjectUniversalGizmo();
objectMoveGizmo.Gizmo.SetEnabled(false);
objectMoveGizmo.Gizmo.MoveGizmo.SetSnapEnabled(false);
objectMoveGizmo.Gizmo.MoveGizmo.SetVertexSnapEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
objectMoveGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectRotationGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectScaleGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectUniversalGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectMoveGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectRotationGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectScaleGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectUniversalGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectMoveGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectRotationGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectScaleGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectUniversalGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
workGizmo = objectMoveGizmo;
workGizmoId = GizmoId.None;
}
public void SetWorkGizmoId(GizmoId gizmoId)
{
objectMoveGizmo.Gizmo.SetEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
workGizmoId = gizmoId;
if (gizmoId == GizmoId.None)
return;
else if (gizmoId == GizmoId.Move)
workGizmo = objectMoveGizmo;
else if (gizmoId == GizmoId.Rotate)
workGizmo = objectRotationGizmo;
else if (gizmoId == GizmoId.Scale)
workGizmo = objectScaleGizmo;
else if (gizmoId == GizmoId.Universal)
workGizmo = objectUniversalGizmo;
if (selectedObjects.Count != 0)
{
workGizmo.Gizmo.SetEnabled(true);
workGizmo.RefreshPositionAndRotation();
}
}
private void OnSelectionChanged()
{
if (selectedObjects.Count != 0)
{
workGizmo.Gizmo.SetEnabled(true);
workGizmo.RefreshPositionAndRotation();
}
else
{
objectMoveGizmo.Gizmo.SetEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
}
}
public void SetGizmoTargetObjects(List<GameObject> objects)
{
selectedObjects.Clear();
selectedObjects.AddRange(objects);
objectMoveGizmo.SetTargetObjects(selectedObjects);
objectRotationGizmo.SetTargetObjects(selectedObjects);
objectScaleGizmo.SetTargetObjects(selectedObjects);
objectUniversalGizmo.SetTargetObjects(selectedObjects);
}
private void OnGizmoDragBegin(Gizmo gizmo, int t)
{
onTransformBegin?.Invoke();
}
private void OnGizmoDragUpdate(Gizmo gizmo, int t)
{
onTransformChanged?.Invoke(selectedObjects);
}
private void OnGizmoDragEnd(Gizmo gizmo, int t)
{
onTransformChanged?.Invoke(selectedObjects);
}
}

View File

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

View File

@@ -0,0 +1,16 @@
using UnityEngine;
public class ShowModelInfo : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6816e63c00bfdd94eb00e7fab432c582

View File

@@ -1,8 +1,17 @@
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
public class SimulationModel : MonoBehaviour
public class SimulationModel : MonoBehaviour, IClickable
{
public string modelName;
public string modelType;
public string modelID;
private bool isQuitting = false;
void Awake()
{
FitCollider();
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
@@ -27,5 +36,25 @@ public class SimulationModel : MonoBehaviour
void OnApplicationQuit()
{
isQuitting = true;
}
}
public void OnClick()
{
Debug.Log("Clicked : " + gameObject.name);
}
void FitCollider()
{
var renderers = GetComponentsInChildren<Renderer>();
if (renderers.Length == 0) return;
Bounds bounds = renderers[0].bounds;
foreach (var r in renderers)
bounds.Encapsulate(r.bounds);
BoxCollider collider = GetComponent<BoxCollider>();
if (!collider) collider = gameObject.AddComponent<BoxCollider>();
collider.center = transform.InverseTransformPoint(bounds.center);
collider.size = transform.InverseTransformVector(bounds.size);
}
}