Unity 3D - Сопоставьте пары (2D)

В настоящее время я работаю над игрой в Unity3D, где вы должны щелкать пары цветов, чтобы сопоставить их, а затем они исчезают. Для этого я использую 2D-спрайты, но мне сложно с точки зрения логики стереть пару, когда оба щелкнуты мышью.

Нажмите на желтый, затем снова нажмите на желтый, чтобы оба исчезли. (Пока доска не очистится или не окрасится.)

Если щелкнуть по желтому, ничего, кроме желтого, не произойдет.

Заранее спасибо.

Вот как выглядит расположение спрайтов:

Скриншот игры

Было бы лучше дать каждому цвету тег?

Вот что я хочу сделать: когда игра запускается, она выбирает 3 цвета из массива из 6, а затем случайным образом размещает их (по 2 каждого цвета) на экране. Затем вам нужно щелкнуть цвет, например, зеленый (он будет выделен), затем щелкнуть другой зеленый цвет, и они оба исчезнут. Если вы, скажем, сначала нажмете на зеленый, а затем на желтый, игра просто закончится.

Это код, который я реализовал на данный момент:

// [...]

    if (Input.GetMouseButtonDown(0))
    {
        CastRay();
    }       
}

function CastRay() {
    var ray: Ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    var hit: RaycastHit2D = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

    if(hit.collider != null)
    {
        // Number is the amount of objects on the screen at one time.(6)
        number --;

        //Test to see if a mouse click interacts with the 2D Sprite.(Then destroys it)
        Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position + gameObject.tag);

        Destroy(hit.collider.gameObject);

    }


    // This when the number hits 0 the level restarts (To check random elements) 

    if (number == 0)
    {
        Application.LoadLevel (0);
    }
}

person taiomi    schedule 08.03.2016    source источник
comment
Привет, было бы полезно для людей, пытающихся понять и решить вашу проблему, если бы вы могли включить свою текущую реализацию (какой код вы пробовали до сих пор) и, возможно, добавить к ней комментарии относительно того, какой, по вашему мнению, должна быть логика. Затем объясните, как это не достигает ваших целей (т.е. неправильное поведение).   -  person Serlite    schedule 08.03.2016
comment
Я обновил свой вопрос @Serlite Спасибо!   -  person taiomi    schedule 09.03.2016


Ответы (1)


Вам нужно иметь две переменные, хранящие тип нажатых карт, и логическую переменную для хранения информации, если вы нажимаете первую или вторую карту (false для . А затем в событии щелчка вам нужно проверить несколько вещей: 1. Нужно проверить, если вы нажав на первую или вторую карту. Если это первая карта, проверьте логическую переменную, если она неверна. Если да: измените ее на true и покажите карту. Сохраните тип карты в переменной firsClicked. 2. Если это второй клик Ваша проверка на логическое значение должно быть истинным. В этом случае вы должны проверить, совпадает ли тип второй карты с первой картой. Если истина - прибыль. Если ложь, переверните карты. Вот и вся логика.

EDIT Хорошо, вот шаг за шагом.

  1. Вам нужна переменная GameObject для хранения круга, выбранного при первом щелчке. Скажем private GameObject firstCircle = null; . Поместите его вне вашего метода щелчка, чтобы он не инициализировался при каждом щелчке.
  2. Каждый из ваших объектов круга должен иметь несколько полей, в которых хранится их цвет. Я не знаю, как вы их устанавливаете, я предполагаю, что есть тег? Я предполагаю, что у них есть теги типа "зеленый", "красный" и так далее?
  3. В вашем событии клика вы должны иметь if-else. Что-то вроде этого (только псевдокод):

    if(firstCircle == null)
    {
    firstCircle = hit.collider.gameobject; // это сохранит первый выбранный круг для последующего сравнения
    }else{
    firstCircle = null;
    if(firstCircle.tag == hit.collider.gameObject.tag)
    {
    //здесь вы можете уничтожить оба объекта или добавить точки или что-то подобное
    Destroy(firstCircle); Destroy(hit.collider.gameObject);
    }else{
    // здесь вы делаете то, что хотите, когда круги не совпадают } }

Пожалуйста, это не просто псевдокод, и я не смог его протестировать, но я надеюсь, что вы поняли идею, стоящую за этим. Как правило, вам нужно сохранить первый круг после первого клика, чтобы сравнить его с кругом после второго клика. Имейте в виду, что вы должны проверить, не щелкнул ли пользователь один и тот же круг дважды (я не включил это здесь)

person Łukasz Motyczka    schedule 08.03.2016
comment
Привет! Спасибо, что ответили мне, что вы имеете в виду под переменными, хранящими тип нажатых карт? - person taiomi; 09.03.2016
comment
Ну, я имею в виду, что вам нужно сравнивать типы или цвета карт, которые вы нажимаете. Итак, при первом нажатии вам нужно иметь какую-то переменную для хранения типа карты. Это зависит от кода, который вы пишете, но вы можете использовать для этого string, enum или int... - person Łukasz Motyczka; 09.03.2016
comment
Спасибо за отзыв, я не очень понимаю, что вы имеете в виду - извините за боль, но не могли бы вы написать пример? Очень признателен - person taiomi; 10.03.2016