Unity. Вызов функции из другого скрипта
Помогите дописать код
Нужно чтобы при таче по кнопке выполнялась функция (func1) из другого скрипта (anotherScript).
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Button: MonoBehaviour < private void OnMouseDown() < >>
Отслеживать
1,551 1 1 золотой знак 9 9 серебряных знаков 17 17 бронзовых знаков
задан 1 ноя 2019 в 17:00
1,308 2 2 золотых знака 9 9 серебряных знаков 22 22 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Button: MonoBehaviour < GameObject TargetObj; //не забудь перетащить в инспекторе сюда нужный обьект private SomeMonoBehavior _actionTarget; //замени SomeMonoBehavior на название скрипта public void Start() < _actionTarget = TargetObj.GetComponent(); > private void OnMouseDown() < _actionTarget.Method(); >>
Отслеживать
ответ дан 1 ноя 2019 в 17:32
Andrew Stop_RU_war_in_UA Andrew Stop_RU_war_in_UA
19.1k 7 7 золотых знаков 37 37 серебряных знаков 99 99 бронзовых знаков
using System.Collections; using System.Collections.Generic; using UnityEngine; public anotherScript anotherS; public class Button: MonoBehaviour < private void OnMouseDown() < anotherS = GetComponent(); anotherS.func1(); //Обязательно в другом скрипте у func1() должен быть модификатор доступа //public //Перетаскиваешь другой скрипт на объект и добавляешь его в появившееся //поле anotherS у основного > >
Отслеживать
ответ дан 7 авг 2021 в 10:20
Tripple_six Tripple_six
11 1 1 бронзовый знак
- c#
- unity3d
- touch
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.29.8372
Запуск локальной функции в случайном скрипте
Пытаюсь не громоздко (не создавая баз) решить проблему, у меня есть string содержащий имя скрипта в ассетах, и мне нужно зная имя скрипта как-то в него пролезть, и запустить в нём статическую локальную функцию . Вопрос такой, как мне имея на руках string с текстовым названием скрипта сформировать ссылку на запуск этой функции?
string W = «Superscript»;
Локальная функция Function()<>
И мне нужно получить подобную конструкцию: Superscript.Function();
#1
15:17, 28 июля 2022
Короче я пока только вижу дополнительный скрипт содержащий подобные ссылки на запуск функции в в других скриптах, и отправляя в этот скрипт нужное название другого скрипта, он смотря в базе своих ссылок будет запускать нужную. Это не совсем то, чего бы мне хотелось, вернее совсем не то. Мне бы обойтись без этой базы.
Даниил Петров
Вопрос немножко не в тему, но не задать не могу 🙂 какие сейчас требования для комфортной работы редактора UE? Сам когда-то хотел осваивать сие изделие для разработки своих игр, но гораздо комфортней оказалось разрабатывать свой инструментарий.
Ту раздел про Unity.
#2
15:39, 28 июля 2022
Reflection не решает вашей проблемы? Если у вас есть название класса, то можно же его отрефлексить и запустить статический метод ваш.
#3
16:02, 28 июля 2022
Я с этим не знаком, сейчас по гуглил, выглядит как возможное решение, но не могу найти подходящего примера, самому ничего работающего пока собрать не удалось.
#4
16:14, 28 июля 2022
using System; using System.Reflection; public class MagicClass < private int magicBaseValue; public MagicClass( ) < magicBaseValue = 9; > public int ItsMagic( int preMagic) < return preMagic * magicBaseValue; > > public class TestMethodInfo < public static void Main( ) < // Get the constructor and create an instance of MagicClass Type magicType = Type.GetType( "MagicClass"); ConstructorInfo magicConstructor = magicType.GetConstructor( Type.EmptyTypes); object magicClassObject = magicConstructor.Invoke( new object[]<>); // Get the ItsMagic method and invoke with a parameter value of 100 MethodInfo magicMethod = magicType.GetMethod( "ItsMagic"); object magicValue = magicMethod.Invoke( magicClassObject, new object[]100>); Console.WriteLine( "MethodInfo.Invoke() Example\n"); Console.WriteLine( "MagicClass.ItsMagic() returned: ", magicValue); > >
Пример с MSDN. Вам вроде он подходит, для статической функции пишут null передавать надо в качестве аругмента, если я правильно понял.
#5
16:53, 28 июля 2022
Ну мне не нужно искать\создавать объекты, я просто пытаюсь сформировать ссылку для запуска void.
Эти примеры с сайта майкрософта вообще каловые, там как всегда много мусора, и ничего сжатого и по делу.
И тут вообще треш начался, для «Type» нужна «using System;», но ведь мы же в юнити, и используется «using UnityEngine;». Так вот, в скрипте есть много где «Random», и этот рандом собака и там и там присутствует, и создаётся конфликт в скрипте, так-как он обращается к рандомам в обеих библиотеках.
Мою задачу можно решить поиском компонента на геймобджекте имея название компонента в string, опять же как, хз.
#6
19:27, 28 июля 2022
То ли я не понимаю, что вам надо, то ли непонятно, что у вас не получается.
Вам нужно вызвать статический метод другого класса, имея только названия в виде строк, так?
Вот статический метод в типе:
using UnityEngine; public sealed class TargetType < public static void LogStatic( ) < Debug.Log( "Calling static method"); > >
using System; using UnityEngine; public sealed class StaticLauncher : MonoBehaviour < public void CallStaticMethod( ) < var type = Type.GetType( "TargetType"); var methodInfo = type.GetMethod( "LogStatic"); methodInfo.Invoke( null, null); > >
Все вроде работает, только что проверил в редакторе.
TERMOGAD
> Так вот, в скрипте есть много где «Random», и этот рандом собака и там и там
> присутствует, и создаётся конфликт в скрипте, так-как он обращается к рандомам
> в обеих библиотеках.
Это решается alias’ами.
#7
21:17, 28 июля 2022
Это работает, если я делаю это в скрипте, в котором нет конфликта с библиотеками.
Однако мне это неудобно, лишний скрипт создавать, ещё из него данные отправлять.
Алиасы были бы решением, но для меня это очередная штука, с которой я не сталкивался.
У меня появилось ещё больше вопросов, я нашёл такую информацию:
Но я нигде не нашёл ответов на эти вопросы:
1. Конкретно где находится System.DLL
2. Почему MVS помечает «extern» как ошибку в коде.
3. Как этот самый rsp файл присобачить к проекту, чтобы он работал.
4. Нигде не написано как потом использовать в скрипте псевдоним DLL.
#8
21:58, 28 июля 2022
Короче, нафиг эти алиасы.
У меня был конфликт только с рандомом, решил его так:
using Random = UnityEngine.Random;
Теперь я спокойно использую «type» пользуясь «System».
public void CallStaticMethod()
Благодарю за урок по Reflection.
#9
23:12, 28 июля 2022
TERMOGAD
> using Random = UnityEngine.Random;
Я это и имел ввиду под Alias’ом. Видимо, спутал терминологию, сорян.
TERMOGAD
> Благодарю за урок по Reflection.
Имейте ввиду, что рефлексия не самая быстрая операция и если ее интенсивно использовать в критичном по производительности участке, то лучше кэшировать результаты.
#10
0:51, 29 июля 2022
Имейте ввиду, что рефлексия не самая быстрая операция и если ее интенсивно использовать в критичном по производительности участке, то лучше кэшировать результаты.
Я разрабатываю карточную игру. Эффекты карт осуществляются через самостоятельные скрипты привязанные к геймобджектам. Мне была необходима проверка условия того, что ИИ сможет использовать эту карту в момент своего хода. Так-как все карты уникальные, для каждой нужно писать уникальную проверку. Чтобы лишний раз не спавнить геймобджекты, я запихал в эти скрипты статические функции с проверкой условия. У ИИ как правило на руке не больше 7 карт, он проверят их на наличие эффектов, а после если эффекты имеются запускает на них проверку пригодности к использованию в ходу. Зная имя карты в string я теперь могу залезть в соответствующий практически одноимённый скрипт и провести проверку. Кешировать результаты смысла не имеет, так-как после использования эффекта на игровом поле может измениться всё. В данный момент в коде всё работает, и это прекрасно, скорость работы меня устраивает.
Как использовать функцию из другого скрипта unity
Olmer 25 окт 2017, 23:40
Есть два скрипта, надо что бы второй использовал первый. Вроде бы все сделал верно, но не работает.
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
private GameObject gm ;
private GameObject sc ;
void Start ( ) {
gm = GameObject . Find ( «Main Camera» ) ;
sc = gm. GetComponent ( CreatP ) ;
sc. CreateP ( ) ;
}
Assets/Scripts/ClickPinata.cs(13,25): error CS0103: The name `CreatP’ does not exist in the current context
Помогите решить проблему
Последний раз редактировалось Olmer 29 окт 2017, 02:13, всего редактировалось 1 раз.
Olmer UNец Сообщения: 46 Зарегистрирован: 25 окт 2017, 21:54
Re: Вызов функции из другого скрипта
Pollux 25 окт 2017, 23:52
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
sc = gm. GetComponent < CreatP >( ) ;
Pollux UNITрон Сообщения: 276 Зарегистрирован: 01 сен 2016, 22:31
Re: Вызов функции из другого скрипта
ValsiNoen 25 окт 2017, 23:57
Здравствуйте.
Условие бы поточнее. Если нужно обратиться к объекту из первого скрипта, во втором, но чтобы объект был найден (в этом случае) в первом, то так:
2 скрипта First.cs and Second.cs.
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
public GameObject cube ;
public Second thisisSecond ;
// Use this for initialization
void Start ( ) {
cube = thisisSecond. cb ;
}
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
public GameObject cb ;
// Use this for initialization
void Start ( ) {
cb = GameObject . Find ( «Cube» ) ;
}
Указываете ссылку первому (thisisSecond) на второй объект. Всё. Теперь объект (куб в данном случае) находится в одном скрипте, а второй скрипт ссылается на него.
ValsiNoen UNец Сообщения: 4 Зарегистрирован: 25 окт 2017, 19:31
Re: Вызов функции из другого скрипта
Olmer 26 окт 2017, 00:10
ValsiNoen писал(а): Здравствуйте.
Условие бы поточнее. Если нужно обратиться к объекту из первого скрипта, во втором, но чтобы объект был найден (в этом случае) в первом, то так:
2 скрипта First.cs and Second.cs.
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
public GameObject cube ;
public Second thisisSecond ;
// Use this for initialization
void Start ( ) {
cube = thisisSecond. cb ;
}
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
public GameObject cb ;
// Use this for initialization
void Start ( ) {
cb = GameObject . Find ( «Cube» ) ;
}
Указываете ссылку первому (thisisSecond) на второй объект. Всё. Теперь объект (куб в данном случае) находится в одном скрипте, а второй скрипт ссылается на него.
Здравствуйте! Если поточнее, то надо из первого скрипта вызвать функцию CreatP() во втором.
Вот первый скрипт
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
public class CreatePinata : MonoBehaviour {
public GameObject pin ;
public GameObject inst_pin ;
void CreateP ( ) {
inst_pin = Instantiate ( pin, pin. transform . position , Quaternion. identity ) ;
}
Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
public class ClickPinata : MonoBehaviour {
private int kol = 10 ;
private GameObject gm ;
private GameObject sc ;
void Start ( ) {
gm = GameObject . Find ( «Main Camera» ) ;
sc = gm. GetComponent < CreatePinata >( ) ;
sc. CreateP ( ) ;
}
Olmer UNец Сообщения: 46 Зарегистрирован: 25 окт 2017, 21:54
Re: Вызов функции из другого скрипта
Pollux 26 окт 2017, 00:23
Методу void CreateP() измените модификатор доступа на public .
Pollux UNITрон Сообщения: 276 Зарегистрирован: 01 сен 2016, 22:31
Re: Вызов функции из другого скрипта
Olmer 26 окт 2017, 00:36
Pollux писал(а): Методу void CreateP() измените модификатор доступа на public .
Спасибо! Помогло!
Olmer UNец Сообщения: 46 Зарегистрирован: 25 окт 2017, 21:54
Сообщений: 6 • Страница 1 из 1
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
- Список форумов
- Техподдержка • Наша команда • Удалить cookies конференции • Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Вызов функции из другого скрипта?
При создании кнопок Старт и Рестарт, которые будут появляться либо в начале игры, и при проигрыше соответственно. Суть вопроса — При создании скрипта, и обращение в скрипте к функции из другого скрипта, и при вызове OnClick на кнопку, возникает ошибка:
NullReferenceException: Object reference not set to an instance of an object
PokeyBallTest.Controller.ButtonController.RestartCanvas () (at Assets/Scripts/Controller/ButtonController.cs:20)
UnityEngine.Events.InvokableCall.Invoke () (at :0)
UnityEngine.Events.UnityEvent.Invoke () (at :0) ну и там дальше еще много текста.
Приложу скрипт, подскажите как реализовать задуманное. Спасибо!
public class ButtonController : MonoBehaviour < public GameObject ButtonLose; private PlayerController btnLose; private void Start() < btnLose = ButtonLose.GetComponent(); > public void RestartCanvas() < btnLose.RestartPlayer(); >>
- Вопрос задан более трёх лет назад
- 448 просмотров