Как обнаружить столкновение на конкретном объекте? - PullRequest
0 голосов
/ 20 ноября 2018

Предположим, у нас есть два цилиндра в сценах с красными и синими материалами на них.Кроме того, у нас есть два изображения пользовательского интерфейса с красным и синим фоном.Теперь, что я должен сделать, чтобы красное изображение перетаскивалось только на красный цилиндр, а синее изображение - только на синий цилиндр.
Если я перетаскиваю красное изображение на синий цилиндр, то должно появиться сообщение об ошибке:
То же самое для перетаскивания синего изображения на красный цилиндр или наоборот.

См. рисунок ниже

Example

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class wrench : MonoBehaviour {

    public bool Dragging = false;
    public bool collision = false;
    Vector3 position;
    public List<GameObject> UIimages;

    public void BeginDrag() {

        position = gameObject.transform.position;
        Dragging = true;
        foreach (GameObject obj in UIimages) {
            obj.GetComponent<BoxCollider2D> ().enabled = false;
        }
    }

    public void Drag() {
        transform.position = Input.mousePosition;
    }

    public void Drop() {
        if (!collision) {
            gameObject.transform.position = position;
        }
        Dragging = false;
    }
}

1 Ответ

0 голосов
/ 21 ноября 2018

Предполагая, что ваши дропс уже обнаружены, как вы говорите, и вопрос больше в том, как различать объекты, я бы использовал простой enum например

public enum WhichObject
{
    red,
    blue
}

преимущество в том, что позже вы можете оченьлегко добавлять дополнительные параметры, не имея дело со слоями, тегами и т. д.

В GameObject вы перетаскиваете добавить компонент, например,

public class ObjectInformation
{
    public WhichObject IsObject;
}

и просто выбираете в Инспекторе (или, если вы порождаетечерез скрипт) для каждого из перетаскиваемых объектов, значение которого должно иметь переменная WhichObject.

Чем на целевых объектах, где вы обнаруживаете столкновение, также добавьте переменную WhichObject, но на этот раз настройте значение, которое выожидайте, что его здесь отбросят

public WhichObject ExpectedObject;

, снова установите его через инспектор или скрипт.

Чем просто добавить чек

var info = droppedObject.GetComponent<ObjectInformation>();

// Something else dropped?
if(!info) return;

// Now check if the value matches
// the one this object expects
if(info.IsObject == ExpectedObject)
{
    // Correct object
    Debug.Log("Yeah!");
} 
else 
{
    // Wrong object
    Debug.LogFormat("Dropped object {0} does not match the expected object {1}!", info.IsObject, ExpectedObject);
}

Позже вы также можетепросто расширьте его, используя несколько перечислений, таких как, например, цвета, формы и т. д.

И, возможно, вы могли бы также сделать проверку наоборот и проверить перетаскиваемый объект, если values ​​match и если не совпадают, даже не позволяют быть отброшенными на этом целевом объекте (это, конечно, зависит от вашей реализации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...