【问题标题】:Array set initial value problems数组设置初值问题
【发布时间】:2016-09-13 22:46:35
【问题描述】:

我有一个脚本可以为角色的心形图像赋予或赋予“生命”。

using UnityEngine;
using UnityEngine.UI;

public class Hearts : MonoBehaviour
{

    public Sprite[] initialHeart;
    private int hearts;
    private int currentHearts;
    // Use this for initialization

    //Used for chaching Image so that you won't be doing GetComponent<Image>(); each time
    Image heartImage;

    void Start()
    {
        //Cache the Image once so that you won't be doing GetComponent<Image>(); each time
        heartImage = GetComponent<Image>();
        heartImage.sprite = initialHeart[0];
        hearts = initialHeart.Length;
        }

    // Update is called once per frame
    void Update()
    {
    }

    public bool TakeHeart()
    {
        if (hearts < 0)
        {
            return false;
        }

        if (currentHearts < (hearts - 1))
        {
            currentHearts += 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;
        }
        else
        {
            return false;
        }
    }

    public bool AddHeart()
    {
        if (currentHearts > 0)
        {
            currentHearts -= 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;
        }
        else
        {
            return false;

        }
    }
}

我把最初的 3 颗心放在了,检查员把尺寸 3:

array 0: 3 hearts

array 1: 2 hearts

array 2: 1 heart

如果玩家与炸弹(预制)相撞,他会失去一颗心,如果他没有心,则将屏幕称为“GameOver”。

一切正常。但我决定做一个测试,如果我为玩家获得一个皮肤,我会创建一个“升级”,我会得到更多的“2”心。

在检查员处放尺寸 5

array 0: 5 hearts

array 1: 4 hearts

array 2: 3 hearts

array 3: 2 hearts

array 4: 1 heart

当我输入脚本时出现问题:heartImage.sprite = initialHeart[3]; 游戏开始时只有“3”颗心。

当玩家与炸弹(预制件)碰撞时,他会获得一条生命而不是失去一条生命,但随后的碰撞它开始正常失去生命,直到游戏结束。

如果我从 3 颗心开始并且在游戏中“抓到”一颗额外的心并没有改变,而不是 3 到 4 颗,我仍然保持 3 颗心。

在我与第一个炸弹(预制件)碰撞并获得 1 颗心而不是失去之后,脚本开始正常运行。撞到炸弹我就输了,抓到一颗心我就赢了。

我想知道为什么我把heartImage.sprite = initialHeart[0];(5颗心)改成heartImage.sprite = initialHeart[2];(3颗心),第一次碰撞就出现这个bug。

编辑

我找到了问题所在,但不知道如何解决。

我的数组会固定为5,但有时我想启动[0](5颗红心)和其他情况启动[2](3颗红心)。

Start () 内,声明heartImage.sprite = initialHeart [2];(初始3 颗心)。但是TakeHeart方法里面有取Hearts的功能。

if (currentHearts <(hearts - 1))
{
currentHearts + = 1;
heartImage.sprite = initialHeart [currentHearts]; ;
return true;
}

事实证明,当我声明时:heartImage.sprite = initialHeart [currentHearts];

我说的是initialHeart[1](4 颗心),但应该是[3](2 颗心)

可以做点什么添加:initialHeart [currentHearts] + initialHeart [2];`?

因此,intialHeart 的结果将是 [3](2 颗红心),这是我想要的方式。

【问题讨论】:

  • 您是否真的尝试过使用调试器来单步调试代码以查看您是否遇到索引问题? \
  • 通常从不使用 Unity 中的数组。学习使用 List(明确地说,它更容易)。您在这里尝试整理代码绝对不值得。只需从 List&lt;&gt; 重新开始,几分钟后即可完成。
  • @JoeBlow 我正在尝试List &lt;&gt;,但我遇到了麻烦。
  • 请勾选“TICK”答案以结束此问题。然后,问一个关于 List 的新问题

标签: c# arrays unity3d unityscript


【解决方案1】:

如果您增加数组的大小,但不更改其他代码以合并您会遇到这些问题。通过不使用固定索引使您的代码大小独立,至少在上限范围内。 0 当然可以留下来,但你的上限应该类似于initialHeart[initialHeart.Length]

如果您想在运行时更改数组的大小,您需要将数组更改为其他可以动态调整大小的容器,例如List&lt;&gt;。为此,您可以使用.Count 而不是.Length,还有一个.Last() 可以让最后一个元素更短一些。

【讨论】:

  • 照Gunnar 说的做,使用List&lt;&gt;
  • 我正在尝试使用:initialHeart[initialHeart.Length],但到目前为止没有成功。而.Last ().size() 尚未实施。
  • 不,不要尝试 .Last().size() 使用数组。他们是为List&lt;&gt;
  • 我正在尝试列出。 public List&lt;Sprite&gt; initialHearts;
  • 那么不要使用.Length,因为那是针对数组的。对于 .size() 的列表。
【解决方案2】:

尝试在 Start 方法中将 currentHearts 定义为 2...当您向其添加 1 时,它将为 3,您将访问数组的索引 3。

currentHearts = 2;

【讨论】:

  • 完美,这么简单,我瞎了,没看到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
相关资源
最近更新 更多