Как обратиться к переменной из другого класса c
Перейти к содержимому

Как обратиться к переменной из другого класса c

  • автор:

Доступ к переменной из другого скрипта C #

Можете ли вы рассказать мне, как получить доступ к переменной script из другого script? Я даже прочитал все на веб-сайте единства, но я все еще не могу это сделать. Я знаю, как получить доступ к другому объекту, но не к другой переменной. Это ситуация: Im in script B, и я хочу получить доступ к переменной X от script A. Переменная X равна boolean . Можете ли вы мне помочь? Btw Мне нужно обновить значение X s в script B, как это сделать? Доступ к нему в функции Update Если бы вы могли дать мне и пример с этими письмами, это было бы здорово! Спасибо

Lorenzo Spoleti 19 сен. 2014, в 12:15
Поделиться
Не могли бы вы добавить пример кода ваших двух скриптов? Поможет в предоставлении вам решения.
Jan Thomä 19 сен. 2014, в 10:34
Возможный дубликат In Unity, как я могу передавать значения из одного скрипта в другой?
Heisenbug 19 сен. 2014, в 11:26
Поделиться:

3 ответа

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

Например, у меня есть scriptA.cs в GameObject A и scriptB.cs в GameObject B :

scriptA.cs

// make sure its type is public so you can access it later on public bool X = false; 

scriptB.cs

public GameObject a; // you will need this if scriptB is in another GameObject // if not, you can omit this // you'll realize in the inspector a field GameObject will appear // assign it just by dragging the game object there public scriptA script; // this will be the container of the script void Start() < // first you need to get the script component from game object A // getComponent can get any components, rigidbody, collider, etc from a game object // giving it meaning you want to get a component with type scriptA // note that if your script is not from another game object, you don't need "a." // script = a.gameObject.getComponent(); <-- this is a bit wrong, thanks to user2320445 for spotting that // don't need .gameObject because a itself is already a gameObject script = a.getComponent(); > void Update() < // and you can access the variable like this // even modifying it works script.X = true; >

Jay Kazama 19 сен. 2014, в 11:35
Поделиться

Должен ли быть доступ к X с помощью script.X = true; а не scriptA.X = true; ? Вы не можете получить доступ к X таким образом, если он не static

DarkCygnus 30 май 2016, в 17:02
@GrayCygnus упс, ты заметил мою ошибку. Спасибо, я исправил это.
Jay Kazama 31 май 2016, в 09:46

Если вы в любом случае ссылаетесь на GameObject a вы также можете просто напрямую ссылаться на требуемый компонент, не GetComponent

derHugo 10 окт. 2018, в 05:05
Показать ещё 1 комментарий

только для завершения первого ответа

нет необходимости в a.gameObject.getComponent();
a уже является игровым объектом, так что это будет делать a.getComponent();
и если переменная, к которой вы пытаетесь получить доступ, находится у детей игрового объекта, который вы должны использовать a.GetComponentInChildren();
и если вам нужна переменная или метод, вы можете получить к ней доступ, как это a.GetComponentInChildren().nameofyourvar; a.GetComponentInChildren().nameofyourmethod(Methodparams);

Milad Qasemi 19 сен. 2014, в 15:40
Поделиться
спасибо за исправление, я пропустил это.
Jay Kazama 19 сен. 2014, в 15:51

Здесь вы можете использовать static.

ScriptA.cs

Class ScriptA : MonoBehaviour

ScriptB.cs

Class ScriptB : MonoBehaviour < void Update() < bool AccesingX = ScriptA.X; // or you can do this also ScriptA.X = true; >> 

для более подробной информации, вы можете обратиться к классу singleton.

Kartik Shah 09 июнь 2017, в 09:58
Поделиться

