【问题标题】:How to get a list to correctly count the total number of int in Unity如何获取列表以正确计算 Unity 中的 int 总数
【发布时间】:2020-04-29 20:54:13
【问题描述】:

我知道我一定是做错了什么,但是在用头撞了 8 个小时之后,我似乎无法发现我哪里出错了。

我有 2 个游戏对象“Block1”、“Block2”。当他们进入圈子时,我希望能够计算总块数。为此,我执行了以下操作:

在每个块上放置一个名为 NumberBlock 的脚本。然后我使用以下脚本将块转换为其整数: 公共整数; 字符串str;

private void Awake()
{
    str = gameObject.transform.name; //first get the name

    str = str.Substring(str.Length -1, 1); //remove all words apart from number
    int.TryParse(str, out number); //convert string to number


}

这成功地给我留下了 int number = 1、2 等。

然后我将方块推入球体。球体有一个执行以下操作的脚本: 1-创建一个空的整数列表 2- OnTriggerEnter 检查对象标签不是玩家或地面 3- 获取对象 Numberblock Script 并检查块“IntNumber”,然后将其添加到 InCircle 列表中。最后一个 foreach 将每个数字相加得到一个总数(TotalBlocks)。

//跟踪圆圈中有多少个数字 public List InCircle = new List();

//add the total number in the blocks
public int BlockNumber;
public int TotalBLocks;

private void OnTriggerEnter(Collider other)
{

    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    //get the blocks number
    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

      //add block number to the list
      InCircle.Add(BlockNumber);

    foreach (int e in InCircle)
    {
        TotalBLocks += e;

    }

}

在屏幕截图中看到的问题是 TotalBlocks 对值的求和不正确。块 1 和块 2 的总和应该是 3 而不是 4。InCircle 列表正确存储了 2 个值,我还通过存储也正确显示的游戏对象进行了验证。

请帮我看看我哪里做错了?enter image description here

【问题讨论】:

  • 我也会注意获取号码的方法,如果你有超过 9 个块,它将停止工作(因为号码中会有多个数字)
  • 是的,我确实注意到这将是一个问题,幸运的是对于游戏我不认为这将是一个问题,但它更多的是用于概念验证阶段,因为我的编码技能是一个笑话!跨度>

标签: c# unity3d visual-studio-2010 arraylist


【解决方案1】:
TotalBLocks += e; 

也是第一次为Block1 执行,所以当你现在用Block1Block2 进行下一次调用时它已经有1 => 1 + 1 + 2 = 4


您可能希望在重新计算之前重置它:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

    InCircle.Add(BlockNumber);

    // Reset this!
    TotalBlocks = 0;
    foreach (int e in InCircle)
    {
        TotalBLocks += e;
    }
}

或者干脆不使用循环而只添加新的块号:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        return;
    }

    if (other.CompareTag("Floor"))
    {
        return;
    }

    BlockNumber = other.transform.GetComponent<Numberblocks>().number;

    // Not sure if still needed then
    InCircle.Add(BlockNumber);

    // Only add the new number
    TotalBLocks += BlockNumber;
}

我还会添加一个 HashSet 以确保每个对象只添加一次到列表中以避免重复条目。

【讨论】:

  • 谢谢解决了!没想到会这么容易。感谢您对 Hashsets 的建议,将对其进行优化以进行调查。
猜你喜欢
  • 2023-03-08
  • 2014-11-08
  • 2015-01-14
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多