• Как ограничить угол камеры unity3d?

    KraGenDeveloper
    @KraGenDeveloper
    Unity Developer
    Юзать Mathf.Clamp(var, min, max)
    private void CameraMove()
        {
    
            mouseX = Mathf.Clamp(Input.GetAxis("Mouse X") * mouseSensivity, minAngle, maxAngle);
            mouseY = Mathf.Clamp(Input.GetAxis("Mouse Y") * mouseSensivity, minAngle, maxAngle);
    
            transform.Rotate(mouseX * new Vector3(0, 1, 0));
            cameraTransform.transform.Rotate(-mouseY * new Vector3(1, 0, 0));
        }
    Ответ написан
  • Как сделать ожидание ввода из окна?

    freeExec
    @freeExec
    Участник OpenStreetMap
    изучай await / async если хочешь именно вот так. Для юнити есть плагин UniTask
    Ответ написан
    1 комментарий
  • Как использовать к приватные поля структуры?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Реализовать на классе интерфейс ISerializable.
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Ответ написан
    Комментировать
  • Как запустить майнкрафт из Intellij idea?

    @Elige
    Импорты
    import java.io.File;
    import java.lang.reflect.Method;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.List;


    Методы
    public static void LaunchMinecraft() {
        String nickname = "Kats555";
        String Class = "net.minecraft.client.main.Main";
    
        List < URL > url = new ArrayList < URL > ();
    
        File Dir = new File(".");
    
        System.out.println("Путь до папки с клиентом -> " + Dir.getAbsolutePath());
    
        if (!new File(Dir.getAbsolutePath() + "/natives").exists()) new File(Dir.getAbsolutePath() + "/natives").mkdirs(); //Папка с нативами
    
        try {
          url.addAll(getLibs(new File(Dir.getAbsolutePath() + "/versions"))); //Папка с клиентом
          url.addAll(getLibs(new File(Dir.getAbsolutePath() + "/libraries"))); //Папка с либами
        } catch (Exception x) {
          System.out.println("Неправильный путь к клиенту");
        }
    
        URLClassLoader cl = new URLClassLoader(url.toArray(new URL[url.size()]));
    
        System.out.println("Список загруженных jar ->" + url);
        System.setProperty("fml.ignoreInvalidMinecraftCertificates", "true");
        System.setProperty("fml.ignorePatchDiscrepancies", "true");
        System.setProperty("org.lwjgl.librarypath", Dir.getAbsolutePath() + "/natives");
        System.setProperty("net.java.games.input.librarypath", Dir.getAbsolutePath() + "/natives");
        System.setProperty("java.library.path", Dir.getAbsolutePath() + "/natives");
    
        List < String > params = new ArrayList < String > ();
    
        try {
          cl.loadClass("com.mojang.authlib.Agent");
          params.add("--accessToken");
          params.add("1");
          params.add("--uuid");
          params.add("12345");
          params.add("--userProperties");
          params.add("{}");
          params.add("--assetIndex");
          params.add("1.7.10");
        } catch (ClassNotFoundException x) {
          params.add("--session");
          params.add("1");
        }
        params.add("--username");
        params.add(nickname);
        params.add("--version");
        params.add("1.7.10");
        params.add("--gameDir");
        params.add(Dir.getAbsolutePath() + "/");
        params.add("--assetsDir");
        params.add(Dir.getAbsolutePath() + "/assets");
    
        try {
          Class < ? > start = cl.loadClass(Class);
          System.out.println("Запуск клиента");
          Method main = start.getMethod("main", new Class[] {
            String[].class
          });
          main.invoke(null, new Object[] {
            params.toArray(new String[0])
          });
        } catch (Exception x) {
          System.out.println(x);
        }
    
      }
    
      private static List < URL > getLibs(File libsfolder) throws MalformedURLException {
        List < URL > libs = new ArrayList < URL > ();
        if (!libsfolder.exists()) libsfolder.mkdirs();
        for (File file: libsfolder.listFiles()) {
          if (file.isDirectory()) {
            libs.addAll(getLibs(file));
          } else {
            if (file.getName().endsWith(".jar")) {
              libs.add(file.toURI().toURL());
            }
          }
        }
        return libs;
      }
    Ответ написан
  • Как сделать движение куба с вращением?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Вот в этом видео понятно и с визуализацией объясняется, как это реализовать. Да, по-английски, но это всего полторы минуты и с визуализацией. Конкретного кода с решением нет, но сам принцип становится понятен.
    Ответ написан
    1 комментарий
  • С чего начать в 30 лет?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Фундаментальная проблема - в игрострой стоит очередь фанатов с горящими глазами. Людей, которые пишут игры, играют в игры, моддят игры, хакают игры..., начиная с возраста, когда они смогли дотянуться до клавиатуры (как ваш покорный слуга). При этом, у них столько мотивации, что они могут сами поставить себе задачу, сами нагуглить все, что нужно (Спасибо дяде Немнюгину за его учебник. Это все что нужно знать о DOS, чтобы закодить dOOm) и сами все напишут и нарисуют (работая над этим сутками. Не потому что над душей стоит босс с воплями о лишении премии, а потому что им это интересно).

    И вот теперь, Андрей, который уже устал хочет встать в очередь высоко мотивированных конкурентов и попросить себе оффер. Каковы его шансы на успех?

    В играх есть много специализаций программирования - хотите графику, придется учить одно (причем на 2d и 3d это одно будет разное), хотите игровую логику и скриптинг - это номер два, хотите системную часть и бэкенд - это будет третье.

    Для универсального развития, нужно начинать с простых фиговин вроде тетриса, арканоида, бильярда и прочего (в которых однако есть все столпы игростроя - графика + логика + системный движок, можно и добавить сеть, если подумать) и потом наращивать сложность - делать платформер или RTS.
    Ответ написан
    4 комментария
  • Как адаптировать кликабельную карту для разных экранов?

    @NIKROTOS
    Начинающий программист.
    Здесь есть ответы:
    unity3d.ru/distribution/viewtopic.php?f=5&t=30037
    Ответ написан
    Комментировать
  • Как адаптировать кликабельную карту для разных экранов?

    tentrun
    @tentrun
    Fullstack (asp.net /react, vue, angular) deletant
    В Canvas'e Scale With Screen Size стоит?
    Ответ написан
    4 комментария
  • Как нажимать на кнопки в 3D?

    K0TlK
    @K0TlK
    Буллю людей.
    Ты делаешь рейкаст куда-то вперед от какого-то трансформа, а тебе нужно делать рейкаст в сторону курсора. Camera.ScreenPointToRay возвращает луч, который идет от камеры к месту на экране. Пример:
    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity))
    {
        Debug.DrawRay(hit.point, hit.normal * 10, Color.red, 10f);
    }


    И не надо так использовать тэги. Когда у тебя будет не 4 кнопки, а 40, то в методе OnButtonClick у тебя будет 40 условий? А если ты написал тэг с ошибкой, то будешь искать потом откуда ошибки валят? Выдели эти кнопки отдельно, получай нужный компонент при рейкасте и вызывай метод OnButtonClick уже у отдельного компонента.
    public interface IButton
    {
        public void OnClick();
    }
    
    public class YellowButton : IButton
    {
        public void OnClick()
        {
            Debug.Log("Yellow");
        }
    }
    
    public class Example : MonoBehaviour
    {
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity))
                {
                    if(hit.transform.TryGetComponent(out IButton button))
                    {
                        button.OnClick();
                    }
                }
            }
    
        }
    }


    Также, каждый компонент может иметь метод OnMouseDown, который вызывается, когда игрок нажимает на него. Можно создать компонент кнопки и при нажатии на него будет вызываться ивент, на который можно подписать нужные методы.
    public class Button : MonoBehaviour
    {
        public event Action ButtonPressed;
    
        private void OnMouseDown()
        {
            ButtonPressed?.Invoke();
        }
    
    }
    
    public class ButtonHandler : MonoBehaviour
    {
        [SerializeField] private Button _button;
    
        private void OnEnable()
        {
            _button.ButtonPressed += DoStuff;
        }
    
        private void OnDisable()
        {
            _button.ButtonPressed -= DoStuff;
        }
    
        private void DoStuff()
        {
    
        }
    }
    Ответ написан
    Комментировать
  • Глуповатый вопрос - как IntelliJ IDEA будучи написаной на Java может запускаться без JVM?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    У Идеи есть своя джава.
    Она лежит в папке <идея>/jbr
    Ответ написан
    Комментировать
  • Как с консоли считывать поисковый запрос, и выводить результат поиска по Википедии?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Срочно читайте про try-with-resources!

    Ваша задача должна состоять из таких вот методов:
    // Считать запрос
    String request = getRequest();
    
    // Сделать запрос к серверу
    String response = getResponseFromWiki(request);
    
    // Распарсить ответ
    (?) result = parseResponse(response);
    
    // Вывести результат
    showResult(result);

    С запросом к серверу вы, видимо, справились.
    Нужно это все сделать отдельным методом (типа getResponseFromWiki), который будет возвращать полученную строку (или что там у вас вернется)
    Ну и дальше по схеме.
    Ответ написан
  • Каким образом можно сделать заполнение текстурой по окружности?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Но зачем когда у Image есть встроенное заполнение по окружности. Поменяй ImageType
    Ответ написан
    Комментировать
  • Как скрывать и показывать часть полей компонента в инспекторе?

    @Almost
    Можно использовать Odin Inspector, он позволяет сделать это добавляя атрибуты.

    https://odininspector.com/attributes/hide-if-attribute
    Ответ написан
    Комментировать
  • Как прорисовывать местоположения точек на сцене?

    @NoNameDeveloper
    Unity Developer
    OnDrawGizmos - Документация в помощь

    using UnityEngine;
    using System.Collections;
    
    public class ExampleClass : MonoBehaviour
    {
        public Vector3[] Points;
        [SerializedField] private float _sphereRadius = 1;
        [SerializedField] private float _sphereColor = new Color32(0, 150, 255, 255);
    
        // Methods
    
        private void OnDrawGizmos()
        {
            Gizmos.color = _sphereColor;
    
            for(int i = 0; i < Points.Length; i++)
            {
                // Draw a yellow sphere at the transform's position.
                Gizmos.DrawSphere(Points[i], _sphereRadius);
                Handles.Label(Points[i], $"Point {i}");
            }
        }
    }
    Ответ написан
    Комментировать
  • Какой тип переменной у тегов объектов?

    GavriKos
    @GavriKos Куратор тега Unity
    Теги это строки. Но можно написать свой кастомный эдитор и в нем использовать вот это:
    https://docs.unity3d.com/ScriptReference/EditorGUI...

    Альтернатива - задать свой enum, и написать конвертер из енама в теги (это несложно)
    Ответ написан
    Комментировать
  • Как настроить панель, чтобы работали кнопки панели, находящейся под ней?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    По хорошему конечно нужно разделить на отдельные элементы и корректно расположить элементы в иерархии. Попбробуй снять галочку Raycast Target с компонентов Image на прозрачной панели.
    Эта галочка просто говорит, что мол, нужно ловить нажатия. Если она снята с Image, то он просто не будет ловить их. Но! Важно, чтобы кнопки на панели, которые будут нажиматься - имели этот Raycast Target. Иначе они перестанут работать
    Image Component
    61719ef0c40f3171546293.png

    P.s.
    В иерархии они на одном уровне.
    Такого не может быть. В иерархии так или иначе один элемент находится выше другого. То, что находится ниже - будет отлавливать все нажатия на себя (если Raycast Target навешен) Так что тут либо убирать Raycast Target, либо разделять на отдельные элементы.
    Ответ написан
    2 комментария
  • Объект создаётся криво, как исправить?

    @NIKROTOS
    Начинающий программист.
    можно попробовать сделать проверку , на параллельность нормалей и если они не параллельны, развернуть куб так, чтоб были параллельны.
    Возможно ошибка в том, что используются локальные координаты. Блок является дочерним для кого? Может стоит сделать все блоки дочерними одному объекту(не игроку и камере), чтоб они позиционировались относительно его?
    Ответ написан
    Комментировать
  • Почему уменьшился размер изображения при перезаписи?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Внутри ImageIO использует JPEGImageWriter, видимо, он что-то там пережимает (но это не точно).
    Если вы просто хотите прочитать и записать файл, ImageIO вам не нужен.
    Используйте тот-же Files из nio:
    Files.write(Path.of("C:\\out.jpg"), bytes, WRITE);
    Ответ написан
    Комментировать
  • Почему уменьшился размер изображения при перезаписи?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    По идее, жмёт его ImageIO.write, больше некому. Судя по всему, контролировать степень cжатия в этом методе нельзя.
    ImageReader reader = ...; //ImageIO.getImageReaders(ImageIO.createImageInputStream(stream))
    reader.setInput(...);
    IIOImage image = reader.readAll(0, null); 
    
    RenderedImage renderedImage = image.getRenderedImage();
    ImageWriter writer = ImageIO.getImageWriter(reader);
    ImageWriteParam param = writer.getDefaultWriteParam();
    paran.setCompressionMode(MODE_COPY_FROM_METADATA);  
    writer.setOutput(...);
    writer.write(null, image, param);

    Должно быть примерно как-то так.
    Ответ написан
    Комментировать