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

Как сделать чтобы нпс ходил рандомно в unity3d?

Tipa SamiKlutoy Ученик (60), открыт 3 недели назад
Короче делаю игру про хомяков и они должны ходить по рандомным точкам либо просто рандомно. Помогите пж как это сделать?
1 ответ
SlomiX Мудрец (12408) 3 недели назад
Рассмотрим два основных: движение по случайным точкам и случайное блуждание.

1. Движение к случайным точкам (с использованием NavMeshAgent)
Этот метод подходит, если ваша сцена имеет навмеш (NavMesh), и NPC должны перемещаться по поверхности, избегая препятствий.

Шаги:
Настройте NavMesh:

Выделите статичные объекты (пол, стены) в сцене.

Перейдите в меню Window → AI → Navigation.

Во вкладке Bake нажмите Bake, чтобы создать навмеш.

Создайте скрипт для NPC:
 using UnityEngine; 
using UnityEngine.AI;

public class RandomMovement : MonoBehaviour
{
private NavMeshAgent agent;
public float moveRadius = 10f; // Радиус для выбора случайной точки

void Start()
{
agent = GetComponent<NavMeshAgent>();
SetNewDestination();
}

void Update()
{
// Если NPC достиг цели, выбираем новую точку
if (agent.remainingDistance <= agent.stoppingDistance)
{
SetNewDestination();
}
}

void SetNewDestination()
{
Vector3 randomDirection = Random.insideUnitSphere * moveRadius;
randomDirection += transform.position;
NavMeshHit hit;
if (NavMesh.SamplePosition(randomDirection, out hit, moveRadius, NavMesh.AllAreas))
{
agent.SetDestination(hit.position);
}
}
}
Добавьте компоненты:

Прикрепите скрипт RandomMovement к NPC.

Добавьте компонент NavMeshAgent (в инспекторе объекта: Add Component → Navigation → NavMesh Agent).

2. Случайное блуждание (без NavMesh)
Если вам не нужна навигация по сложной геометрии, можно использовать простой физический подход.

Шаги:
Создайте скрипт:
 using UnityEngine; 

public class RandomWalk : MonoBehaviour
{
public float moveSpeed = 3f; // Скорость движения
public float rotationSpeed = 5f; // Скорость поворота
public float changeDirectionTime = 3f; // Время до смены направления

private Vector3 targetDirection;
private float timer;

void Start()
{
SetNewDirection();
}

void Update()
{
timer += Time.deltaTime;
if (timer >= changeDirectionTime)
{
SetNewDirection();
timer = 0;
}

// Поворот и движение
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(targetDirection),
rotationSpeed * Time.deltaTime
);
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
}

void SetNewDirection()
{
// Генерируем случайное направление
targetDirection = new Vector3(
Random.Range(-1f, 1f),
0,
Random.Range(-1f, 1f)
).normalized;
}
}
Настройте параметры:

Прикрепите скрипт к NPC.

В инспекторе задайте moveSpeed, rotationSpeed и changeDirectionTime.

3. Дополнительные советы
Визуализация точек:
Добавьте Gizmos для отладки:
 void OnDrawGizmos() 
{
Gizmos.color = Color.red;
Gizmos.DrawSphere(agent.destination, 0.5f);
}
Анимация:
Если у хомяков есть анимация движения, синхронизируйте её с помощью Animator, изменяя параметры (например, IsMoving) в коде.

Избегание препятствий:
Для более умного движения добавьте Rigidbody и коллайдеры, используйте Physics.Raycast для проверки препятствий.
Tipa SamiKlutoyУченик (60) 3 недели назад
Спс огромное
SlomiX Мудрец (12408) Tipa SamiKlutoy, пожалуйста
Похожие вопросы