• Можно ли использовать "async ValueTask" в Unity?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В юнити нельзя, тк ValueTask - это слишком новая фича.
    Но скорее всего он вам не нужен
    Ответ написан
    2 комментария
  • Для чего программисту нужно знать физику?

    @Dvvarreyn
    Программисту очень важно знать физику, особенно законы сохранения.
    Постучал по клавишам — нужно пойти перекусить, чтобы восполнить потери. Без этого никуда.
    Ответ написан
    Комментировать
  • Почему два объекта на одном и том же месте имеют разный Transform?

    freeExec
    @freeExec
    Участник OpenStreetMap
    У вас "рогатку" трансформ рисует по центру объекта, а вы переключите на режим pivot и всё станет понятней.
    5dfccd278a3e1421916856.png
    Ответ написан
    1 комментарий
  • Как сделать обратный таймер с минутами?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Для такого случая лучше использовать DateTime и TimeSpan вместе с шаблонами форматирования:
    using System;
    using UnityEngine;
    
    public class TimerTest : MonoBehaviour
    {
        public float timer = 90;
    
        private DateTime timerEnd;
    
        private void Start()
        {
            timerEnd = DateTime.Now.AddSeconds(timer);
        }
    
        private void Update()
        {
            TimeSpan delta = timerEnd - DateTime.Now;
            Debug.Log(delta.Minutes.ToString("00") + ":" + delta.Seconds.ToString("00"));
            if (delta.TotalSeconds <= 0)
            {
                Debug.Log("The END");
            }
        }
    }

    Важно помнить, что при таком способе не будет учитываться Time.timeScale, если он вам нужен, то можете аналогичным образом вместо DateTime сохранять float со временем, но тогда минуты придётся вычислять самостоятельно. Плюсовать deltaTime в апдейте не советую. Теоретически ещё можно использовать Timer, но я слышал, что он работает не на всех платформах.
    Ответ написан
    3 комментария
  • Как убирать пустоту из листа, оставшуюся после уничтожения объектов, в него входящих?

    MrMureno
    @MrMureno Куратор тега Unity
    VR for all
    Давайте попробую пояснить что не так.
    foreach (GameObject tmp in Group)
    {
    }

    вот тут вы запускаете перебор всех элементов.
    но потом вы МЕНЯЕТЕ КОЛИЧЕСТВО элементов в коллекции.
    Group.Remove(tmp);

    и вот нумератор проходит по индексам, а они уже не совпадают.(после старта не обновляются).

    В итоге если мы уничтожаем (не удаляем) объект по ссылке , через Destroy(gameObject);
    остается список из ссылок на null;

    Если же удаляем объекты из коллекции во время похода по коллекции - получаем ошибку с индексами.

    как решить.
    или сделать через for
    for(int i =0; i <list.Count;i++)
    {
    Destroy(list[i]);
    list.RemoveAt(i);
    i--; // сместили индекс,если было удаление, так как размер коллекции уменьшился


    другой вариант - просто после цикла с Destroy(gameObject);
    почистить список list.Clear(); (если все зараз всегда удаляются)

    Главное надеюсь, чтоб суть проблемы ясна стала.
    Ответ написан
    Комментировать
  • Как убирать пустоту из листа, оставшуюся после уничтожения объектов, в него входящих?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - при использовании foreach ни сама коллекция (лист, массив, перечисление, не важно) ни ее элементы, не подлежат изменению. только чтение. это правило языка C# (но за Mono не отвечаю)

    2 - про использовании for обходите коллекцию с конца, а не сначала, таким образом не будет проблем с индексами (хотя можно и while использовать для обхода с головы, но на for думаю быстрее поймете суть). пример
    for(int i = Group.Count - 1; i >= 0; i--)
    {
      Destroy(list[i]);
      list.RemoveAt(i); // о размере списка не заморачиваемся вообще
    }


    3 - Unity поддерживает LINQ? там можно было бы еще элегантнее. но LINQ всегда проигрывает по производительности, которая в играх обычно важна. тем не менее
    Group.RemoveAll(tmp => tmp is MissingReferenceException);
    // хотя надо проверить совместимость

    upd вообще то выходит Destroy не делаем. тогда теряется вся элегантность.. ну или надо подольше подумать ))

    ps ну тогда уж и while это примерно так
    var i = 0;
    while (i < Group.Count)
      if (Group[i] is MissingReferenceException)
      {
        Destroy(Group[i]);
        Group.RemoveAt(i);
      }
      else
        i++;

    ну и хардкорное применение for приктически так же выглядит
    for (var i = 0; i < Group.Count;) // да да, инкримент просто не пишем и получается аналог while
      if (Group[i] is MissingReferenceException)
      {
        Destroy(Group[i]);
        Group.RemoveAt(i);
      }
      else
        i++;
    Ответ написан
    Комментировать
  • Как убирать пустоту из листа, оставшуюся после уничтожения объектов, в него входящих?

    milssky
    @milssky
    Координатор племени фиолетовых обезьянок
    Такая же проблема была описана тут: Что может быть MissingReferenceException: The object of type 'Object'?
    Решение было в комментах от vicsint:
    Для тех кто окажется тут. Если вы хотите, чтобы ненужные клоны удалялись Destroеm и процесс не прерывался, то необходимо гэйм обжиг удалить из компонентов главной сцены в юнити в левом верхнем меню.(при этом gameObject должен лежать в отдельной папке проекта и быть назначен оттуда на скрипт)
    Ответ написан
    1 комментарий