Как предотвратить перетаскивание, если узел не нулевой [C #] - PullRequest
0 голосов
/ 17 марта 2020

У меня проблема с перетаскиванием в игре. Я хочу заблокировать пользователя, если он перетаскивает объект снизу вверх, если у него есть палки под одинаковыми углами. если они не так, это нормально. Но если у них есть хотя бы одна палка в одном направлении, то палка должна go вернуться вниз к первой позиции.

Я немного растерялся. Можете ли вы помочь, пожалуйста:)

вот код, куда я перетаскиваю и вращение ...

Здесь на группе сгенерированных пи c может поместиться только 1. и 3. мест.

using System.Collections;

с использованием System.Collections.Generic; using UnityEngine;

publi c class InputController: MonoBehaviour {

float clickTime;
RaycastHit2D rayhit;
float smallestDistance = 1.5f;
int smallestId = 1;
public Transform[] nodes;
public LayerMask selectableObjLayerMask;


void Update()
{


    if (Input.GetMouseButtonDown(0))
    {

        clickTime = Time.time;
        rayhit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, Mathf.Infinity, selectableObjLayerMask);
    }
    else if (Input.GetMouseButtonUp(0))
    {
        if (rayhit)
        {
            if (Time.time - clickTime < .2f)
            {
                Node node = rayhit.transform.GetComponent<Node>();
                if (node != null)
                {
                    for (int i = 0; i < node.sticks.Count; i++)
                    {
                        Vector3 newAngles = new Vector3(0, 0, (node.sticks[i].transform.localEulerAngles.z - 45));
                        newAngles.z = newAngles.z < 0 ? newAngles.z + 180 : newAngles.z;
                        newAngles.z = newAngles.z >180 ? newAngles.z - 180 : newAngles.z;
                        node.sticks[i].transform.localEulerAngles = newAngles;

                        node.sticks[i].degree = (int)newAngles.z;
                        Debug.Log(i + " = " + node.sticks[i].degree);


                    }

                }
            }
            else 
            {
                Node currNode = rayhit.transform.GetComponent<Node>();
                if(currNode.isMoved == false)
                {
                    smallestId = 0;
                    smallestDistance = 999;
                    for (int i = 0; i < nodes.Length; i++)
                    {

                        float distance = Vector2.Distance(rayhit.transform.position, nodes[i].transform.position);
                        if (smallestDistance > distance)
                        {
                            smallestDistance = distance;
                            smallestId = i;

                            Debug.Log("Obje : " + currNode);
                        }
                    }

                    rayhit.transform.position = nodes[smallestId].transform.position;
                    if (rayhit.transform.parent != nodes[smallestId].transform)
                    { 
                        if (nodes[smallestId].transform.childCount > 0 && nodes[smallestId].transform != rayhit.transform.parent)
                        {
                            if (currNode != null)
                            {
                                for (int i = 0; i < currNode.sticks.Count; i++)
                                {
                                    nodes[smallestId].transform.GetChild(0).GetComponent<Node>().sticks.Add(currNode.sticks[i]);
                                    currNode.sticks[i].transform.SetParent(nodes[smallestId].transform.GetChild(0));
                                }
                                Destroy(rayhit.transform.gameObject);
                            }
                        }
                        else
                        {
                            if (currNode != null)
                            {
                                currNode.isMoved = true;
                            }
                            rayhit.transform.SetParent(nodes[smallestId].transform);
                        }
                    }

                }

            }               

        }
        rayhit = new RaycastHit2D();

    }
    else if (Input.GetMouseButton(0))
    {
        if(rayhit.transform != null)
        {
            Node currNode = rayhit.transform.GetComponent<Node>();
            if(currNode != null)
                if (currNode.isMoved == false)
                {
                    if (Time.time - clickTime >= 0.2f)
                    {
                        Vector2 newPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                        rayhit.transform.position = newPos;
                    }
                }
        }


    }
}

}

...