Изменение значения переменной в соседнем скрипте [РЕШЕНО]

Программирование на Юнити.

Изменение значения переменной в соседнем скрипте [РЕШЕНО]

Сообщение Summerscream 12 мар 2011, 22:32

Есть ситуация, когда игрок не может юзать управление, то есть весь инпут блочится. Блочу инпут по результатам проверки созданной для этого булвой переменной ControllsBlocked. Все бы хорошо, но ситуация, при которой нужно выставить эту переменную в False генерится совсем другим скриптом на другом объекте.
Как получить значение переменной живущей в другом скрипте я разобрался:
Синтаксис:
Используется csharp
               
GameObject player = GameObject.Find("skylancer");
Component PlayerScript = player.GetComponent("Player");
float exampleVar = PlayerScript.var;
 


Как не крутил это дело, а присвоить переменную нужному скрипту не получается.
Есть иные варианты решения проблемы. К примеру хранить в скрипте, генерящим ситуацию, переменную с таким же именем, что и в скрипте управления. При генерации ситуации выставлять ее в true, скрипт управления по апдейту будет все время чекать из скрипта ситуации как там дела с этой переменной, и когда она станет true, то он заблочит управление. Выглядит очень анально, но работать будет. (полная Ж)
Второй вариант это сохранять данные о ситуации наружу в .xml, скрипт управления будет чекать этот .xml по апдейту и блочить инпут, когда появятся нужные данные.
Как по мне, это все лишнее и должен быть способ тупо присвоить переменной на другом скрипте значение, но нарыть функцию позволяющую это пока не удается.
Помогите, друзья, советом.
Последний раз редактировалось Summerscream 13 мар 2011, 01:06, всего редактировалось 1 раз.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: Изменения значения переменной в одном скрипте из другого

Сообщение Paul Siberdt 12 мар 2011, 22:36

Вы используете имя переменной var? Это зарезервированное системное имя. Попробуйте заменить его, например, на zhopa.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Summerscream 12 мар 2011, 22:58

Вы используете имя переменной var? Это зарезервированное системное имя. Попробуйте заменить его, например, на zhopa.

Нет, я не использую имя var, сейчас я написал var для примера, на месте var может быть любое слово, хоть эта же преславутая zhopa. =)
Но ваш ответ звучит как намек в духе "Таким способом можно присвоить переменной значение в другом скрипте, а не только получить ее оттуда, не ясно, что у этого мужика не получается...", неужели это действительно так?
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: Изменение значения переменной в одном скрипте из другого

Сообщение HacKeR 12 мар 2011, 23:03

тоже интересует этот вопрос. НАрод, дайте ответ пожалуйста:)
HacKeR
UNIверсал
 
Сообщения: 360
Зарегистрирован: 12 ноя 2010, 21:14

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Paul Siberdt 12 мар 2011, 23:06

Да, ответ означает именно это. :)
С помоью геткомпоненьченья можно жонглировать переменными, функциями и прочей всячиной из другого скрипта-класса.

И в приведенном вами примере все корректно, окромя отсутствия имени zhopa. :D Подозреваю, собака зарыта в какой-нить незаметной и глупой ашыпке в другом месте кода... или в каких особенностях C# ( это правильно задавать тип Component вместо Player?)

На жабе у меня всегда работает:
Код: Выделить всё
var zhopa : GameObject = GameObject.Find("zhopa");
var zhopaScript : Zhopa = zhopa.GetComponent(Zhopa);
var outerPoo : int = zhopaScript.poo;
zhopaScript.poo = 100500;
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Syberex 12 мар 2011, 23:06

Может попробовать обвернуть эту переменную методами? Типа:
setControlOn(), setControlOff(), isControlOn() ...
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Summerscream 12 мар 2011, 23:44

И в приведенном вами примере все корректно, окромя отсутствия имени zhopa. Подозреваю, собака зарыта в какой-нить незаметной и глупой ашыпке в другом месте кода... или в каких особенностях C# ( это правильно задавать тип Component вместо Player?)

Еще несколько раз ударился о проблему головой.

Синтаксис:
Используется csharp
GameObject player = GameObject.Find("skylancer");
Component PlayerScript = player.GetComponent("Player");
bool PlayerBoolVar = PlayerScript.ControllsBlocked;
PlayerScript.ControllsBlocked = true;
 

