Unity

Unity

Создание игр на движке Unity

СтатьиФорумИнфо

Статьи

24 дек 2021

Создание веревки в Unity на базовых SpringJoint.

В этой статье я расскажу к какому способу создания веревок (тросов, цепей) я смог прийти в ходе разработки игры для конкурса Платформеров на GameDev.ru. Пример будет разобран на 2Д проекте, но думаю нет никаких сложностей адаптировать его для 3Д проекта.

Читать

15 мая 2020

Контент-ориентированная генерация уровня в Unity в конкурсе «Храм Хаоса»

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

Читать | Комментарии [8]

29 июня 2016

Unity Character Motor

Когда-то давно, еще во времена Unity 3, мне стало интересно как работает физика персонажа. И я заглянул в класс CharacterMotor. Класс был написан на JavaScript, был огромный, страшный и непонятный. Я решил переписать его на C#, попутно отрефакторив. Недавно я вспомнил про свой старый CharacterMotor, решил еще немного подправить его и поделиться им. Тем более, тема физики персонажа не очень популярная (я вообще не видел никакой информации), хотя довольно интересная.

Читать | Комментарии [61]

20 окт 2012

Реализуем multi-touch жесты самостоятельно

В этой статье будет рассмотрена реализация pan (перемещения) и pinch zoom (масштабирования двумя пальцами) изображения. В результате получится некий аналог приложения для просмотра фотографий.

Читать | Комментарии [2]

Блог

25 янв 2022

Компания Unity пополнила свои покупки компанией Ziva Dynamics – лидером в симуляции компьютерных персонажей. В линейку приобретений компании уже входят Weta Digital, SpeedTree, SyncSketch, Pixyz, and RestAR.

Ссылка | Комментарии [46]

22 июля 2021

Компания Unity приобрела компанию Interactive Data Visualization (IDV) — разработчика пакета SpeedTree. SpeedTree — инструмент моделирования растительности для игр и компьютерных симуляций.

Трехмерное моделирование вручную и с нуля растительности, такой как трава и деревья, достаточно сложное и трудоемкое занятие. Однако SpeedTree через автоматизацию позволяет ускорить и облегчить этот процесс. Инструмент SpeedTree достаточно популярен и занимает лидирующие позиции на рынке. SpeedTree использовался для моделирования растительности в таких проектах, как Horizon: Zero Dawn, Call of Duty: War Zone, The Witcher 3, Assassin’s Creed: Valhalla, Hitman III, and Ghost of Tsushima.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Ссылка | Комментарии [1]

24 июля 2016

На Stackoverflow в рамках проекта Documentation создан раздел для Unity.
Это позволяет пользоваться документацией к Unity, созданной сообществом.

У такой документации есть преимущества:

  • Любую недоработку в документации может исправить кто угодно.
  • В любой момент можно добавить недостающую информацию.
  • Карма, полученная в рамках этого проекта, идёт в общую карму stackoverflow.

Есть и недостатки:

  • Данный ресурс не является официальным источником информации.
  • Поиск нужного раздела может быть затруднён, так как проект страдает от последствий унификации интерфейса с основным сайтом stackoverflow.

Запросы на добавление недостающей документации можно добавлять через кнопку "Request Topic".
Также можно голосовать за добавление недостающих разделов на главной странице тега Unity.

Ссылка

14 янв 2016

Согласно Unity 5.4.0b1 release notes и Роадмап Unity Web Player, в Unity 5.4, выпуск которого запланирован на март 2016 года, будет прекращена поддержка платформы WebPlayer.

Официальный блог Unity3D рекомендует переводить игры, использовавшие WebPlayer, на платформу WebGL.
Тем не менее, сами Unity признают, что WebGL всё ещё накладывает серьёзные ограничения на некоторые игры, изначально создаваемые для WebPlayer.

Чтобы помочь разработчикам сориентироваться в новой технологии WebGL, на форуме Unity была создана специальная тема WebGL Roadmap, которая помогает понять, какие ограничения есть у WebGL и как их можно обойти. Тема была создана полгода назад, поэтому рекомендуется следить за Unity roadmap и официальным блогом, чтобы быть в курсе изменений платформы WebGL.

Ссылка | Комментарии [10]

12 июля 2015

Unity Technologies планируют портировать редактор Unity на Linux.
Он обязательно будет поддерживать Ubuntu версии не менее 12.04 и будет настолько же функциональным, как и его версии для Mac OS и Windows, кроме сборки игр под iOS.
В данный момент редактор существует в виде отдельной экспериментальной ветки внутри компании. Unity Technologies планируют в скором времени собрать экспериментальную сборку редактора и представить её публике.

Ссылка | Комментарии [9]

27 ноя 2014

Сегодня вышла новая версия Unity 4.6. Главным нововведением в этой версии стала новая система создания пользовательского интерфейса, которая позволяет легко настраивать интерфейс игры в редакторе.

Ссылка

21 авг 2014

Unity4.6 Open Beta | Открытая бета Unity 4.6 доступна для скачивания

Стала доступной открытая бета-версия Unity 4.6: http://unity3d.com/unity/beta/4.6
Главное новшество в ней - новая система UI, которая наконец-таки соответствует современным стандартам.

Приятным бонусом также является исходный код встроенных в Unity шейдеров, который можно скачать на той же странице. Это является следствием инициативы Unity по открытию исхдных кодов своих компонентов: http://blogs.unity3d.com/2014/08/20/more-open-source-initiatives-from-unity/

Ссылка | Комментарии [9]

Бесплатная генерация изображений на русском без VPN

Форум

22 июня 2024

Я использую Photon в проекте. Мне нужно, чтобы при заходе в комнату у каждого игрока был разный скин (один из 10 префабов которые находятся в Resources), как в among us. Если игрок занял скин, то следующие игроки которые войдут в комнату не смогут занять этот скин. Я начинающий, поэтому прошу без оскорблений и т.д. Ниже приведу мой код из MenuManager.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using ExitGames.Client.Photon; // Использование правильного пространства имен

public class MenuManager : MonoBehaviourPunCallbacks
{
    public InputField createInput;
    public InputField joinInput;

    public void CreateRoom()
    {
        RoomOptions roomOptions = new RoomOptions();
        roomOptions.MaxPlayers = 10;

        int[] occupiedPrefabs = new int[10];
        roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } };
        roomOptions.CustomRoomPropertiesForLobby = new string[] { "occupiedPrefabs" };

        PhotonNetwork.CreateRoom(createInput.text, roomOptions, TypedLobby.Default);
    }

    public void JoinRoom()
    {
        PhotonNetwork.JoinRoom(joinInput.text);
    }

    public override void OnJoinedRoom()
    {
        PhotonNetwork.LoadLevel("Game");
        AssignUniquePrefab();
    }

    void AssignUniquePrefab()
    {
        if (PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("occupiedPrefabs", out object occupiedPrefabsObject))
        {
            int[] occupiedPrefabs = (int[])occupiedPrefabsObject;
            int prefabIndex = -1;

            // Находим первый свободный префаб
            for (int i = 0; i < occupiedPrefabs.Length; i++)
            {
                if (occupiedPrefabs == 0)
                {
                    prefabIndex = i;
                    occupiedPrefabs
= 1;
                    break;
                }
            }

            // Обновляем свойства комнаты
            PhotonNetwork.CurrentRoom.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } });

            if (prefabIndex != -1)
            {
                // Сохраняем индекс префаба в свойства игрока
                PhotonNetwork.LocalPlayer.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "prefabIndex", prefabIndex } });

                // Загружаем префаб игрока
                string prefabName = prefabIndex == 0 ? "Player" : "Player" + (prefabIndex + 1);
                Vector3 spawnPosition = GetRandomSpawnPosition(); // Ваша логика определения позиции спавна
                PhotonNetwork.Instantiate(prefabName, spawnPosition, Quaternion.identity);
            }
            else
            {
                Debug.LogError("Нет доступных префабов!");
            }
        }
        else
        {
            Debug.LogError("Свойства комнаты не содержат 'occupiedPrefabs'.");
        }
    }

    public override void OnPlayerLeftRoom(Player otherPlayer)
    {
        base.OnPlayerLeftRoom(otherPlayer);

        if (PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("occupiedPrefabs", out object occupiedPrefabsObject))
        {
            int[] occupiedPrefabs = (int[])occupiedPrefabsObject;

            // Найдите префаб, который использовал этот игрок, и освободите его
            int prefabIndex = GetPlayerPrefabIndex(otherPlayer); // Ваша логика определения префаба игрока
            if (prefabIndex != -1)
            {
                occupiedPrefabs[prefabIndex] = 0;
                PhotonNetwork.CurrentRoom.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } });
            }
        }
    }

    // Пример логики для определения индекса префаба игрока
    int GetPlayerPrefabIndex(Player player)
    {
        // Здесь вы можете реализовать свою логику для определения префаба игрока
        // Например, сохранить индекс префаба в CustomProperties игрока
        if (player.CustomProperties.TryGetValue("prefabIndex", out object prefabIndexObject))
        {
            return (int)prefabIndexObject;
        }
        return -1;
    }

    Vector3 GetRandomSpawnPosition()
    {
        // Ваша логика определения позиции спавна
        return new Vector3(Random.Range(-5f, 5f), Random.Range(-5f, 5f), 0f);
    }
}

21 июня 2024

Я создаю игру, используя HDRP. Переходил на него довольно давно, сейчас же, с увеличением числа объектов на сцене начал встречать проблемы с производительностью
В итоге, мне пришла идея дать игрокам возможность максимально настроить графику под их железо. Так, например, те у кого прям совсем слабый компьютер, могли бы убрать всё, что сильно нагружает систему и добиться уровня графики, как на встроенном рендер пайплайне.
Переходить на другой рендер возможности нет, т.к. много всякого уже связано с HDRP
Подытожу: нужна возможность прямо внутри игры изменять абсолютно все параметры рендеринга. На данный момент уже реализована смена разрешения и лимита ФПС. Все значения, которые игрок поменял во время игры, а после нажал на кнопку "применить", сохраняются в отдельном файле, а при загрузке сцены загружаются из этого файла
Буду благодарен всем, кто сможет хоть как-нибудь помочь!

20 июня 2024


Не билдится под андроид проект с appodeal'ом. Пробовал свой проект, пробовал чистый проект только с appodeal, пробовал их демо проект. Пробовал собирать под разные версии апи. Долго и нудно воевал по рецептам из интернетов, ничего не помогает.

Подскажите, ни у кого нет проблем с этим?
Кому не сложно попробуйте сбилдить это(демо проект от аподилов):
https://github.com/appodeal/appodeal-unity-demo/tree/master

20 июня 2024

При прикосновении моего персонажа с какой-либо стеной или объектом, он начинает отталкиваться.

Вот код:
(Код передвижения)

public interface IInputSystems
{
    public void Move(float speed, GameObject _player);
}

public abstract class InputSystems : MonoBehaviour, IInputSystems
{
    public abstract void Move(float speed, GameObject _player);
}


public class KeyboardDefaultInputSystem : InputSystems
{
    float Vertical;
    float Horizontal;
    private float speed;
    private GameObject _player;
    private Rigidbody _rigidbody;

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.Escape))
        {
            EventBus.menu?.Invoke();

        }        
    }

    public override void Move(float speed, GameObject _player)
    {
        this.speed = speed;
        this._player = _player;
        this._rigidbody = _player.GetComponent<Rigidbody>();
        Vertical = Input.GetAxis("Vertical");
        Horizontal = Input.GetAxis("Horizontal");
        if (Vertical != 0)
        {
            Forward();

        }
        if (Horizontal != 0)
        {
            Right();

        }
        Debug.Log(_rigidbody.velocity.magnitude);

    }

    private void Forward()
    {

        _player.transform.position += _player.transform.forward * Vertical * speed * Time.deltaTime;

        //_rigidbody.AddForce(transform.forward * Vertical * speed);
        

        //this.transform.position += this.transform.forward * speed * Time.deltaTime;
    }



    private void Right()
    {

        //_rigidbody.AddForce(transform.forward * Vertical * speed);
        
        _player.transform.position += _player.transform.right * Horizontal * speed * Time.deltaTime;
    }
}

Код персонажа:

    public class PlayerController : Player
    {
        private IInputSystems _inputSystem;
        private ICameraSystem _cameraSystem;
        private void Awake()
        {
            Cursor.lockState = CursorLockMode.Locked;
            _inputSystem = this.transform.AddComponent<KeyboardDefaultInputSystem>();
            _cameraSystem = this.transform.AddComponent<DefaultCameraSystemWithBobbing>();
        }

        void Update()
        {

            _cameraSystem.Camera_Rotate(sensitivity, smoothing, _camera_parent, _player);

        }

        private void FixedUpdate()
        {
            _inputSystem.Move(speed, this.gameObject);

        }
    }
}

Знаю что это происходит из-за того что один коллайдер входит в другой из-за обновления позиции, а не добавления силы через AddForce - FixedUpdate делает картинку дерганой, rigidbody.AddForce крайне неудобная система

Есть-ли тут еще какое-нибудь решение?

15 июня 2024

Приветствую всех. Мы начинающая команда разработчиков игр на юнити и разрабатываем игру жанра a-rgp по типу hades. Ищем других разработчиков для совместной разработки игры.
Сейчас мы ищем программистов 3д моделлеров и аниматоров и для нашего проекта
Если работа будет выполнено качественно и в срок то мы оплатим ваши умения.
телеграм @kerosin122

11 июня 2024

В общем, 2 дня бился с багом - при включенном навмеш агенте персонажи как то плохо поворачиваются стоя на месте, типа скользят ботинками по земле, при этом я помнил что раньше такого не было. Долго рылся в коде, ничего подозрительного не нашел. Перепробовал все настройки в аниматоре и в навмеш агенте, никакого эффекта. Стал отключать скрипты на персонаже по одному, оказалось что никакой скрипт на это не влияет, однако персонаж начинает нормально поворачивать если отключить навмеш агент или удалить ригидбоди с контроллера. Искал в интернетах что то похожее по описанию, ничего не нашел. Нашел на компе прошлогодний проект, запустил - в нем персонажи поворачивают как надо. В конце концов для сравнения поместил в одну сцену персонажа из нового проекта и из старого, удалил с них вообще всё что только можно, оставил на обоих только аниматор с одной анимацией поворота, навмеш агента и ригидбоди. И оказалось, что настройка интерполяции ригидбоди влияет на поведение навмеш агента! Из-за одной галочки потерял можно сказать 2 дня! И это нигде не описано! И почему она так влияет, тоже непонятно. Поэтому решил написать здесь, вдруг кому пригодится

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

10 июня 2024

Привет всем!
Есть сплайн \ кривая, которая задается 4-я точками: pints[0] - points[3]
points[0] и [3] - крайние точки.
Мне нужно добиться равномерного распределения точек на этом сплайне при любых значениях points[1] и [2].

Экспериментировал с двумя сплайнами:
- Безье
- B-spline

В обоих случаях видно, что плотность распределения зависит от параметров [1] и [2].
Какой сплайн\кривая позволяют обеспечить равномерное распределение точек?
- | Открытая бета Unity 4.6 доступна для скачивания

На рисунке видно как меняется плотность (позиция кубика) в зависимости от положения point[1].

9 июня 2024

Всем привет! Делаю детскую раскраску и храню информацию о рисунке в виде текстуры, модифицируя через setPixel + Apply. В материале использую текстуру раскраски + текстуру рисунка + текстуру кисти для получения финальной картинки. Работает такой подход чрезвычайно медлено (я так понимаю, что каждый тач эвент триггерит копирование информации о модифицированной текстуре рисунка в видео память) . Не смог найти информацию о модификации текстуры прям в шейдере материала, в таком случае мог бы просто передовать только текущую позицию тача. Возможен ли такой подход?

9 июня 2024

Мне нужно добавить в игру снег, который будет particle effect. Как это реализовать?

Я попробовал это сделать при помощи скрипта, который делает, чтобы снег всегда висел над игроком и следовал за его положением в пространстве, только прибавляя свое положение по координате оси Y(чтобы он был сверху), но стало слишком заметно, что снег лишь над игроком. (Игра у меня 3D, карта большая, поэтому растягивать particle на большую зону съест слишком много FPS)

27 мая 2024

Товарищи, всех приветствую.
Делаю эффекты для игры а-ля homm 3. Всё нарисовал, собрал - красиво, сочно, вкусно. Требуется оптимизация, и всё бы ничего, но есть люто-бешеное желание засунуть все текстуры в атлас.
Столкнулся с проблемой - текстуры из эффектов, в которых используется sheet animation или текстуры из шейдеров нельзя засунуть в атлас.
Первый вариант - потому что атлас это как бы и есть подобие sheet, и нельзя же сделать sheet в sheet, по крайней мере я не нашёл как.
Второй вариант - это ведь не материал, а шейдер написанный на шейдерграфе, и текстуру он берёт не просто из папки, как любые простые материалы.
Какие есть варианты, кто сталкивался и решал проблему?
На первый взгляд это попросту невозможно.