Как использовать функцию из другого скрипта unity
Перейти к содержимому

Как использовать функцию из другого скрипта unity

  • автор:

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 просмотров

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

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