Files
Studio/Assets/Scripts/Studio/AssetTool/CustomAssetConnector.cs

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