308 lines
14 KiB
C#
308 lines
14 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Studio.UI;
|
|
using Studio.Manage;
|
|
using Studio.Command;
|
|
using Studio.Util;
|
|
using Studio.HierarchyTree;
|
|
using System.Linq;
|
|
using System.Collections;
|
|
using Studio.AssetLibraryTree;
|
|
using Studio;
|
|
using System.Drawing.Printing;
|
|
using System.Diagnostics.Eventing.Reader;
|
|
using Studio.Core;
|
|
|
|
namespace Studio.AssetTool
|
|
{
|
|
public class CustomAssetConnector : Manager
|
|
{
|
|
public AssetLibraryPooledScrollView assetScrollView;
|
|
public AssetLibraryScrollRect assetScrollRect;
|
|
public HierarchyPooledScrollView componentScrollView;
|
|
//public Panel_ObjectDistance panel_ObjectDistance;
|
|
public GameObject renderObjectPrefab;
|
|
public float objectShowDistance = 1000.0f;
|
|
|
|
//public InterferedObjectManager interferedObjectManager;
|
|
public List<ConnectedAsset> connectedAssets = new List<ConnectedAsset>();
|
|
public List<CustomAssetData> selectedAssetDatas = new List<CustomAssetData>();
|
|
public CustomAssetData selectedAssetData;
|
|
public GameObject selectedItem;
|
|
public CustomAssetRenderObject selectRenderObject;
|
|
|
|
public System.Action onRemoveObjects;
|
|
public System.Action onAssetDropped;
|
|
|
|
public SceneDataContainer sceneDataContainer;
|
|
|
|
public override void Init()
|
|
{
|
|
//interferedObjectManager = ManagerHub.instance.Get<InterferedObjectManager>();
|
|
renderObjectPrefab = Resources.Load<GameObject>("Prefabs/PRF_RenderObject");
|
|
sceneDataContainer = GameObject.FindAnyObjectByType<SceneDataContainer>();
|
|
assetScrollRect = CanvasManager.instance.GetCanvas<Canvas_Popup>().panel_assetlibrary.scrollRect;
|
|
assetScrollView = CanvasManager.instance.GetCanvas<Canvas_Popup>().panel_assetlibrary.scrollView;
|
|
componentScrollView = CanvasManager.instance.GetCanvas<Canvas_Popup>().panel_hierarchy.scrollView;
|
|
//panel_ObjectDistance = CanvasManager.instance.GetCanvas<Canvas_Popup>().panel_objectdistance;
|
|
//InterworkingDataScrollView = EventConnector.instance.GetCanvas<Canvas_Popup>().panel_interworkingdatalist.scrollView;
|
|
|
|
assetScrollRect.onDragBegin.AddListener(OnAssetSelected);
|
|
assetScrollRect.onDragAndDrop.AddListener(OnAssetDropped);
|
|
assetScrollView.onSelect.AddListener(OnSelectAssetFromHierarchy);
|
|
|
|
componentScrollView.onParentChanged.AddListener(OnParentChanged);
|
|
componentScrollView.onSelect.AddListener(OnSelectObjectFromHierarchy);
|
|
|
|
//InterworkingDataScrollView.onSelect.AddListener(assetEventHandler.OnSelectDataFromHierarchy);
|
|
}
|
|
|
|
public void OnSelectObjectFromHierarchy(List<HierarchyItem> selectedItems)
|
|
{
|
|
if (selectedItems.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
string name = "";
|
|
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
|
var renderObjectHandler = ManagerHub.instance.Get<RenderObjectHandler>();
|
|
List<GameObject> selectedObjects = new List<GameObject>();
|
|
foreach (ConnectedAsset connectedAsset in connector.connectedAssets)
|
|
{
|
|
connectedAsset.renderObject.Deselect();
|
|
}
|
|
renderObjectHandler.RemoveAllSelections();
|
|
for (int i = 0; i < selectedItems.Count; i++)
|
|
{
|
|
ConnectedAsset searchAsset = connector.connectedAssets.Find((x) => x.hierarchyItem == selectedItems[i]);
|
|
name = i == 0 ? searchAsset.hierarchyItem.name : name.Equals(searchAsset.hierarchyItem.name) ? searchAsset.hierarchyItem.name : "-";
|
|
selectedObjects.Add(searchAsset.renderObject.gameObject);
|
|
renderObjectHandler.AddSelection(searchAsset.renderObject);
|
|
}
|
|
renderObjectHandler.ResetGizmoTargetObjects();
|
|
connector.OnSelectObjects(name, selectedObjects);
|
|
}
|
|
|
|
|
|
public void OnSelectAssetFromHierarchy(List<AssetLibraryItem> selectedItems)
|
|
{
|
|
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
|
|
connector.selectedAssetDatas.Clear();
|
|
if (selectedItems.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < selectedItems.Count; i++)
|
|
{
|
|
AssetLibraryItem assetItem = selectedItems[i];
|
|
CustomAssetData assetData = null;
|
|
if (assetItem.linkedObject)
|
|
{
|
|
assetItem.linkedObject.GetComponent<CustomAssetData>();
|
|
}
|
|
if (assetData != null)
|
|
{
|
|
connector.selectedAssetDatas.Add(assetData);
|
|
}
|
|
}
|
|
}
|
|
|
|
IEnumerator ChangeSelectedAssetTransform()
|
|
{
|
|
while (selectedAssetData != null)
|
|
{
|
|
Vector3? pos = GetMousePointOnYPlane(objectShowDistance);
|
|
if (pos.HasValue)
|
|
{
|
|
selectedItem.transform.position = pos.Value;
|
|
selectedAssetData.OnTransformDataChanged();
|
|
}
|
|
yield return null;
|
|
}
|
|
|
|
}
|
|
|
|
public GameObject CreateAsset(string name)
|
|
{
|
|
AssetLibraryItem item = assetScrollView.FindItem(name, AssetLibraryItemType.file);
|
|
OnAssetSelected(item);
|
|
GameObject obj = selectRenderObject.gameObject;
|
|
OnAssetDropped(item);
|
|
return obj;
|
|
}
|
|
|
|
|
|
private void OnLoadAssetSelected(AssetLibraryItem item, AssetData asset)
|
|
{
|
|
if (item == null || item.linkedObject == null)
|
|
{
|
|
selectedAssetData = null;
|
|
return;
|
|
}
|
|
selectedAssetData = item.linkedObject.GetComponent<CustomAssetData>();
|
|
if (selectedAssetData == null || selectedAssetData.isLoadComplete == false)
|
|
{
|
|
selectedAssetData = null;
|
|
return;
|
|
}
|
|
selectedItem = UnityEngine.GameObject.Instantiate(renderObjectPrefab);
|
|
selectRenderObject = selectedItem.GetComponent<CustomAssetRenderObject>();
|
|
//selectRenderObject.OnSelected += panel_ObjectDistance.SelectObjectFromCreate;
|
|
selectRenderObject.instantiateObject = selectedAssetData.InstantiateLoadedObject;
|
|
selectRenderObject.getBounds = selectedAssetData.GetCombinedBoundary;
|
|
selectRenderObject.CreateRenderObject();
|
|
selectRenderObject.Select();
|
|
selectedAssetData.AddTransformToRender(selectedItem.transform);
|
|
CoroutineRunner.instance.StartCoroutine(ChangeSelectedAssetTransform());
|
|
|
|
selectRenderObject.LoadCreate(asset.code, asset.topic, asset.component, asset.isAutoCreate);
|
|
var pos = new Vector3(asset.position.x, asset.position.y, asset.position.z);
|
|
var angles = selectRenderObject.transform.eulerAngles = new Vector3(asset.rotation.x, asset.rotation.y, asset.rotation.z);
|
|
var scale = new Vector3(asset.scale.x, asset.scale.y, asset.scale.z);
|
|
selectRenderObject.SetTransform(pos, angles, scale);
|
|
}
|
|
|
|
public void OnAssetSelected(AssetLibraryItem item)
|
|
{
|
|
if (item == null || item.linkedObject == null)
|
|
{
|
|
selectedAssetData = null;
|
|
return;
|
|
}
|
|
|
|
selectedAssetData = item.linkedObject.GetComponent<CustomAssetData>();
|
|
if (selectedAssetData == null || selectedAssetData.isLoadComplete == false)
|
|
{
|
|
selectedAssetData = null;
|
|
return;
|
|
}
|
|
selectedItem = UnityEngine.GameObject.Instantiate(renderObjectPrefab);
|
|
selectRenderObject = selectedItem.GetComponent<CustomAssetRenderObject>();
|
|
//selectRenderObject.OnOverlabBegin += interferedObjectManager.AddInterferedPair;
|
|
//selectRenderObject.OnOverlabEnd += interferedObjectManager.RemoveInterferedPair;
|
|
//selectRenderObject.OnSelected += panel_ObjectDistance.SelectObjectFromCreate;
|
|
selectRenderObject.instantiateObject = selectedAssetData.InstantiateLoadedObject;
|
|
selectRenderObject.getBounds = selectedAssetData.GetCombinedBoundary;
|
|
selectRenderObject.CreateRenderObject();
|
|
selectRenderObject.Select();
|
|
selectedAssetData.AddTransformToRender(selectedItem.transform);
|
|
CoroutineRunner.instance.StartCoroutine(ChangeSelectedAssetTransform());
|
|
}
|
|
|
|
public void OnAssetDropped(AssetLibraryItem item)
|
|
{
|
|
if (selectedAssetData == null)
|
|
return;
|
|
bool isPointerOutScrollRect = !assetScrollRect.IsPointerOverScrollRect();
|
|
if (item != null && isPointerOutScrollRect)
|
|
{
|
|
ConnectedAsset connectedAsset = new ConnectedAsset
|
|
{
|
|
assetData = selectedAssetData,
|
|
hierarchyItem = componentScrollView.AddItem(selectedAssetData.assetName, selectedItem, HierarchyItemType.obj),
|
|
renderObject = selectRenderObject
|
|
};
|
|
connectedAsset.renderObject.onTransformChanged = connectedAsset.assetData.OnTransformDataChanged;
|
|
var command = new CreateConnectedAssetCommand(connectedAsset);
|
|
CommandInvoker.instance.Invoke(command);
|
|
}
|
|
else
|
|
{
|
|
selectedAssetData.RemoveTransform(selectedItem.transform);
|
|
UnityEngine.GameObject.Destroy(selectedItem);
|
|
}
|
|
selectRenderObject.Deselect();
|
|
selectedAssetData = null;
|
|
onAssetDropped?.Invoke();
|
|
Debug.Log($"On Asset Dropped {item.name}");
|
|
}
|
|
|
|
public void OnParentChanged(HierarchyItem parentItem, HierarchyItem childItem)
|
|
{
|
|
ConnectedAsset parentAsset = connectedAssets.Find((x) => x.hierarchyItem == parentItem);
|
|
ConnectedAsset childAsset = connectedAssets.Find((x) => x.hierarchyItem == childItem);
|
|
if (childAsset == null || childAsset.renderObject == null)
|
|
{
|
|
return;
|
|
}
|
|
if (parentAsset == null || parentAsset.renderObject == null)
|
|
{
|
|
childAsset.renderObject.transform.parent = null;
|
|
return;
|
|
}
|
|
childAsset.renderObject.transform.parent = parentAsset.renderObject.transform;
|
|
}
|
|
public void OnLoadAsset(AssetData asset)
|
|
{
|
|
AssetLibraryItem item = assetScrollView.FindItem(asset.name, AssetLibraryItemType.file);
|
|
OnLoadAssetSelected(item, asset);
|
|
OnAssetDropped(item);
|
|
}
|
|
|
|
public void OnRestoreHierarchy(HierarchyItem parentItem, HierarchyItem childItem)
|
|
{
|
|
componentScrollView.selectedItems.Add(childItem);
|
|
componentScrollView.SetToChildItem(childItem, parentItem);
|
|
componentScrollView.DeselectAll();
|
|
}
|
|
|
|
public void OnDeselectAll()
|
|
{
|
|
var canvas_Popup = CanvasManager.instance.GetCanvas<Canvas_Popup>();
|
|
canvas_Popup.panel_objectdetails.gameObject.SetActive(false);
|
|
canvas_Popup.panel_dynamicobjectinfo.gameObject.SetActive(false);
|
|
componentScrollView.DeselectAll();
|
|
//canvas_Popup.panel_objectdistance.SetSelecetedObjectToNull();
|
|
}
|
|
|
|
public void OrderByHierarchy(List<CustomAssetRenderObject> objectsToOrder)
|
|
{
|
|
SortedDictionary<int, CustomAssetRenderObject> itemToObject = new SortedDictionary<int, CustomAssetRenderObject>();
|
|
for (int i = 0; i < objectsToOrder.Count; i++)
|
|
{
|
|
CustomAssetRenderObject objectToOrder = objectsToOrder[i];
|
|
ConnectedAsset connectedAsset = connectedAssets.Find(x => x.renderObject == objectToOrder);
|
|
itemToObject.Add(componentScrollView.GetItemIndex(connectedAsset.hierarchyItem), objectToOrder);
|
|
}
|
|
objectsToOrder = itemToObject.Values.ToList();
|
|
}
|
|
|
|
Vector3? GetMousePointOnYPlane(float maxDistance)
|
|
{
|
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
|
Plane yPlane = new Plane(Vector3.up, Vector3.zero);
|
|
if (yPlane.Raycast(ray, out float distance))
|
|
{
|
|
if (distance <= maxDistance)
|
|
{
|
|
return ray.GetPoint(distance);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
internal void OnSelectObjects(string name, List<GameObject> selectedObjects)
|
|
{
|
|
if (selectedObjects.Count == 0)
|
|
return;
|
|
var canvas_Popup = CanvasManager.instance.GetCanvas<Canvas_Popup>();
|
|
if (ManagerHub.instance.Get<RunManager>().curState == RunManager.EState.Run)
|
|
{
|
|
canvas_Popup.panel_dynamicobjectinfo.gameObject.SetActive(false);
|
|
canvas_Popup.panel_objectdetails.SetTarget(selectedObjects);
|
|
}
|
|
else
|
|
{
|
|
canvas_Popup.panel_dynamicobjectinfo.SetObjectInfo(name, selectedObjects);
|
|
canvas_Popup.panel_dynamicobjectinfo.SetActive(true);
|
|
canvas_Popup.panel_objectdetails.gameObject.SetActive(false);
|
|
}
|
|
//canvas_Popup.panel_objectdistance.SelectObjectFromClick(name, selectedObjects);
|
|
}
|
|
}
|
|
public class ConnectedAsset
|
|
{
|
|
public HierarchyItem hierarchyItem;
|
|
public CustomAssetData assetData;
|
|
public CustomAssetRenderObject renderObject;
|
|
}
|
|
} |