Ещё вопросы

  • 0 Могу ли я работать с 4 int32_t, содержащимися в __m128i?
  • 1 Нужна помощь, создав диалог с 2 NumberPickers
  • 1 Насколько близко мы можем программно добраться до аппаратного обеспечения устройства Android?
  • 1 Как использовать сводку проверки для конкретной кнопки в asp.net?
  • 0 Select2 не позволяет разблокировать раскрывающийся список
  • 0 Рафаэль, рисовать и изменять размеры вертикальных линий
  • 0 Можно ли декодировать данные mp3, хранящиеся в байтовом массиве?
  • 0 Записи заказов по определенному заказу с определенными значениями строк
  • 0 Как разрешить дублирование идентификатора строки mysql в массиве?
  • 0 MySQL: mysqli_fetch_array ()
  • 0 javascript, div мигает вместо исчезновения
  • 0 Вставьте верхние / нижние колонтитулы страницы при печати документа HTML
  • 0 m_hIcon = AfxGetApp () -> LoadIcon (IDR_MAINFRAME); Утверждение не выполнено: at afxwin1.inl
  • 0 JQuery запускающее действие при загрузке страницы
  • 1 RadioButton выравнивает текст по левой стороне и кнопку вправо
  • 0 Измените символ € (сохраненный в базе данных) на € (символ евро) в FPDF PHP
  • 0 Проблемы с nl2br () и mysqli_real_escape_string (), работающими вместе
  • 1 Node.js fs.writeFile: err возвращает ноль
  • 1 определение типа данных в Python
  • 0 HTML / CSS — Cross Shape с изображением в нем
  • 0 C ++ ошибка Valgrind
  • 0 Можно ли позже конвертировать MySQL в AWS (веб-сервисы Amazon)?
  • 0 Создание более конкретного отчета в скрипте Sql / php
  • 0 Angular — Как изменить значение свойства $ scope с помощью функции в $ scope
  • 1 консолидация избыточной информации в цикле
  • 0 Определение объекта подкласса
  • 1 Как я могу определить базовый тип в объектном типе dtype?
  • 0 Модуль AngularJS внутри «корневого модуля»
  • 1 Как создать собственный словарь из списков строк быстрее
  • 0 обеспечение единого #defines среди всех объектных файлов
  • 0 порядок php по 2 параметрам
  • 0 Клонировать элементы ввода и очистить значения после
  • 1 Датагрид привязка МВВМ
  • 0 Как преобразовать первые 15 символов в массиве символов в std :: string в C ++?
  • 1 Как получить доступ к ресурсам из JAR?
  • 1 Как выбрать тот же вариант, который был выбран на другой странице
  • 1 Лямбда в C #, Захват внешних переменных — Pls объясните пример из книги «C # в словах 5.0»
  • 1 Bukkit Плагин Minecraft Сундуки заполнить и построить из класса с INT в списке
  • 0 Как обнаружить некоторые символы типа «$ #% @ * & $!» из строки в php?
  • 1 Есть ли способ применить метод finalize ()?
  • 0 Бинарный столбец SQL, если пользователь играл
  • 1 Запустите скрипт на удаленном компьютере без преобладания sudo
  • 1 добавить новую строку другого цвета в конце таблицы
  • 0 Изменить вкладку отзывов на тему ультимо
  • 0 Как эффективно удалить строки из таблицы на основе текстового поиска?
  • 0 Angularjs не публиковать скрытые значения
  • 1 Python: объект ‘PyQt5.QtCore.pyqtSignal’ не имеет атрибута ‘connect’
  • 1 Поворот холста и представление растрового изображения
  • 1 Java не может отправить письмо с HTML с изображениями
  • 1 Разрешение захваченного изображения OpenCV против фотоаппарата

Вызвать переменную из другого класса

Всем доброго. Пытаюсь программировать на С#, но уперся уже несколько дней — не могу вызвать переменную из другого («а») из другого класса («Class1′).

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < new Class1(); double b = Class1.a; Console.WriteLine("a = ", b); while (true) < try < string command = Console.ReadLine(); if (command == "stop") < break; >> catch (System.Runtime.InteropServices.COMException) < >> > > > 

Класс, от которого надо взять значение переменной «а» максимально упрощен

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 < public class Class1 < public double a = 179; >>

