Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Выдаёт ошибку в unity

Юра Николаев Гуру (4626), на голосовании 3 месяца назад
Unityexception transform child out of bounds

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

public class SelectItems : MonoBehaviour
{
private Transform _itemParent;

[SerializeField] private TextMeshProUGUI _selectText;

[SerializeField] private string _key;
private int _currentIndex;
private int _savedItemIndex;

private void Start()
{
_itemParent = GetComponent<Transform>();

for (int i = 0; i < _itemParent.childCount; i++)
_itemParent.GetChild(i).gameObject.SetActive(false);

_savedItemIndex = PlayerPrefs.HasKey(_key) ? PlayerPrefs.GetInt(_key) : 0;
_currentIndex = _savedItemIndex;

_itemParent.GetChild(_savedItemIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SelectLeft()
{
_itemParent.GetChild(_currentIndex).gameObject.SetActive(false);

if (_currentIndex - 1 >= 0)
_currentIndex--;
else
_currentIndex = _itemParent.childCount - 1;

_itemParent.GetChild(_currentIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SelectRight()
{
_itemParent.GetChild(_currentIndex).gameObject.SetActive(false);

if (_currentIndex + 1 < _itemParent.childCount)
_currentIndex++;
else
_currentIndex = 0;

_itemParent.GetChild(_currentIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SaveItem()
{
PlayerPrefs.SetInt(_key, _currentIndex);

_savedItemIndex = _currentIndex;
_selectText.text = "Выбрано";
}
}
Голосование за лучший ответ
Matvey Arbuziv Ученик (219) 4 месяца назад
Скачай unreal
Юра НиколаевГуру (4626) 4 месяца назад
мобильную игру на анриле вряд ли сделаешь для слабых телефонов
Милана Просветленный (33039) 4 месяца назад
Проблема возникает из-за строки effectbar.gameObject.transform.GetChild(i).gameObject.SetActive(false);, которая вызывает исключение “Transform child out of bounds”. Это происходит, потому что система не уверена, существует ли действительно дочерний объект.

Чтобы исправить это, вы можете использовать следующий подход:

Проверьте, существует ли дочерний объект перед его активацией или деактивацией.
Вместо явного обращения к каждому дочернему объекту, вы можете просто деактивировать родительский объект effectbar. Это автоматически деактивирует все его дочерние объекты.
Вот как можно исправить ваш код:
 using System.Collections; 
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class SelectItems : MonoBehaviour
{
private Transform _itemParent;

[SerializeField] private TextMeshProUGUI _selectText;
[SerializeField] private string _key;
private int _currentIndex;
private int _savedItemIndex;

private void Start()
{
_itemParent = GetComponent();

for (int i = 0; i < _itemParent.childCount; i++)
{
_itemParent.GetChild(i).gameObject.SetActive(false);
}

_savedItemIndex = PlayerPrefs.HasKey(_key) ? PlayerPrefs.GetInt(_key) : 0;
_currentIndex = _savedItemIndex;

_itemParent.GetChild(_savedItemIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SelectLeft()
{
_itemParent.GetChild(_currentIndex).gameObject.SetActive(false);

if (_currentIndex - 1 >= 0)
_currentIndex--;
else
_currentIndex = _itemParent.childCount - 1;

_itemParent.GetChild(_currentIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SelectRight()
{
_itemParent.GetChild(_currentIndex).gameObject.SetActive(false);

if (_currentIndex + 1 < _itemParent.childCount)
_currentIndex++;
else
_currentIndex = 0;

_itemParent.GetChild(_currentIndex).gameObject.SetActive(true);
_selectText.text = _savedItemIndex == _currentIndex ? "Выбрано" : "Выбрать";
}

public void SaveItem()
{
PlayerPrefs.SetInt(_key, _currentIndex);

_savedItemIndex = _currentIndex;
_selectText.text = "Выбрано";
}
}
Юра НиколаевГуру (4626) 4 месяца назад
есть одна проблемка. а именно... строки effectbar.gameObject.transform.GetChild(i).gameObject.SetActive(false); тут нету
Похожие вопросы