Сравните Gameobjects в цикле foreach - PullRequest
0 голосов
/ 25 апреля 2020

Я художник, обреченный написать C# код для моего колледжа: D, и я хотел бы получить здесь руку помощи:)

Проблема: у меня небольшая местность с двумя объектами на это (помещено через перетаскивание в игре), и у меня есть l oop, который должен проверить, имеет ли ObjectA то же значение (и), что и ObjectB. Так как я мог это сделать? Я пробовал с foreach l oop, но условие истинно, если один из них имеет правильное значение, а не оба.


На данный момент поле или небольшая местность проверяет все.

Он проверяет, есть ли в нем вода, если true -> continue, иначе возвращает,

, если у него есть два объекта, если true -> continue, иначе возвращает

, и если два объекты имеют одинаковые значения, иначе возвращают, если все верно, чем помещают объект ... и я застрял в последней части -> сравнивая два объекта.

Каждый объект имеет значение, целое число, есть для разных объектов ... объект один имеет значение 0, объект 2 значение 1 и т. д. c ... но игрок должен только объединить объект - значение 0 с объектом - значение 0. Что означает, если я перетаскиваю объект - значение 0 и объект - значение 1 в поле, ничего не происходит, только если я перетаскиваю объект - значение 2 и значение объекта - 2 в поле или объект - значение 3 и значение объекта - 3 .....


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

public class Plantgrowing : MonoBehaviour
{
    [SerializeField] LayerMask layer, layer2;
    [SerializeField] GameObject plantPref;
    GameObject plant;
    bool compatible = false;
    float waterlvl;
    private void Update()
    {
        Collider2D[] hitInfo = Physics2D.OverlapCircleAll(transform.position, .5f, layer);
        Collider2D[] hitInfo2 = Physics2D.OverlapCircleAll(transform.position, .5f, layer2);

        foreach(Collider2D hit in hitInfo)
        {
            if (hit && hit.gameObject.CompareTag("Field"))
            {
                waterlvl = hit.gameObject.GetComponent<Fields>().waterLevel;
            }
        }

        if (hitInfo2.Length == 2)
        {
            foreach (Collider2D hit2 in hitInfo2)
            {
                if (hit2.gameObject.GetComponent<Crop>().cropID == 1) //cropID is only a script with one single variable
                {
                    compatible = true;
                }
                else return;

                if (waterlvl >= 5 && compatible)
                {
                    if (!plant) plant = Instantiate(plantPref, new Vector3(transform.position.x, transform.position.y, -2), Quaternion.identity) as GameObject;
                    Destroy(hit2.gameObject);
                }
            }
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.green;
        Gizmos.DrawWireSphere(transform.position, .5f);
    }
} 

1 Ответ

0 голосов
/ 28 апреля 2020

Поскольку у вас есть не более двух объектов (и вы специально проверяете это), вы можете пропустить foreach l oop и обратиться к ним напрямую по их индексам

if (hitInfo2.Length == 2)
{
    if (hitInfo2[0].gameObject.GetComponent<Crop>().cropID == hitInfo2[1].gameObject.GetComponent<Crop>().cropID)
    {
       //they match
    }
}

Сложность проблемы возрастает, если Вы хотите иметь более длинные списки и хотите сравнить все элементы. Есть много решений (и все зависит от проблемы), но в вашем случае этого будет достаточно:

int crop = -1;
bool compatible = true;

foreach (Collider2D collider in hitInfo2)
{
    int candidate = collider.gameObject.GetComponent<Crop>().cropID;
    if (crop == -1)
        crop = candidate; //initialize 'crop' variable if this is the first object
    else
        compatible = crop == candidate //check if current object is the same as initial

    if (!compatible) break; //stop looping if we found an incompatible object
}

if (compatible)
    ...    //compatible now stores true/false depending on the result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...