Пробовал гуглить, яндексить и т. д. — не помогло.

Как вызвать переменную из другого метода

Есть метод ReturnWord , который вызывает случайный элемент из списка и возвращает его в list[index] . Нужен еще один метод который показывает слово из списка, которое было вызвано методом ReturWord , не вызывая этот метод. Не могу понять как сохранить переменную save и вызвать ее в другом методе.

public string save < get; set; >public string ReturnWord() < Listlist = new List() < , , , , , >; var random = new Random(); int index = random.Next(list.Count); save = list[index]; return list[index]; > public string SaveReturnWord()

P.S. ReturnWord вызываю и всё отлично работает, SaveReturnWord в отладке пишет что его значение null.

Отслеживать
3,186 3 3 золотых знака 15 15 серебряных знаков 30 30 бронзовых знаков
задан 6 июн 2020 в 18:51
Дима Матвиенко Дима Матвиенко
1 1 1 серебряный знак 5 5 бронзовых знаков

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Ваш лист в скоупе метода, вне метода лист = null , вынесите лист в объект как приватный и пользуйтесь

private List list = new List() < , , , , , >; 

Отслеживать
2,673 3 3 золотых знака 10 10 серебряных знаков 21 21 бронзовый знак
ответ дан 6 июн 2020 в 18:57
Aziz Umarov Aziz Umarov
22.6k 2 2 золотых знака 10 10 серебряных знаков 33 33 бронзовых знака
Объявить свойство как приватное? То несовсем понял
6 июн 2020 в 19:17
Создайте список чтобы был виден свойствам и методам класса.
6 июн 2020 в 19:23
Ваш ответ не полный, приведите пример реализации того, что имеете в виду.
6 июн 2020 в 19:31

А это не важно, что вне метода список не видно, возвращается же не список, а строка. Строку будет видно везде, дело не в этом совсем.

8 июн 2020 в 19:27

Это ведь зависит от того, как вы вызываете методы этого класса. Если вы будете вызывать их каждый раз создавая новый экземпляр класса, то ничего не запомнится, конечно. Ну, если не сделать переменную save статической — одной на все экземпляры класса. Тогда можно и не использовать тот же объект класса — у любого экземпляра будет одно и то же состояние. В этом случае можно и вообще не создавать экземпляры, сделав статичный класс со статичными методами и статичной переменной. Такой подход можно применить, если у вас в программе нужно хранить только одно такое состояние. Но правильнее всё же создать экземпляр класса и обращаться к его методам. Тогда этот класс запомнит в себе состояние переменной save . Таких классов в программе вы можете иметь сколько хотите и каждый экземпляр будет хранить своё собственное случайное состояние.

var worldClass1 = new WorldClass(); var worldClass2 = new WorldClass(); Console.WriteLine(worldClass1.ReturnWord()); Console.WriteLine(worldClass2.ReturnWord()); Console.WriteLine(worldClass1.SaveReturnWord()); Console.WriteLine(worldClass2.SaveReturnWord()); // Вывод: Правило Жизнь Правило Жизнь 

Отслеживать
ответ дан 8 июн 2020 в 19:18
71.7k 5 5 золотых знаков 20 20 серебряных знаков 52 52 бронзовых знака

Во-первых, хотелось-бы узнать чуть подробнее задачу, которая стоит.

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

В-третьих, вы планируете, чтоб слово рандомилось при создании экземпляра или после вызова метода?

Как я вижу данный код:

public class ReturnWord  < private readonly Random rnd = new Random(); public T Element < get; >public ReturnWord(List list) < var rndIndex = rnd.Next(list.Count()); Element = list.ElementAt(rnd.Index); >> 

Таким образом, вам нужно передать, при создании экземпляра класса, List с элементами. Рандомное значение будет находиться в свойстве Element.

List list = new List() < , , , , , >; var returnWord = new ReturnWord(list); COnsole.WriteLine(returnWord.Element); 

Писал без VisualStudio, поэтому могут быть опечатки в коде.

C# Unity как обратится к переменным класса из другого скрипта

