Доступ к другому объекту через скрипт

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Доступ к другому объекту через скрипт

Сообщение bifidokk 15 апр 2013, 10:53

Привет, изучаю азы с помощью digital-tutors и наткнулся на проблему. Объясню суть.
На сцене есть 2 обжекта CharacterAssetManager и SpawnPoint. К CharacterAssetManager прикрепляется скрипт CharacterAssets, в котором объявляется массив обжектов:

Синтаксис:
Используется csharp
public GameObject[] gamePrefabs;
 


далее в редакторе в данный обжект переносятся 3 префаба.

скрипт, прикрепленный к SpawnPoint должен обратиться к скрипту CharacterAssets, взять нужный префаб и инстанцировать его на сцену
обращение я сделал вот так:

Синтаксис:
Используется csharp
public CharacterAssets ca;
void Start ()
{
        ca = gameObject.AddComponent<CharacterAssets>();
        Debug.Log(ca.gamePrefabs);
}
 


в итоге в дебаге null. если я правильно понимаю, то при соазднии нового экземпляра, скрипт нифига не знает о добавленных к обжекту префабах, поэтому и выдается null.
Для чего все это нужно: префабы хранятся в CharacterAssetManager и добавляются в SpawnPoint по определенному условию.
Вопрос: как сделать правильно, чтобы все работало. есть мысли превратить CharacterAssets в статичный класс (кстати это тоже не получилось).
При этом если скрипты переписать на JS, то все прекрасно работает:

в CharacterAssets:
Синтаксис:
Используется javascript
var characterMesh : GameObject[];
 


в срипте, прикрепленном к SpawnPoint:
Синтаксис:
Используется javascript
ca = GameObject.Find("CharacterAssetManager").GetComponent(CharacterAssets);
 
bifidokk
UNец
 
Сообщения: 6
Зарегистрирован: 14 авг 2012, 08:45

Re: Доступ к другому объекту через скрипт

Сообщение bifidokk 15 апр 2013, 14:06

Доковырялся сам в лоаде префабов в Awake

Синтаксис:
Используется csharp
gamePrefabs[0] = Resources.Load("PFB_Warrior");
gamePrefabs[1] = Resources.Load("PFB_Rogue");
gamePrefabs[2] = Resources.Load("PFB_Hunter");
 


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

Синтаксис:
Используется csharp
ca = gameObject.AddComponent<CharacterAssetsCSH>();            
Debug.Log(ca.gamePrefabs[0]);
 


может все же кто-то объяснит, почему в C# код ведет себя так, и недостаточно (точнее бесполезно) присвоить значения в редакторе обычным перетаскиванием? именно из-за создания нового экземпляра?
bifidokk
UNец
 
Сообщения: 6
Зарегистрирован: 14 авг 2012, 08:45

Re: Доступ к другому объекту через скрипт

Сообщение jetyb 17 апр 2013, 08:21

Это из-за особенности языка. В javascript все то, что написано вне функций собирается в одну функцию , которая наподобие Awake вызывается раз при старте.
В C# же такое объявление означает создание элемента в конструкторе.

Но ряд функций юнитивского API имеют запрет на вызов в конструкторе.
Впрочем, на загрузку ресурсов это ограничение не распространяется , то есть можно сделать так:
Синтаксис:
Используется csharp
Object prefab;
public CharacterAssetsCSH()
{
    prefab = Resources.Load("MyPrefab");
}
 

или, что еще лучше, так :
Синтаксис:
Используется csharp
public static Object prefab = Resources.Load("MyPrefab");
 
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Доступ к другому объекту через скрипт

Сообщение bifidokk 18 апр 2013, 14:50

да, именно так я и сделал)
bifidokk
UNец
 
Сообщения: 6
Зарегистрирован: 14 авг 2012, 08:45


Вернуться в Почемучка

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

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