【问题标题】:Compare Gameobjects in a foreach loop在 foreach 循环中比较游戏对象
【发布时间】:2020-04-28 19:46:02
【问题描述】:

我是一名艺术家,注定要为我的大学编写 C# 代码 :D,我很想在这里得到帮助 :)

问题:我有一个小地形,上面有两个对象(通过拖放游戏放置),我在这里有我的循环,它必须检查 ObjectA 是否与 ObjectB 具有相同的值。那么我该怎么做呢?我尝试使用 foreach 循环,但如果其中一个具有正确的值,而不是两者都具有正确的值,则条件为真。


目前,场地或小地形正在检查一切。

它检查是否有水,如果为真 -> 继续,否则返回,

如果它有两个对象,如果为真 -> 继续,否则返回

如果两个对象具有相同的值,则返回,如果一切都为真,则放置对象......我被困在最后一部分 -> 比较两个对象。

每个对象都有一个值,一个整数,有不同的对象...对象一的值是 0,对象 2 的值是 1 等等...但是玩家应该只将对象 - 值 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,对象 2 的值为 1 等等...但玩家只能将对象 - 值 0 与对象 - 值 0 组合。这意味着,如果我将对象 - 值 0 和对象 - 值 1 拖到字段上,则只有当我将对象 - 值 2 和对象值 - 2 拖到字段上时,才会发生任何事情。

标签: c# loops unity3d


【解决方案1】:

由于您最多只有两个对象(并且您专门检查过),因此您可以跳过 foreach 循环并直接通过它们的索引来处理它们

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多