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, чтобы твой код был устойчивее.
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);
}
}
}