Jump to content

Unity: полезные скрипты (команды)


Recommended Posts

Полезные для новичков скрипты c# для Unity. Тут как отдельные "команды" (что-то вроде записной книжки, чтобы не заучивать синтаксис), так и небольшие кусочки кода, которые помогут лучше понять принципы работы.

Как из скрипта включить/выключить другой скрипт

 

Указываете вместо ActivateScript имя своего метода, а вместо NameScript имя скрипта, который прикреплен к объекту. 

Оставляете gameObject, если этот код будет отключать другой скрипт, который прикреплен на этом же объекте. Если нужно, чтобы этот код был на одном объекте, а выключал он скрипт у другого объекта, тогда необходимо создать публичную переменную типа GameObject и в инспекторе поместить в нее нужный объект, на котором включаем/выключаем скрипт.

Для выключения скрипта в коде замените true на false.

    //активирует скрипт (если таковой есть) https://gcup.ru/forum/59-41557-1
    public void ActivateScript ()
    {
        gameObject.GetComponent<NameScript>().enabled = true;
    }

Поиск объектов Unity

Поиск по тегу


Присваивает переменной ссылку на игрока, находя его по тегу:

GameObject PlayerFound = GameObject.FindGameObjectWithTag("Player");

Поиск по имени в редакторе

GameObject foundObject = GameObject.Find("NameObjectFromHierarhy");

Создает переменную типа GameObject под названием foundObject ("найденный объект"), и помещает туда объект, который найдется на сцене (в иерархии юнити) с именем NameObjectFromHierarhy.

Link to post
Share on other sites
 

Перемещение объектов

Вместо Object4Mouving подставляйте имя переменной, которая в вашем скрипте ссылает на нужный объект:

Object4Mouving.transform.position = new Vector3(1, 2, 3);//перемещение объекта Object4Mouving в указанные координаты по X,Y,Z

 

Link to post
Share on other sites
 

Полезные кусочки кода скриптов

Небольшие фрагменты, которые можно использовать, как заготовки

 

Перемещение по нажатию на кнопку

 

По нажатию на Q создает ГеймОбжект с именем Object4Mouving и приписывает туда ссылку на объект из иерархии с названием TireNearLike. Название ставьте свое, выбирайте имя того объекта, которое необходимо найти на сцене. Далее объект переносится в указанные координаты.

        //изменение позиции объекта(тест поиска объекта для изменения его позиции по его имени)
        if (Input.GetKeyUp(KeyCode.Q)) //будет срабатывать по нажатию Q
        {
            Debug.Log("Сработало перемещение объекта по Q"); //выводит инфу в консоль
            GameObject Object4Mouving = GameObject.Find("TireNearLike"); //поиск объекта по названию в иерархии юнити
            Object4Mouving.transform.position = new Vector3(1, 2, 3);//перемещение этого объекта в указанные координаты по X,Y,Z
        }

Создание (инициализация, спавн) объектов в Unity

 

Создает объект из указанного в инспекторе экземпляра. Координаты созданного объекта будут такими же, как координаты объекта, на котором висит скрипт. Можно перетянуть в публичную переменную, как префаб, так любой объект из окна иерархии.

    //инициализирует какой-либо объект
    public GameObject gameObject4Spawn; //создаем публичную переменную gameObject4Spawn (игровой объект для спавна), сюда нужно переместить в инспекторе объект, который вы хотите создать в игре (из префаба или сцены)
    public void GenerateGameObject()//создаем функцию, вызвав которую создастся этот объект
    {
        Instantiate(gameObject4Spawn);//создание объекта
    }
//теперь в коде этого скрипта (в Start, Update и т.п.) вызывайте функцию "GenerateGameObject();" и в игре появится объект.

 

Как вычислить дистанцию до объекта (монитор дистанции)

 

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

 

Скрипт необходимо повесить на объект, относительно которого будем высчитывать расстояние до игрока (в нашем случае это лампочка). В самом скрипте объявляем переменные (не в Update), и в инспекторе перетаскиваем в них нужные объекты:

    [Tooltip("лампочка, включающаяся при приближении")]
    public GameObject light4Load;
    [Tooltip("объект, относительно которого задается расстояние для определения при каком приближении включать подсветку двери")]
    public Transform monitorDistance;

