Unity3d C# Translate не работает

176
18 июля 2019, 19:40
    using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveScript : MonoBehaviour
{
    public GameObject obj;
    bool t = false;
    public int plspeed;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("start");
        StartCoroutine(wait1());
    }
    void stt()
    {
        StopCoroutine(wait1());
        Debug.Log("stop stt");
    }
    // Update is called once per frame
    void Update()
    {
    }
    IEnumerator wait1()
    {
        Debug.Log("start IEnumerator");
        yield return new WaitForSeconds(2f);
        obj.transform.Translate(-Vector3.right * plspeed * Time.deltaTime);
        Debug.Log("stop waitforseconds");
        stt();
        Debug.Log("stop IEnumerator");
    }
}

Translate просто телепортирует объект через две секунды. Моя задача сделать движение объекта так: в одну сторону две секунды, в другую сторону две секунды и так бесконечно.

Answer 1

Вызывать корутину в корутине - плохо, вызывать корутины в больших количествах в целом плохо, потому что это не самое дешевое занятие. Если нужно сделать таймер - нужно это делать через while(true) или схожий цикл, запускать по корутине за итерацию - такая себе затея.

Что вы написали, то и происходит:

  1. yield return new WaitForSeconds(2f); - подождать 2 секунды
  2. obj.transform.Translate(-Vector3.right * plspeed * Time.deltaTime); - сдвинуть объект за 1 кадр
  3. повторить

Учитывая, что объекту нужно каждые 2 секунды менять направление на противоположное, проще поручить корутине менять направление каждые 2 секунды, а в самом Update() двигать объект:

public class Mover : MonoBehaviour {
    public GameObject obj;
    public Vector3 moveVector = -Vector3.right;
    public float speed;
    void Start() {
        StartCoroutine(ControlDirection());
    }
    void Update() {
        obj.transform.Translate(moveVector * speed * Time.deltaTime);
    }
    IEnumerator ControlDirection() {
        // необходимо рано или поздно выйти из этого цикла
        // при смене уровня, например
        // для этого нужно добавить какой-то механизм выхода из корутины
        // и ее повторного запуска, но это уже отдельный вопрос
        while (true) {
            yield return new WaitForSeconds(2f);
            speed *= -1;
        }
    }
}

Получаем закономерный результат:

READ ALSO
Нажатие клавиш в браузере

Нажатие клавиш в браузере

У меня есть сайт, там я должен проходить регистрацию, я хочу автоматизировать этот процесс

175
Как сделать ссылку на input?

Как сделать ссылку на input?

Хочу сделать чтобы в зависимости от выбранного input отправлялось на нужный метод, Как можно сделать ссылку на этот инпут?

168
Как добавить расширения в Cefsharp?

Как добавить расширения в Cefsharp?

Пару дней назад в cefsharp добавили поддержку расширенийНикакой документации как добавить расширения я не нашел, хотя в коммитах есть инфа

144
c# и debug режим

c# и debug режим

Можно ли в с# CLR код, запустить в "трассировочном" режиме? Можно ли как-то перехватить вызов Invoke? Как можно написать дебаггер под с# код? Единственное...

124