Рассмотрим два основных: движение по случайным точкам и случайное блуждание.
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 для проверки препятствий.