Ответы пользователя по тегу C#
  • Почему в Unity я хожу на A вправо, на d в лево, на w назад, на s вперед?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    Vector3 moveDir = -new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
                      ^ вы уверены что вам нужен тут минус?
    Ответ написан
    Комментировать
  • Как вписать в новый массив только один новые элемент, если в старом массиве таких элементов несколько?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    ну на задачу я не могу ответить, я могу ответить на заголовок. был бы тут c++ я бы применил sort потом unique.
    или просто бы сделал бы хеш-таблицу и потом бы из хеш-таблицы обратно массив бы сделал, если прям обязательно именно массив.(но жеш-таблица не сортирует и даже еще дополнительно перемешивает, но она быстрее, особенно для больших объемов)
    предлагаю использовать Dictionary (это вроде хеш таблица и есть), а потом из нее обратно массив
    хеш-таблица это таблица "заголовок-данные", заголовок еще ключом называют. хеш таблица гарантирует что все заголовки уникальные. если в нее добавить повторяющийся заголовок, то просто старый заголовок с данными будут заменены новыми.
    есть еще HashSet, это как хэш-таблица, но там только заголовки. тоесть это не таблица а множество получается.
    Ответ написан
  • При цикле while постоянно вылетает Unity. Как исправить?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    число float хранит двоичные дроби и конечное кол-во цифр.
    например 1/3 в 10-чной записи это 0.3333333333 и так до бесконечности.
    если мы запретим хранить бескочечное кол-во цифр (комп просто так не умеет), то 1/3 будет записана с погрешностью, т.к. в десятичной записи ее невозможно так отобразить
    допустим мы говорим х = 1/3
    давайте будем скдалывать х пока не получим 1
    а мы никогда не получим 1
    мы получим 0.9999999, которая не равна 1 и пойдем дальше
    аналогично с двоичной системой исчисления, 1/5, 1/10 не возможно выразить за 23 цифры, а float хранит только 23 двоичные цифры (double - 53 цифры)
    но даже если у тебя не будет арифметической погрешности, ловить точное равенство это так себе. обычно условие завершения цикла это знак больше или меньше, но не точное равенство.

    ну и еще так по мелочи, я не проводил эксперимент как это на производительности сказывается, но вектор это 3 числа, а х - одно число. зачем прибавлять к вектору другой вектор, если вам достаточно к иксу добавить какую-то величину. может быть 0 прибавляется очень быстро, но даже если мы забудем про производительность, просто к иксу прибавлять число это же наверное код будет изящнее. хотя у вас читаемость кода так себе. что такое gr, что такое WH, совсем неясно. и название controll - это попытка в адекватные названия, но совсем не ясная. controll наверное относиться к управлению, но тут я не вижу никакого управления. подумайте что делает этот скрипт и вычеркните слово controll из своих мыслей. ааа это control 1. значит есть и control 2. это совсем нейминг от бога.

    !!!!! обновил:
    что кстати значит "вылетает"?
    работа программы прекращается с отчетом об ошибке?
    или просто останавливается, зависает на 0 fps
    у тебя скорее всего второе. функция update вызывается на каждом кадре, если в в update делать бесконечный цикл, то программа остановится на этом бесконечном цикле, ошибки не будет просто игра встанет (наверное, я на такие ошибки не напарывался).
    если в update поместить что-то громоздкое, то у тебя fps сильно просядет
    общая рекомендация: тебе вряд ли в скриптах нужны циклы, в юнити есть свои циклы событий.
    Ответ написан
    Комментировать
  • Правильно ли я написал программу?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    не очень ясно какой кусок кода надо вынести в отдельную функцию. стоит выделить комментариями начало и конец куска кода. но вот я что-то сделал. переменную value я переименова в procedure, так логичнее мне кажется
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public delegate double Func(double x);
            static void Main(string[] args)
            {
                Func procedure = function;
    
                double a, b;
                a = 0.5;
                b = 1.5;
                use_procedure_for_a_and_b(ref a, ref b, procedure);
                Console.WriteLine((a + b) / 2);
                Console.ReadLine();
            }
            static void use_procedure_for_a_and_b(ref double a, ref double b, Func procedure)
            {
                const double e = 0.001;
                while (Math.Abs(b - a) > 2 * e)
                {
                    double c = (a + b) / 2;
                    if (procedure(b) * procedure(c) < 0)
                    {
                        a = c;
                    }
                    else
                    {
                        b = c;
                    }
                }
            }
            static double function(double x)
            {
                double tmp = Math.Pow(2, 0.5);
                return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, tmp) + 1;
            }
        }
    }
    Ответ написан
    Комментировать