У меня есть главный класс Game привязанный к Main Camera, в нем хранятся переменные, которые я должен читать/редактировать из других скриптов. Как это реализовать? В Unity и ООП новичок, в интернете не смог найти ответов. Пример: Файл 1:

public class Game : MonoBehaviour < ArrayList antibodies = new ArrayList(); // другой код >

Второй файл:

public class Skin : MonoBehaviour < void OnTriggerEnter2D(Collider2D other)< if(other.gameObject.tag == "antibody ")< (тут как-то достать antibodies).Remove(other); >> > 

Отслеживать
задан 14 мар 2020 в 19:28
solarisedigle solarisedigle
1,166 12 12 серебряных знаков 25 25 бронзовых знаков

Как один из возможных вариантов — объявить переменную с камерой в классе Skin и получить у нее компонент скрипта

15 мар 2020 в 5:01

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Во первых, у поля antibodies не задан модификатор доступа. По умолчанию он задается как private , а значит вы никак не можете получить к нему доступ извне.

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

  • Сделать поле public static antibodies . Тогда к нему можно обратится через имя класса: Game.antibodies.Remove(other) . Но, обычно, это плохая практика. Вы открываете это поле для доступа из любого места в программе, что превращает код в лапшу.
  • Сделать класс Game синглтоном и поле public antibodies . Что аналогично первому варианту, наверняка превратит Ваш код в лапшу.
  • Поле antibodies делаем public , а объект Game ищем с помощью Object.FindObjectOfType или GameObject.FindWithTag . Но это плохая практика. Создаёт не явные зависимости и ухудшает производетельность (особенно если объектов на сцене много).
  • Держать ссылку на компонент Game внутри компонента Skin , и опять же, поле antibodies делаем public . Тогда получаем доступ как _game.antibodies.Remove(other) где _game ссылка на компонент типа Game . (Как назначить эту ссылку это уже совсем другая история. Например, при создании и инициализации ваших ‘antibody’. Либо настроить префаб на сцене и прокинуть ссылку в редакторе в поле помеченное SerializelField . Вариантов много). В общем, это самый нормальный вариант работы с зависимостями.

Наверняка есть ещё варианты, но не зная задач не приходят в голову. Остановимся на самом нормальном в общем случае.

public class Game : MonoBehaviour < public Listantibodies = new List(); // другой код > public class Skin : MonoBehaviour < [SerializeField] private Game _game; public void Init(Game game) < _game = game; >private void OnTriggerEnter2D(Collider2D other) < if(other.TryGetComponent(out var antibody)) _game.antibodies.Remove(antibody); > > 

При инстанциировании объекта Skin вызываем метод Init и передаём ссылку на Game . Либо кидаем ссылку вручную в компонент объекта на сцене в редакторе.

Немного не по теме:

  • ArrayList лучше заменить на List из System.Collection.Generic. Generic типы очень полезны за счет статической типизации. Кроме того позволят избежать неявных упаковок и распаковок.
  • вместо проверки объекта Unity по тегу, лучше проверять по наличию компонента. Например на объекты antibody добавить скрипт Antibody . Даже если он будет пустой. Так как вы не можете гарантировать что объект с тегом имеет на себе нужные компоненты. К тому же, у одного объекта может быть только один тег, а компонентов может быть сколько угодно. Что если вам понадобится пометить объект двумя «тегами»? Да и от опечаток никто не застрахован. Очень легко ошибиться в написании тега в коде, а вот при ошибке в написании имени типа Вам подскажет среда разработки или компилятор. Соответствено и список у вас будет List
  • очень похоже, что Ваш класс Game собирается стать глобальным монолитным классом «менеджером» с кучей функционала, зависимостей и ответственностью. Тоже плохая практика. Ответственность следует разделять на более мелкие классы, и давать соответствующие им имена. Имена классов Game , Manager , Controller , Helper и подобные вот прям вообще не дают представления о том для чего они нужны, и обычно являются индикаторами таких вот классов-монолитов.

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

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