В Update пишем:

        //если игрок подходит к двери на определенное растояние,  то срабатывает подсветка, если уходит, то выключается
        if (Vector3.Distance(transform.position, monitorDistance.position) < 6.0f)        //если дистанция меньше 6
        {
               light4Load.SetActive(true); //активируем лампочку
            Debug.Log("Монитор дистанции для вкл/выкл лампы сработал");//сообщаем в консоли, что сработало
        }
        else //если расстояние не меньше 6
        light4Load.SetActive(false);//выключаем лампочку

Логика скрипта

 

  • Сначала создаем переменную типа GameObject под названием light4Load (свет для включения), туда в инспекторе помещаем лампочку, которую нужно включать при приближении игрока.
  • Потом создаем переменную типа Transform с именем monitorDistance, куда помещаем игрока. Так как это тип переменной Transform, то там будут храниться координаты игрока (я так понимаю). Далее будем вычислять расстояние от monitorDistance до объекта, на котором висит этот скрипт.
  • Vector3.Distance это метод, который высчитывает расстояние от одного объекта до другого. Мы туда передаем два параметра: это позиция объекта, на котором скрипт - это "transform.position" и позиция игрока - это "monitorDistance.position".
  • В операторе if идет проверка, если Vector3.Distance возвращает число меньше 6.0f (т.е. расстояние между этими двумя объектами меньше 6 юнитивских метров), тогда активируется лампочка "light4Load.SetActive(true);" (изначально должна быть выключена в инспекторе). Плюс в консоль идет инфа, что лампа включилась.
  • Если расстояние не меньше 6 метров (оператор "else"), тогда лампочка выключается.

 

 

 

 

Link to post
Share on other sites
 
 
 
  • 1 month later...

FPS - заблокировать камеру и отобразить курсор

Если нужно в стандартном FPS контроллере (FPSController, а не RigidBodyFPSController) из ассетов заблокировать движение камеры и вывести курсор по нажатию кнопки, то можно это сделать с помощью кода. Редактируем FirstPersonController.cs

 

В Update пишем это

 

            // вкл/вык курсор
            if (Input.GetKeyDown(KeyCode.Z))
            {
                m_MouseLook.SetCursorLock(!m_MouseLook.lockCursor); // при каждом вызове вкл/выкл отображение курсора
                BlockMouseRotate(); // при каждом вызове вкл/выкл вращение камеры за курсором
            }

Вне каких-либо методов в том же файле:

        // БЛОКИРУЕТ ДВИЖЕНИЕ МЫШЬЮ
        float oldXSensitivity; // для сохранения изначальной Х сенсы мыши
        float oldYSensitivity; // для сохранения изначальной Y сенсы мыши
        bool isMouseBlock = false; // переключатель для проверки поставили ли мы сенсу на 0
        void BlockMouseRotate()
        {
            if (isMouseBlock == false) // если мы еще не блокировали мышку
            {
                // сохраняем старые значения
                oldXSensitivity = m_MouseLook.XSensitivity;
                oldYSensitivity = m_MouseLook.YSensitivity;
                // блокируем поворот мыши
                m_MouseLook.XSensitivity = 0;
                m_MouseLook.YSensitivity = 0;
                // переключатель в режим блокирования
                isMouseBlock = true;
            }
            else // если мыш уже заблокирована
            {
                // восстанавливаем старые значения поврота (разблокируем)
                m_MouseLook.XSensitivity = oldXSensitivity;
                m_MouseLook.YSensitivity = oldYSensitivity;
                isMouseBlock = false; // переключатель в "мыш не заблокирована"
            }
        }

Теперь по нажатию Z у вас перестает вращаться камера и появляется курсор. Повторное нажатие обращает изменения.

 

На RigidBodyFPSController не тестировал, на виде от третьего лица тоже.

Link to post
Share on other sites
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Powered by Invision Community
Поддержка Invision Community в России

×
  • Create New...