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

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

Костя Жуков Ученик (110), на голосовании 2 месяца назад
IndexOutOfRangeException: Index was outside the bounds of the array.
NextPointsG.getNext () (at Assets/Script/ГЕА/NextPointsG.cs:33)
EnemyControllerG.MoveG () (at Assets/Script/ГЕА/EnemyControllerG.cs:34)

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

public class NextPointsG : MonoBehaviour
{
public Transform[] NextCheckPointsG;
int Chance;

private void Awake()
{
StartChance();
}

void StartChance()
{
EnemyControllerG.toPlayerChanceG = 100;
Chance = EnemyControllerG.toPlayerChanceG;
}

public Transform getNext()
{
Chance = EnemyControllerG.toPlayerChanceG;
int rand = Random.Range(1, 100);
if (rand <= Chance)
{
if (NextCheckPointsG.Length > 1)
{
return NextCheckPointsG[Random.Range(1, NextCheckPointsG.Length)];
}
else
{
return NextCheckPointsG[0];
}
}
else
{
return NextCheckPointsG[0];
}
}
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class EnemyControllerG : MonoBehaviour
{
NavMeshAgent agentg;
public Transform checkpointg;
public Animator animg;
public static int toPlayerChanceG;
public Transform playerg;

private void Awake()
{
agentg = GetComponent<NavMeshAgent>();
animg = agentg.GetComponent<Animator>();
Invoke("MoveG", 5f);
}

void MoveG()
{
NextPointsG pointG = checkpointg.GetComponent<NextPointsG>();
if (pointG is AttackPointG)
{
AttackPointG nearPointg = checkpointg.GetComponent<AttackPointG>();
bool IsGEA = nearPointg.IsGEA;
if (IsGEA)
{
agentg.destination = playerg.position;
}
else
{
checkpointg = pointG.getNext();
agentg.destination = checkpointg.position;
Invoke("MoveG", 3f);
}
}
else
{
checkpointg = pointG.getNext();
agentg.destination = checkpointg.position;
Invoke("MoveG", 3f);
}
}

private void Update()
{
if (agentg.velocity.x != 0 | agentg.velocity.z != 0)
{
animg.SetBool("IsMove", true);
}
else
{
animg.SetBool("IsMove", false);
}
}
}
Голосование за лучший ответ
Анонимус Мудрец (14718) 3 месяца назад
 return NextCheckPointsG[Random.Range(1, NextCheckPointsG.Length)];  
Почему это не работает:
  • Random.Range(1, NextCheckPointsG.Length) генерирует случайное число от 1 до (длина массива - 1).
  • Но индексы массива начинаются с 0!
  • Если массив имеет 3 элемента, допустимые индексы - 0, 1, и 2.
  • Когда Random.Range выдает 3, ты пытаешься получить доступ к элементу с индексом 3, которого не существует.

Как исправить:

Измени строку на:
 return NextCheckPointsG[Random.Range(0, NextCheckPointsG.Length)];  
Объяснение:
  • Теперь Random.Range генерирует числа от 0 до (длина массива - 1), что соответствует допустимым индексам массива.
Дополнительные советы:
  • Проверка на пустой массив: Перед получением элемента из массива, всегда проверяй, не пустой ли он.
  • Обработка ошибок: Вместо того, чтобы полагаться на случайные ошибки, предусмотри обработку исключений IndexOutOfRangeException, чтобы твой код был устойчивее.
Костя ЖуковУченик (110) 3 месяца назад
Я сделал как ты и сказал, но у меня всё-ещё таже самая ошибка
Похожие вопросы