【问题标题】:IndexOutOfRangeException: Can't figure out why index out of boundIndexOutOfRangeException:无法弄清楚为什么索引超出范围
【发布时间】:2020-11-25 01:35:24
【问题描述】:

所以,我有一个我的游戏的升级系统列表,但是当我第二次按下升级时 index out of range 然后第三次按下 index out of range 消失时,它有一个错误。整个脚本。

void Start()
{
    newSelectedIndex = previousSelectedIndex = PlayerPrefs.GetInt("currentPlayer");
    btn = Select_Player[newSelectedIndex].GetComponent<Button>();
    btn.interactable = false;

    Coins = M_CoinManager.instance.Coins;
    for (int i = 0; i < Select_Player.Length; i++)
    {
        priceText[i].text = Cost_Player[i].ToString();
        value_player[i] = "" + i;
        Select_Player[i].SetActive(false);
        buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);
    }
    //if(PlayerPrefs.HasKey("currentPlayer")){
    selectedVehicleIndex = PlayerPrefs.GetInt("currentPlayer");
   
    theVehicles[selectedVehicleIndex].SetActive(true);
    VehicleInfo();
    UpgradeButtonStatus();
}

// Update is called once per frame
void Update()
{
    for (int i = 0; i < Select_Player.Length; i++)
    {
        buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);
        if (i == buyPlayer[i])
        {
            Select_Player[i].SetActive(true);
            upgradeBtn[i].interactable = true;
            UpgradeButtonStatus();

        }
        else
        {
            upgradeBtn[i].interactable = false;
        }
    }
}

public void BuyCharact(int id)
{
    M_SoundManager.instance.playUIsfx();
    if (Cost_Player[id] <= Coins)
    {
        M_CoinManager.instance.AddCoins(-Cost_Player[id]);
        PlayerPrefs.SetInt(value_player[id], id);

    }
    else
    {
        _CoinShake.DoShake();
        Debug.Log("Does have enough coin");
    }
}

public void Reset()
{
    for (int i = 0; i < Select_Player.Length; i++)
    {
        PlayerPrefs.SetInt(value_player[i], 0);
    }
}

public void Select(int id)
{
    previousSelectedIndex = newSelectedIndex;
    newSelectedIndex = id;
    newSelectedIndex = selectedVehicleIndex;

    PlayerPrefs.SetInt("currentPlayer", newSelectedIndex);
    Button newbtn = Select_Player[previousSelectedIndex].GetComponent<Button>();
    btn = Select_Player[newSelectedIndex].GetComponent<Button>();
    btn.interactable = false;
    newbtn.interactable = true;
    M_SoundManager.instance.playUIsfx();
    Debug.Log("Selected TypeCar" + newSelectedIndex);
}

public void nextVehicle()
{
    M_SoundManager.instance.playUIsfx();
    theVehicles[selectedVehicleIndex].SetActive(false);
    selectedVehicleIndex = (selectedVehicleIndex + 1) % theVehicles.Length;
    theVehicles[selectedVehicleIndex].SetActive(true);
    VehicleInfo();
    UpgradeButtonStatus();
}

public void PreviousVehicle()
{
    M_SoundManager.instance.playUIsfx();
    theVehicles[selectedVehicleIndex].SetActive(false);
    selectedVehicleIndex--;
    if (selectedVehicleIndex < 0)
    {
        selectedVehicleIndex += theVehicles.Length;
    }
    theVehicles[selectedVehicleIndex].SetActive(true);
    VehicleInfo();
    UpgradeButtonStatus();
}

public void VehicleInfo()
{
    currLevel = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel;
    levelText[selectedVehicleIndex].text = "Level: " + (currLevel + 1);
    powerText[selectedVehicleIndex].text = "Power: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].motorPower;
    brakeText[selectedVehicleIndex].text = "Brake: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].brakePower;

    
    Debug.Log(selectedVehicleIndex);
}

public void upgradeMethod()
{
    nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
    if (Coins >= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost)
    {
        Coins -= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost;
        _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel++;

        if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
        {
            upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
        }
        else
        {
            upgradeBtn[selectedVehicleIndex].interactable = false;
            upgradeBtnText[selectedVehicleIndex].text = "Max Level";
        }
        VehicleInfo();
    }

}

private void UpgradeButtonStatus()
{
    if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
    {
        upgradeBtn[selectedVehicleIndex].interactable = true;
        nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
        upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
    }
    else
    {
        upgradeBtn[selectedVehicleIndex].interactable = false;
        upgradeBtnText[selectedVehicleIndex].text = "Max Level";
    }
}

以及对该方法的错误引用:

private void UpgradeButtonStatus()
{
    if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
    {
        upgradeBtn[selectedVehicleIndex].interactable = true;
        nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
        upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
    }
    else
    {
        upgradeBtn[selectedVehicleIndex].interactable = false;
        upgradeBtnText[selectedVehicleIndex].text = "Max Level";
    }

}

正如您在更新中看到的那样,这就是我的意思。在我第三次按升级后,错误停止了。

这是给检查员的

【问题讨论】:

  • “以及对这一行的错误引用”是哪一行?
  • @Ruzihm 对不起,我的意思是在方法上,在这条线上if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel &lt; _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)

标签: unity3d arraylist


【解决方案1】:

数组长度比它们的最高索引大一,但“for”循环的最后一次迭代转到array.length。

您需要对array.length-1 进行“for”循环。

我看到你做了最多 array.length 的“for”循环。

我还没有真正阅读过你的整个脚本,所以可能还有更多,但这是我的“for”循环中的一个典型错误,所以我认为这会导致你的错误。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 2011-08-13
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多