public static LineRenderer TryConnect(ConnectItem itemA, ConnectItem itemB, ConnectNode.PointGroup pointInfo) { if (itemA.OperateAble && itemB.OperateAble) { itemA.OnConnectTo(itemB); itemB.OnConnectTo(itemA); Transform parent = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemA.transform : itemB.transform; string targetName = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemB.Name : itemA.name; var target = parent.Find(targetName); var lineRender = target == null ? null : target.GetComponent <LineRenderer>(); if (lineRender == null) { lineRender = new GameObject(targetName, typeof(LineRenderer)).GetComponent <LineRenderer>(); lineRender.transform.SetParent(parent); } UpdateLineStyle(lineRender, pointInfo.width, pointInfo.material); lineRender.positionCount = 2; var posA = itemA.RetriveFeature <ClickAbleFeature>().collider.transform.position; var posB = itemB.RetriveFeature <ClickAbleFeature>().collider.transform.position; lineRender.SetPositions(new Vector3[] { posA, posB }); // return(lineRender); } else { if (HaveConnected(itemA, itemB)) { Transform parent = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemA.transform : itemB.transform; string targetName = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemB.Name : itemA.name; return(parent.Find(targetName).GetComponent <LineRenderer>()); } return(null); } }
public void OnConnectTo(ConnectItem item) { if (!connected.Contains(item)) { connected.Add(item); } }
private void TryConnect(ConnectItem otherItem) { if (!Input.GetMouseButtonDown(0)) { return; } ConnectItem element1 = firstItem; ConnectItem element2 = otherItem; bool canConnect = false; ConnectNode.PointGroup groupInfo = null; var node = SuarchOneNode(element1.Name, element2.Name, out groupInfo); if (node != null) { canConnect = ConnectUtil.TryConnect(element1, element2, groupInfo); node.TryComplete(); } ClearStarteds(); if (!canConnect && onError != null) { onError.Invoke(string.Format("{0}和{1}两点不需要连接", element1, element2)); } }
private bool TryHitNode(out ConnectItem connectItem) { ray = viewCamera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, hitDistence, LayerMask.GetMask(ConnectItem.layer))) { var hited = hit.collider.GetComponentInParent <ConnectItem>(); if (hited == null) { connectItem = null; return(false); } if (onHoverItem != null) { onHoverItem(hited); } if (Input.GetMouseButtonDown(0)) { connectItem = hited; if (onSelectItem != null) { onSelectItem(connectItem); } return(true); } } connectItem = null; return(false); }
private void ClearNoticePoss(ConnectItem content) { foreach (var item in noticed) { content.UnNotice(item); } }
public void OnDisConnectTo(ConnectItem item) { Debug.Log("OnDisConnectTo:" + item); if (connected.Contains(item)) { connected.Remove(item); } }
public static bool HaveConnected(ConnectItem itemA, ConnectItem itemB) { if (itemA == null || itemB == null) { return(false); } return(Array.Find(itemA.Connected, x => x == itemB) && Array.Find(itemB.Connected, x => x == itemA)); }
private void ClearStarteds() { ClearNoticePoss(firstItem); firstItem = null; positons.Clear(); #if UNITY_5_6_OR_NEWER line.positionCount = 1; #else line.SetVertexCount(1); #endif }
private void QuickConnectItems() { ConnectItem[] list = null; if (collectNodeFeature.finalGroup != null) { list = Array.ConvertAll(collectNodeFeature.finalGroup, x => x as ConnectItem); } else { list = new ConnectItem[elements.Length]; } //找到所有的组合,并判断是否已经连接 for (int i = 0; i < connectGroup.Length; i++) { var groupi = connectGroup[i]; var idA = Array.IndexOf(elements, groupi.p1); var idB = Array.IndexOf(elements, groupi.p2); var itemA = list[idA] as ConnectItem; var itemB = list[idB] as ConnectItem; if (ConnectUtil.HaveConnected(itemA, itemB)) { continue; } var itemAName = groupi.p1; var itemBName = groupi.p2; itemA = itemA != null ? itemA : collectNodeFeature.elementPool.Find(x => x.Name == itemAName && x is ConnectItem && x.OperateAble) as ConnectItem; itemB = itemB != null ? itemB : collectNodeFeature.elementPool.Find(x => x.Name == itemBName && x is ConnectItem && x.OperateAble) as ConnectItem; Debug.Assert(itemA != null && itemB != null); var connected = ConnectUtil.TryConnect(itemA, itemB, groupi); Debug.Assert(connected); list[idA] = itemA; list[idB] = itemB; } OnConnectOK(list); }
public static bool TryDisconnect(ConnectItem itemA, ConnectItem itemB) { if (itemA != null && itemB != null) { itemA.OnDisConnectTo(itemB); itemB.OnDisConnectTo(itemA); Transform parent = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemA.transform : itemB.transform; string targetName = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemB.Name : itemA.name; var target = parent.Find(targetName); var lineRender = target == null ? null : target.GetComponent <LineRenderer>(); if (lineRender != null) { lineRender.positionCount = 0; } return(true); } return(false); }
private IEnumerator AutoConnectItems() { ConnectItem[] list = new ConnectItem[elements.Length]; Debug.Log("自动连接未完成部分"); for (int i = 0; i < connectGroup.Length; i++) { var groupi = connectGroup[i]; var idA = Array.IndexOf(elements, groupi.p1); var idB = Array.IndexOf(elements, groupi.p2); var itemA = list[idA] as ConnectItem; var itemB = list[idB] as ConnectItem; if (ConnectUtil.HaveConnected(itemA, itemB)) { continue; } var itemAName = groupi.p1; var itemBName = groupi.p2; itemA = itemA != null ? itemA : collectNodeFeature.elementPool.Find(x => x.Name == itemAName && x is ConnectItem && x.OperateAble) as ConnectItem; itemB = itemB != null ? itemB : collectNodeFeature.elementPool.Find(x => x.Name == itemBName && x is ConnectItem && x.OperateAble) as ConnectItem; Debug.Assert(itemA != null && itemB != null); var parent = itemA.GetInstanceID() > itemB.GetInstanceID() ? itemA : itemB; var lineRender = ConnectUtil.TryConnect(itemA, itemB, groupi); for (float timer = 0; timer < autoTime; timer += Time.deltaTime) { var pos = Vector3.Lerp(itemA.transform.position, itemB.transform.position, timer / autoTime); lineRender.SetPositions(new Vector3[] { itemA.transform.position, pos }); yield return(null); } list[idA] = itemA; list[idB] = itemB; } OnConnectOK(list); OnEndExecute(false); }
public void TryComplete() { var list = new ConnectItem[elements.Length]; //找到所有的组合,并判断是否已经连接 for (int i = 0; i < connectGroup.Length; i++) { var groupi = connectGroup[i]; var itemAName = groupi.p1; var itemBName = groupi.p2; var itemAID = Array.IndexOf(elements, itemAName); var itemBID = Array.IndexOf(elements, itemBName); ConnectItem itemA = collectNodeFeature.elementPool.Find(x => x.Name == itemAName && x is ConnectItem) as ConnectItem; ConnectItem itemB = collectNodeFeature.elementPool.Find(x => x.Name == itemBName && x is ConnectItem) as ConnectItem; if (itemA != null && itemB != null) { if (!ConnectUtil.HaveConnected(itemA, itemB)) { return; } else { list[itemAID] = itemA; list[itemBID] = itemB; } } else { return; } } OnConnectOK(list); OnEndExecute(false); }