Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
 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);
     }
 }
Esempio n. 6
0
 public void OnDisConnectTo(ConnectItem item)
 {
     Debug.Log("OnDisConnectTo:" + item);
     if (connected.Contains(item))
     {
         connected.Remove(item);
     }
 }
Esempio n. 7
0
 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);
        }
Esempio n. 10
0
        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);
        }