Компилятор ругается на третью строку:
Assets/Scripts/Training_realityScenario.cs(52,51): error CS1061: Type `UnityEngine.Component' does not contain a definition for `ControllsBlocked' and no extension method `ControllsBlocked' of type `UnityEngine.Component' could be found (are you missing a using directive or an assembly reference?)

Он попросту не узнает ControllsBlocked, но такая переменная есть в скрипте Player на объекте skylancer. Там она объявлена вне функций следующим образом:

Синтаксис:
Используется csharp
public bool ControllsBlocked = false;
 

Такие дела =(

Попробовал повторить предоставленный на JS пример. Результат - fail. Во первых типа "Zhopa" не существует, это я думаю очевидно, видимо ошибка просто вышла. Но даже если заменить тип на Component, то результат тот же, что и на C# - переменная ControllsBlocked не распознается компилятором.

Может попробовать обвернуть эту переменную методами? Типа:
setControlOn(), setControlOff(), isControlOn() ...

Может и так, но это уже вопрос принципа, я должен понять как осуществить задуманное именно методом правки значения переменной одного скрипта из другого скрипта, ибо это в принципе очень нужная штука, без нее далее никак.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Paul Siberdt 13 мар 2011, 00:06

Почему вы настоятельно пишете:
Код: Выделить всё
Component PlayerScript = player.GetComponent("Player");

тогда как в документакии примеры выглядят, как:
Код: Выделить всё
ScriptName other = gameObject.GetComponent<ScriptName>();

Код: Выделить всё
script = GetComponent("ScriptName") as ScriptName;

???
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Kann 13 мар 2011, 00:47

Синтаксис:
Используется csharp
gameObject.GetComponent<ScriptName>().zhopa = false;
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Summerscream 13 мар 2011, 00:54

Почему вы настоятельно пишете:
Код: Выделить всё
Component PlayerScript = player.GetComponent("Player");

тогда как в документакии примеры выглядят, как:
Код: Выделить всё
ScriptName other = gameObject.GetComponent<ScriptName>();

Код: Выделить всё
script = GetComponent("ScriptName") as ScriptName;


Вероятно мы с документацией друг друга не поняли, но типа ScriptName не существует, так мне говорит компилятор. Посмотрев пример на JS там же (там были комментарии в отличии от C# примера) предположил, что имеется ввиду стринг имени скрипта, который надо объявить перед всем этим добром и потом юзать, но тогда получается некая вариация духовной ереси. Вероятно тут где-то тут у меня пробел по части программирования.
К слову, прежде чем писать на форум я изрядно потыркался с этой главой справки, но, как я уже сказал, мы друг друга не поняли.
Я попытался осуществить описанное в справке и присвоить результат gameObject.GetComponent<ScriptName>(); заранее созданному стрингу, но тут меня опять выслал в пешый эротический поход компилятор, заявив, что я неправомерно пытаюсь превратить Component в String (с типом Component в отличии от ScriptName он знаком прекрасно), и вобщем-то я с ним согласен.
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: Изменение значения переменной в одном скрипте из другого

Сообщение Summerscream 13 мар 2011, 01:01

Я балда, дорогие товарищи. Я усердно игнорировал <ScriptName>(); именно в таком виде, просто потому-что раньше такого вида записи еще не видел. Спасибо больше всем причастным, вы спасли мою тягу к творчеству.
В таком виде все прекрасно работает:
Синтаксис:
Используется csharp
player.GetComponent<Player>().ControllsBlocked = true;
 

[curved_hands]
Summerscream
UNIт
 
Сообщения: 62
Зарегистрирован: 01 фев 2011, 00:34
Откуда: msc

Re: Изменение значения переменной в соседнем скрипте [РЕШЕНО]

Сообщение kerber 19 мар 2012, 22:34

Тудей бился головой в ту - же стену. Каменный цветок упорно не выходил.
Только после осмысления данного топика дело пошло на лад.

Мои пять копеек таковы: таки ВСЕ скрипты должны лежать в папке Scripts
(3A4OT)
kerber
UNец
 
Сообщения: 5
Зарегистрирован: 19 мар 2012, 22:25

Re: Изменение значения переменной в соседнем скрипте [РЕШЕНО]

Сообщение Левш@ 19 мар 2012, 23:34

таки ВСЕ скрипты должны лежать в папке Scripts

Бред... :) у меня все скрипты разбросаны по сложным иерархиям папок, и никаких проблем.
Пишу на Js.
И так работает: GetComponent (ИмяСкрипта);
И так тоже работает: GetComponent ("ИмяСкрипта");
Если обращаться из Js к C# переменным то обязательно "ИмяСкрипта" в кавычках. ;)
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Изменение значения переменной в соседнем скрипте [РЕШЕНО]

Сообщение gate1 22 мар 2012, 10:23

А почему нельзя через свойства доступ замутить...
GetComponent получется видит только public переменные из другого скрипта
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9