Почему unity не видит скрипт
Перейти к содержимому

Почему unity не видит скрипт

  • автор:

Создание и Использование Скриптов

Поведение игровых объектов контролируется с помощью компонентов ( Components ), которые присоединяются к ним. Несмотря на то, что встроенные компоненты Unity могут быть очень разносторонними, вскоре вы обнаружите, что вам нужно выйти за пределы их возможностей, чтобы реализовать ваши собственные особенности геймплея. Unity позволяет вам создавать свои компоненты, используя скрипты . Они позволяют активировать игровые события, изменять параметры компонентов, и отвечать на ввод пользователя каким вам угодно способом.

Unity изначально поддерживает три языка программирования:

  • C# (произносится как Си-шарп), стандартный в отрасли язык подобный Java или C++;
  • UnityScript, язык, разработанный специально для использования в Unity по образцу JavaScript;

В дополнение к этим, с Unity могут быть использованы многие другие языки семейства .NET, если они могут компилировать совместимые DLL — см. эту страницу для получения подробностей.

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

Создание скриптов

В отличии от других ассетов, скрипты обычно создаются непосредственно в Unity. Вы можете создать скрипт используя меню Create в левом верхнем углу панели Project или выбрав Assets > Create > C# Script (или JavaScript/Boo скрипт) в главном меню.

Новый скрипт будет создан в папке, которую вы выбрали в панели Project. Имя нового скрипта будет выделено, предлагая вам ввести новое имя.

Лучше ввести новое имя скрипта сразу после создания чем изменять его потом. Имя, которое вы введете будет использовано, чтобы создать начальный текст в скрипте, как описано ниже.

Структура файла скрипта

После двойного щелчка на скрипте в Unity, он будет открыт в текстовом редакторе. По умолчанию Unity будет использовать MonoDevelop, но вы можете выбрать любой редактор из панели External Tools в настройках Unity.

Содержимое файла будет выглядеть примерно так:

using UnityEngine; using System.Collections; public class MainPlayer : MonoBehaviour < // Use this for initialization void Start () < >// Update is called once per frame void Update () < >> 

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

Основные вещи, достойные внимания, это две функции, определенные внутри класса. Функция Update — это место для размещения кода, который будет обрабатывать обновление кадра для игрового объекта. Это может быть движение, срабатывание действий и ответная реакция на ввод пользователя, в основном всё, что должно быть обработано с течением времени во игровом процессе. Чтобы позволить функции Update выполнять свою работу, часто бывает полезно инициализировать переменные, считать свойства и осуществить связь с другими игровыми объектами до того, как будут совершены какие-либо действия. Функция Start будет вызвана Unity до начала игрового процесса (т.е. до первого вызова функции Update), и это идеальное место для выполнения инициализации.

Заметка для опытных программистов: вы можете быть удивлены, что инициализация объекта выполняется не в функции-конструкторе. Это потому, что создание объектов обрабатывается редактором и происходит не в начале игрового процесса, как вы могли бы ожидать. Если вы попытаетесь определить конструктор для скриптового компонента, он будет мешать нормальной работе Unity и может вызвать серьезные проблемы с проектом.

A UnityScript script works a bit differently to C# script:

#pragma strict function Start () < >function Update ()

Здесь функции Start и Update имеют такое же значение, но класс не объявлен явно. Предполагается, что скрипт сам по себе определяет класс; он будет неявно производным от MonoBehaviour и получит своё имя от имени файла скриптового ассета.

Управление игровым объектом

Как было сказано ранее, скрипт определяет только план компонента и, таким образом, никакой его код не будет активирован до тех пор, пока экземпляр скрипта не будет присоединен к игровому объекту. Вы можете прикрепить скрипт перетаскиванием ассета скрипта на игровой объект в панели Hierarchy или через окно Inspector выбранного игрового объекта. Имеется также подменю Scripts в меню Component, которое содержит все скрипты, доступные в проекте, включая те, которые вы создали сами. Экземпляр скрипта выглядит так же, как и другие компоненты в окне Inspector:-

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

