Heithvald
@Heithvald

Как реализовать рандомное перемещение объектов с перерывами Unity?

Я пытаюсь написать скрипт для объекта со спрайтом, он должен перемещаться по оси Х в рандомных направлениях и периодически (опять же рандомно) должен останавливаться. Я пытался сделать это через Coroutine но натворил какой то дичи, помогите разобраться, что я делаю не так?
Вот что я наворотил (исходник)

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

public class Villager : MonoBehaviour
{
    [SerializeField] private float speed = 1f; //villager speed
    [SerializeField] private int lives = 3; // villager lives

    private Animator anim;
    private SpriteRenderer sprite;
    private States State
    {
        get { return (States)anim.GetInteger("State"); }
        set { anim.SetInteger("State", (int)value); }
    }
    private void Awake()
    {
        anim = GetComponent<Animator>();
        sprite = GetComponentInChildren<SpriteRenderer>();
    }
    private void Start()
    {
        State = States.idle;
        StartCoroutine(Walk());
    }
    private void Update()
    {

    }
    IEnumerator Walk()
    {
        State = States.walk;
        StartCoroutine(WalkRight());
        yield return new WaitForSeconds(5f);
        StartCoroutine(WalkLeft());
    }
    
    IEnumerator WalkRight()
    {
        Vector3 direction = transform.right * 3f;
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
        sprite.flipX = transform.position.x > 0.0f;
        yield return new WaitForSeconds(4f);
    }
    IEnumerator WalkLeft()
    {
        Vector3 direction = transform.right * -3f;
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
        sprite.flipX = transform.position.x < 0.0f;
        yield return new WaitForSeconds(5f);
    }
    public void GetDamage()
    {
        lives -= 1;
        Debug.Log("Villager" + lives);
    }
    public enum States
    {
        idle,
        walk
    }
}

  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
B-Erolskiy
@B-Erolskiy
Unity Developer
- Сейчас корутина Walk у тебя исполнится только один раз. Для периодичности нужны повторения.
- Не вижу попытки реализации рандомного перемещения. Сейчас ты просто один раз гуляешь вправо и, после перерыва, один раз влево.

Советую для начала четко определить, какого поведения объекта ты хочешь добиться, и разбить задачу на подзадачи.
Я вижу твою задачу примерно так:
1. перемещение на случайное расстояние в случайном направлении
2. паузы случайной длительности после перемещения
3. 2 предыдущие операции повторяются снова и снова.

По первому и второму пункту: используй Random.Range по оси X.
По третьему пункту: создай цикл в корутине с указанием количества повторений перемещений + пауз.

Успехов!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы