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]

https://premium-vozduh.ru/

Форум

12 мая 2025

Привет всем!
SteamWorksAPI предоставляет интсрументы и с ним проблем нет.
А вот как установить DRM на EPIC GameStore и VKPlay не пойму, опыта нет.

Вроде как можно сделать бесплатную DRM, но я не понял как. Можете подсказать примеры, статьи, плагины?

3 мая 2025

Как в этом скрипте, после нажатия "E" выключить не сам объект, а скрипт на нем.

using UnityEngine;
using DialogueEditor;

public class ConvStarter : MonoBehaviour
{
    [SerializeField] private NPCConversation myConversation;
    public GameObject PauseMenu;

    public void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            if (Input.GetKeyDown(KeyCode.E))
            {
                ConversationManager.Instance.StartConversation(myConversation);
                PauseMenu.SetActive(false);
                Cursor.lockState = CursorLockMode.None;
                Cursor.visible = true;
            }
        }
    }
}


Отключаемый скрипт - контроллер камеры, который, собственно, висит на камере. При нажатии на Е, нужно отключить его, чтобы зафиксировать положение камеры до выхода из диалога.

3 мая 2025

Подскажите, как полностью заблокировать вращение камеры по нажатию на кнопку? Есть взаимодействие по кнопке через триггер. После нажатия камеру нужно зафиксировать в одном положении до выхода из взаимодействия.

using UnityEngine;
using DialogueEditor;

public class ConvStarter : MonoBehaviour
{
    [SerializeField] private NPCConversation myConversation;
    public GameObject PauseMenu;

    public void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            if (Input.GetKeyDown(KeyCode.E))
            {
                ConversationManager.Instance.StartConversation(myConversation);
                PauseMenu.SetActive(false);
                Cursor.lockState = CursorLockMode.None;
                Cursor.visible = true;
            }
        }
    }
}

3 мая 2025

При начале диалога с нпс, курсор для выбора ответов не появляется, камера продолжает следить за мышью. Как зафиксировать камеру после нажатия E и добавить поялвение курсора? Добавление Cursor.lockState не помогает, так как в другом канвасе с меню паузой он уже есть. Видимо, он и не дает появиться курсору в диалоге. Есть предположения, как это исправить?

using UnityEngine;
using DialogueEditor;

public class ConvStarter : MonoBehaviour
{
    [SerializeField] private NPCConversation myConversation;

    private void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            if(Input.GetKeyDown(KeyCode.E))
            {
                ConversationManager.Instance.StartConversation(myConversation);               
            }
        }
    }
}

void Update()
{
    if (isPaused)
    {
        Cursor.lockState = CursorLockMode.None;
    }
    else Cursor.lockState = CursorLockMode.Locked;
    if (Input.GetKeyDown(KeyCode.Escape))
    {
        if(isPaused)
        {
            Resume();
        }
        else
        {
            Pause();
        }

    }

27 апр 2025

Делюсь опытом

Я использую cursor. Использую не как джун, потому как джун не разберётся в тех ошибках, которые курсор наваливает. Но радость в том, что они логически легко находимы, когда есть опыт. К чему я это? Через много попыток пинков по курсору и дебагу, я добился следующего результата. Хотел универсальный 1 скрипт. Который рубит все вложеные мешки объекта, накладывает заплатку с материалом из инспектора. Потом их раскидывает взрывом, вызывая эффекты, прикрепляя эффекты к осколкам. При этом приоритеты реза по вероятностном распределению должны быть ближе к центру. Малые осколки сразу дестрой. И много иных плюшек. А ещё, работа над осколками должна быть размазан по трудоемкости корутиной. Да, с асинк не получилось.
Итого. Универсальный инструмент взрыва, обычного разрушения с тотальной подстройкой параметров и использованием библиотеки ezyslice, которую курсор сам как-то выкопал на гитхабе. Если эту библиотеку ещё и перерыть и перенастроить на многопоточку или просто на асинк, то будет вообще бомба уровня А. Но мне и так достаточно

27 апр 2025

Привет всем!
Мое приложение во время работы модифицирует некоторые ScriptableObjects (использую их в качестве файлов для сохранения состояния игры).
Экземпляры этих ScriptableObjects находятся внутри Assets/...

Также у меня есть материалы (тоже лежат в каталогах внутри Assets/...), которые назначены префабам через инспектор.
В процессе игры эти материалы меняют свои настройки (material.SetFloat("...", value)). Получается, эти материалы модифицируются во время работы.

Ознакомившись с процедурой подписания приложений для OSX, пришел к тому, что мое приложение модифицирует свои файлы и после первого запуска, подписаное приложение перестанет запускаться т.к. подпись станет недействительной из-за расхождения контрольных сумм.
Или все хорошо, расхождений не будет? У кого есть опыт, можете пояснить эти моменты?

27 апр 2025

Как подвязать слайдер к чувствительности мыши? 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CameraController : MonoBehaviour
{
    public Transform playerTransform;
    public float sensitivity = 2f;

    public float minXAngle = -30f;
    public float maxXAngle = 30f;

    public float smoothSpeed = 10f;
    private float rotationX = 0f;
    private float rotationY = 0f;
 

    private void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * sensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity;

        rotationX -= mouseY;
        rotationY += mouseX;

        rotationX = Mathf.Clamp(rotationX, minXAngle, maxXAngle);

        Quaternion targetRotation = Quaternion.Euler(rotationX, rotationY, 0);

        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smoothSpeed * Time.deltaTime);

    }

}

26 апр 2025

При запуске сцены камера двигается только вертикально. В чем может быть проблема?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform playerTransform;
    public float sensitivity = 2f;

    public float minXAngle = -30f;
    public float maxXAngle = 30f;

    public float minYAngle = -360f;
    public float maxYAngle = -360f;

    public float smoothSpeed = 10f;
    private float rotationX = 0f;
    private float rotationY = 0f;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    private void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * sensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity;

        rotationX -= mouseY;
        rotationY += mouseX;

        rotationX = Mathf.Clamp(rotationX, minXAngle, maxXAngle);
        rotationY = Mathf.Clamp(rotationY, minYAngle, maxYAngle);

        Quaternion targetRotation = Quaternion.Euler(rotationX, rotationY, 0);

        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smoothSpeed * Time.deltaTime);

    }
}

26 апр 2025

Как из статичного значения сенсы мыши сделать его настраиваемым и подвязать к слайдеру в настройках?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] private float rotateSpeed = 150;
    [SerializeField] private float walkSpeed = 7;
    [SerializeField] private float runSpeed = 10;
    [SerializeField] private float jumpForce = 6;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController characterController;
    private Camera playerCamera;

    private Vector3 velocity;
    private Vector2 rotation;
    private Vector2 direction;

    private void Start()
    {
        characterController = GetComponent<CharacterController>();
        playerCamera = GetComponentInChildren<Camera>();
        Cursor.lockState = CursorLockMode.Locked;
    }


    private void Update()
    {
        characterController.Move(velocity * Time.deltaTime);
        direction = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
        Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        if (characterController.isGrounded) velocity.y = Input.GetKeyDown(KeyCode.Space) ? jumpForce : -0.1f;
        else velocity.y += gravity * Time.deltaTime;

        mouseDelta *= rotateSpeed * Time.deltaTime;
        rotation.y += mouseDelta.x;
        rotation.x = Mathf.Clamp(rotation.x - mouseDelta.y, -90, 90);
        playerCamera.transform.localEulerAngles = rotation;
    }


    private void FixedUpdate()
    {
        direction *= Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
        Vector3 move = Quaternion.Euler(0, playerCamera.transform.eulerAngles.y, 0) * new Vector3(direction.x, 0, direction.y);
        velocity = new Vector3(move.x, velocity.y, move.z);
    }
}

21 апр 2025

Приветствую, прошу извинить за скомканность, совсем запуталась.
3д проект. Через ESC вызывается пауза с кнопками. При нажатии, например, на "Сохранить игру", появляется следующая панель, предыдущая закрывается. Здесь все просто.

Проблема: Находять на панели сохранения игры, если еще раз нажать ESC, снова появляется меню пазуы, соответсвенно, панели накладываются друг на друга.

Вопрос: как это вообще исправлять? Добавить ESС возврат на предыдущую панель (с панели созранения на панель паузы)? Или как-то отключать esc после одного нажатия и просто добавить в канвасе паузы кнопку возврата в игру? Гайды очень обрывисты, а знаний не хватает, помогите!

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class PauseMenu : MonoBehaviour
{
    public static bool isPaused = false;
    public GameObject pauseMenuUI;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }


    void Update()
    {
        if (isPaused)
        {
            Cursor.lockState = CursorLockMode.None;
        }
        else Cursor.lockState = CursorLockMode.Locked;
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if(isPaused)
            {
                Resume();
            }
            else
            {
                Pause();
            }

        }
    }

    public void Resume()
    {
        pauseMenuUI.SetActive(false);
        Time.timeScale = 1f;
        isPaused = false;
    }

    public void Pause()
    {
        pauseMenuUI.SetActive(true);
        Time.timeScale = 0f;
        isPaused = true;
    }

    public void ResumeButton()
    {
        pauseMenuUI.SetActive(false);
        Time.timeScale = 1f;
        isPaused = false;
    }
}

https://gamedev.ru/files/images/?id=183289
https://gamedev.ru/files/images/?id=183290
https://gamedev.ru/files/images/?id=183291