// Use this for initialization void Start ()

Debug.Log это команда, которая просто выводит сообщение на консольный вывод Unity. Если вы нажмете сейчас Play, вы увидите сообщение внизу основного окна редактора Unity в окне Console (меню: Window > Console ).

Не видит данные скрипта, который наследуется от другого (scriptableobject) C# UNITY

Делаю инвентарь. Есть основной скрипт Item, где указаны основные общие параметры предметов. От него наследуется скрипт Equipment, в котором указаны параметры, присущие только отдельным предметам (чтобы удобнее было создавать различные типы) и реализуется он через ScriptableObject. После создания предмета я пытаюсь обратиться к параметру (который есть только в скрипте Equipment) через Item — но мне пишет, что в Item нет таких переменных! Т.е. получить я могу только те переменные, которые хранятся именно в Item, а все, что в Equipment я не вижу, хотя он наследуется от Item. Как же мне тогда получить нужные мне переменные?

Отслеживать
задан 10 янв 2023 в 11:18
13 1 1 серебряный знак 3 3 бронзовых знака
Намёк: лучше один раз показать, чем 10 раз рассказать.
10 янв 2023 в 11:20

По коду: наследовать equipment от item — немного не правильно. item — штука, equipment — совокупность штук. Это как отнаследовать автомобиль от колеса))

10 янв 2023 в 11:21

@АлексейШиманский да я это и сам понимаю, просто получается что я обращаясь к машине хочу получить данные колеса, а оно не дает. Вот и спрашиваю — как это сделать тогда правильно?

10 янв 2023 в 11:24
Нет, вы ничего не поняли. . а как сделать: читайте намёк
10 янв 2023 в 11:25

@АлексейШиманский так что именно я неправильно сделал то? Item — это базовый класс с основными параметрами, а Equipment — имеет все то же, что и Item + свои отдельные параметры, поэтому и наследуется от него — по-моему все логично?

Unity не реагирует на скрипт?

У меня есть написанный код, и он верный, так как ради проверки в чем ошибка: в коде или Unity был скопирован с помощью горячих клавиш точно рабочий код. Проблема в следующем: после строчек с GetComponentInChildren он должен выводить доступ к параметрам (скорость, сила прыжка) в самом юнити во вкладке Hero? Но почему-то этого не делает.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Hero : MonoBehaviour < private int lives = 3; private float speed = 4.0f; private float jumpforce = 1.0f; public Rigidbody2D PlayerRigidbody; public Animator charAnimator; public SpriteRenderer sprite; bool OnGround; private void Awake() < PlayerRigidbody = GetComponentInChildren(); charAnimator = GetComponentInChildren(); sprite = GetComponentInChildren(); > void Start() < >void Move() < Vector3 tempvector = Vector3.right * Input.GetAxis("Horizontal"); transform.position = Vector3.MoveTowards(transform.position, transform.position + tempvector, speed * Time.deltaTime); if (tempvector.x < 0) < sprite.flipX = true; >else < sprite.flipX = false; >> void jump() < PlayerRigidbody.AddForce(transform.up * jumpforce, ForceMode2D.Impulse); >void CheckGround() < Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 2f); OnGround = colliders.Length >1; Debug.Log(colliders.Length); > private void FixedUpdate() < CheckGround(); >void Update() < if (Input.GetButton("Horizontal")) < Move(); >if (OnGround && Input.GetButton("Jump")) < jump(); >> >
  • Вопрос задан более трёх лет назад
  • 1039 просмотров

5 комментариев

Средний 5 комментариев

Не видит скрипт

Author24 — интернет-сервис помощи студентам

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

, мне выдаёт ошибку, что этого скрипта не существует. В файлах скрипт есть, имя у него есть, расширение .cs как и должно быть. Из-за чего это может быть, что не так? Заранее благодарен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *