Связь между GameObject'ами в Prefab'ах

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

Связь между GameObject'ами в Prefab'ах

Сообщение ffinder 26 мар 2009, 17:51

Есть prefab. Называется Magnet (магнит). В нем компоненты: mesh render, collider, audio source, particle emitter/animator/renderer и скрипт MagnetScript
У Magnet есть child. Называется MagnetField. Компоненты: sphere collider/trigger и скрипт MagnetFieldScript
У главного есть два состояния: вкл/выкл. Естественно public и в редакторе видится.
Вопрос: как из дочернего скрипта прочитать значение из родительского скрипта?
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение gnoblin 26 мар 2009, 18:55

Пару способов наверное есть, например:
Код: Выделить всё
//в MagnetScript переменная, к примеру, "value"

var someValue;
var myMagnet : MagnetScript;

function Awake(){
   myMagnet = FindObjectOfType(MagnetScript);

  if(!myMagnet)
      Debug.Log("No link to info about magnet");
}

function Update(){
   someValue = myMagnet.value;
}
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Neodrop 26 мар 2009, 19:50

Не, немного не так.
Код: Выделить всё
var magnet : MagnetScript;
function Start() // или Awake
{
     magnet = gameObject.GetComponent("MagnetScript");
}

function GetMagnetValue()
{
     var value = magnet.value;
}


Где MagnetScript == имя скрипта.

Если используется FindObjectOfType то ты ишещь по всей сцене. А на кой это нужно? Достаточно опросить просто gameObject. Или можно еще gameObject.root (кажется такой синтаксис. Не помню точно.)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение ffinder 26 мар 2009, 20:45

вобщем сделал вот так:
Код: Выделить всё
import UnityEngine
class MagnetField(MonoBehaviour):
   p as MagnetScript
   
   def Start ():
      p = self.transform.parent.GetComponent("MagnetScript")
   def OnTriggerStay(other as Collider):
      if (p.force > 0.0):
         print p.force.ToString()
         f as Vector3 = (self.transform.position - other.transform.position) * p.force
         other.rigidbody.AddForce(f)

спасибо за помощь :)
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Neodrop 26 мар 2009, 21:01

Это Boo ? Я в нём никогда не писал... 8-}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение ffinder 26 мар 2009, 21:21

он самый. очень приятный язык. на вкус как Питон, а внутри .NET ;)
радует отсутствие открывающих/закрывающих скобочек, всё рулится отступами.
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Const_47 14 апр 2009, 19:27

& Neodrop

Покажите пожалуйста, как примерно то же, что и в третьем посте сверху сделать на шарпе, вроде делаю "все правильно", а оно мне :(
Assets/Standard Assets/Scripts/CameraPlayer.cs(17,31): error CS0117: `UnityEngine.Component' does not contain a definition for `valueTest'

valueTest - это именно та переменная, которую я пытаюсь прочитать из скрипта. Правда в моем случае есть два никак иерархически не связанных GameObject. К двум "приклеен" компонент С Sharp скрипт, вот я и пытаюсь передать из одного в другой valueTest .
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Neodrop 14 апр 2009, 20:09

Код: Выделить всё
private CameraPlayer camScr;
.....

camScr = (CameraPlayer) gameObject.getComponent("CameraPlayer");

//или

camScr = (CameraPlayer) gameObject.getComponent(typeof(CameraPlayer));

Это если ищем компонент в том же ГО. Если в другом, то просто заменяем gameObject на этот ГО.
Не стоит говорить, что скрипт CameraPlayer.cs должен быть подключен к проекту (Studio Express) ? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Const_47 15 апр 2009, 14:08

Cтавлю задачу более конкректно
Есть два ГО в сцене
1 GOout к которому прикручен скрипт OUT (для начала тестю на жаба)
Код: Выделить всё
var test : int ;

2 GOin к которому прикручен скрипт IN
Код: Выделить всё
  function Start()
  {
    var test = GameObject.Find("GOout").GetComponent("OUT").test;
    print(test);
  }


Ура!!! Все отлично.

Теперь пытаюсь сделать то же на шарпе(подозреваю что делаю что то очень сильно глупое)

1GOout к которму прикручен скрипт SharpOUT
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class SharpOUT: MonoBehaviour {
   public int test;
}


2GOin к которому прикручен скрипт SharpIN
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class SharpIN : MonoBehaviour {
   void Start() {   
   int test = GameObject.Find("GOout").GetComponent("SharpOUT").test;
   }
}


Ну и получаю Assets/Standard Assets/Scripts/SharpIN.cs(10,70): error CS0117: `UnityEngine.Component' does not contain a definition for `test'

Не стоит говорить, что скрипт CameraPlayer.cs должен быть подключен к проекту (Studio Express) ?


Если я об этом ничего не знаю, значит стоит. А также стоит снабдить меня ссылками по теме, показать примеры.

Большое спасибо.
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Neodrop 15 апр 2009, 16:24

Ну Ё моё! Ну а головой подумать? ты пытаешься получить компонент, не указав его типа. Как тебе Шарп его сыщет то? Это не джава, тут самоопределение переменных не прокатит ни разу.

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class SharpIN : MonoBehaviour {
   void Start() {   
   GameObject testObj = GameObject.Find("GOout") as gameObject;
   SharpOut testScr = (SharpOut)testObj.GetComponent("SharpOUT");
   int test = testScr.test;
   }
}


Или я ещё пять раз одно и то же напишу? X(
Хотя доступ из C# к JavaScript скрипту не всегда проходит гладко и проще передать переменную из ЖабаСкрипта в Шарп, а не наоборот.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Const_47 15 апр 2009, 17:59

Благодарю. То что нужно. Был бы у меня опыт на С#, точно такого бы не делал. А так пока поглядываю одним глазом в справочник. Но это временно.
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Const_47 22 апр 2009, 17:49

Есть рутовый ГО House. На нем висит несколько ГО парентов.
К ГО House "прикручен" cкрипт HouseScript, из которого я пытаюсь достучатся к компоненту MeshRenderer первому по "глубине" парентному ГО. Делаю я это так
Код: Выделить всё
public class HouseScript : MonoBehaviour {
    public MeshRenderer test;
   void Start()
   {      
      test = GetComponentInChildren(MeshRenderer) as MeshRenderer ;         
   }
}

получаю это
Assets/Standard Assets/Scripts/HouseScript.cs(14,47): error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected


На жабе все пучком, но вот как это сделать на шарпе не понимаю. Достало тупить.Пожалуйста покажите как сделать это правильно.
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Neodrop 22 апр 2009, 18:12

Вообще эта функция возвращает Component и дебаггер ругается на вашу попытку приведения к MeshRenderer.
Может так прокатит? Я правда не оч понимаю в чём различие...

Код: Выделить всё
test = (MeshRenderer)GetComponentInChildren("MeshRenderer");
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь между GameObject'ами в Prefab'ах

Сообщение Const_47 22 апр 2009, 21:50

Точно не прокатит. Дело в том что метод GetComponentInChildren(arg); принимает как аргумент только вот такой
тип - Type type или такой Type t на строковой тип оно мне
Assets/Standard Assets/Scripts/HouseScript.cs(15,33): error CS1503: Argument 1: Cannot convert type `string' to `System.Type'

Заметил что метод GetComponent(arg) тоже может принимать Type type, и вот если я делаю вот так
Код: Выделить всё
public class HouseScript : MonoBehaviour {
    public MeshRenderer test;   
   void Start()
   {         
      test = GetComponent("MeshRenderer") as MeshRenderer;
   }
}

то все ок, поскольку как аргумент такой метод может принимать и строковой тип, а если вот так
Код: Выделить всё
public class HouseScript : MonoBehaviour {   
    public MeshRenderer test;
   void Start()
   {      
      test = GetComponent(MeshRenderer) as MeshRenderer;
   }
}

тогда вылазит аналогичная ошибка
Assets/Standard Assets/Scripts/HouseScript.cs(15,32): error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected

В хелпе о этих методах пишет что они возвращают тип компонента.
Returns the component of Type type if the game object...

Но ведь MeshRenderer это ведь тип компонента Сomponenet->Renderer->MeshRenderer или не тип?
И что самое интересное, на жаба на Ура прокатит как строковой тип, так и Тype type. Значит на С# я в корне делаю что то очень глупое. Как мне на С# заюзать этот Тype type?
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Связь между GameObject'ами в Prefab'ах

Сообщение gnoblin 22 апр 2009, 22:06

.GetComponent(typeof(MeshRenderer))?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

След.

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

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

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