Разные вопросы от нуба AngryGrey :)

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

Разные вопросы от нуба AngryGrey :)

Сообщение AngryGrey 04 фев 2013, 03:30

Всех приветствую. Я новенький на форуме и Unity тоже. Помогите решить проблемку. Необходимо создать плоскость из кубиков (префаб), но при этом чтоб у каждого кубика (префаба) были бы заданы уникальные данные в прикрепленном к нему скрипте.
НАПРИМЕР:
1. Префаб КУБ, к нему прикреплен скрипт содержащий "public int x" и "public int y".
2. Есть SpawnPoint к которой прикреплен скрипт генерации плоскости. Скрипт устроен очень просто: берется необходимое количество кубов по x и y, а потом двумя циклами for и команды Instantiate генерируется плоскость из префабов (п1), но так чтобы у каждого созданного префаба x и y скрипта (п1) были бы уникальными.

Это необходимо чтобы каждый куб знал свое место в генерируемой плоскости (двумерный массив), а размер плоскости был бы динамически изменяем. В дальнейшем планируется привязать различные действия, в зависимости от того на какой клетке находится игрок.

Как Вы уже наверное догадались вопрос в следующем: как при создании префаба в сцене туже изменить параметры прикрепленного к нему скрипта?

Код генерации плоскости без изменения скрипта префаба:
using UnityEngine;
using System.Collections;

public class SpawnBase : MonoBehaviour {
public int heightBase = 2;
public int widthBase = 2;
public Transform blockPlane;
private Transform myTransform;

// Use this for initialization
void Start () {
myTransform = transform;
gameObject.renderer.enabled = false;
for (int i = 0; i<widthBase; i++)
{
for (int a = 0; a<heightBase; a++)
{
GameObject clone = Instantiate (blockPlane, new Vector3 (myTransform.position.x+blockPlane.transform.localScale.x*a,myTransform.position.y,myTransform.position.z+blockPlane.transform.localScale.z*i),Quaternion.identity) as GameObject;
}}}}
Последний раз редактировалось AngryGrey 13 фев 2013, 08:19, всего редактировалось 2 раз(а).
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение waruiyume 04 фев 2013, 04:04

Синтаксис:
Используется csharp
Кубик кубик = clone.GetComponent<Кубик>();
кубик.x = a;
кубик.y = i;
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Создание плоскости из кубиков

Сообщение AngryGrey 04 фев 2013, 04:29

При добавление в цикл после "GameObject clone = Instantiate...." следующего кода:
Синтаксис:
Используется csharp
baseBlockProp kub = clone.GetComponent<baseBlockProp>();
kub.i = a;
 

, где "baseBlockProp" название скрипта весящего на префабе.
Плоскость перестает генерироваться. Добавляется только один кубик, и в параметре его скрипта изменений нет.
Может я не правильно понял:
Синтаксис:
Используется csharp
Кубик кубик = clone.GetComponet<Кубик>();
 

Под "Кубик", что подразумевается?
PS. Читал офф справку ответа не нашел. Может не там читал?! :-?
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение Kayler 04 фев 2013, 04:55

baseBlockProp kub = clone.transform.GetComponent<baseBlockProp>();
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Создание плоскости из кубиков

Сообщение AngryGrey 04 фев 2013, 05:18

Снова мимо. :(
Код:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SpawnBase : MonoBehaviour {
        public int heightBase = 2;
        public int widthBase = 2;
        public Transform triggerBlock;
        public Transform planeBase;
        private Transform myTransform;

       
        // Use this for initialization
        void Start () {
                myTransform = transform;
                //gameObject.renderer.enabled = false;

                for (int i = 0; i<widthBase; i++)
                {
                        for (int a = 0; a<heightBase; a++)
                        {
                         GameObject clone = Instantiate (triggerBlock, new Vector3 (myTransform.position.x+triggerBlock.transform.localScale.x*a,
                                        myTransform.position.y+0.1f,
                                        myTransform.position.z+triggerBlock.transform.localScale.z*i),Quaternion.identity) as GameObject;

                         //Рекомендованный код
                         //---------------------------------------------------------------------------------------------
                         baseBlockProp kub = clone.transform.GetComponent<baseBlockProp>();
                         kub.i = a;
                         //---------------------------------------------------------------------------------------------
                         
                        }
                }
                //До выполнения этой части вообще не доходит
                //------------------------------------------------------------------------------------------------------------------------------------------------------------
                myTransform.localScale = new Vector3(triggerBlock.localScale.x*heightBase, 0.1f, triggerBlock.localScale.z*widthBase);
                myTransform.position = new Vector3(myTransform.position.x+(heightBase-1)*triggerBlock.transform.localScale.x/2.0f,
                        myTransform.position.y,
                        myTransform.position.z+(widthBase-1)*triggerBlock.transform.localScale.z/2.0f);
                //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        }
       
        // Update is called once per frame
        void Update () {

        }
}
 


Циклы перестают выполнятся... В итоге создается только один блок.
Последний раз редактировалось AngryGrey 13 фев 2013, 06:53, всего редактировалось 1 раз.
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение Kayler 04 фев 2013, 05:33

очень странно, у вас класс baseBlockProp точно public?
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Создание плоскости из кубиков

Сообщение waruiyume 04 фев 2013, 05:47

  1. Запускаем сцену
  2. Дожидаемся создания блока
  3. Нажимаем на паузу ||
  4. Жмакаем ctrl+shift+c
  5. Ищем, в консоле, надписи красного цвета

AngryGrey писал(а):1. Префаб КУБ, к нему прикреплен скрипт содержащий "public int x" и "public int y".


AngryGrey писал(а):kub.i = a;
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Создание плоскости из кубиков

Сообщение AngryGrey 04 фев 2013, 06:26

5. Ищем, в консоле, надписи красного цвета


Полезный совет. Вот результат: Object reference not set to an instance of an object ("Ссылка не указывает на экземпляр..." как то так, я в английском не очень силен)

Ругается на эту срочку:
baseBlockProp kub = clone.transform.GetComponent<baseBlockProp>();

Может проблема в том, что сам скрипт "baseBlockProp" пока пустой.. там тока переменная i определенна.

Вот:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class baseBlockProp : MonoBehaviour {
        public int i=0;
        // Use this for initialization
        void Start () {
        }
        // Update is called once per frame
        void Update () {
        }}
 
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение waruiyume 04 фев 2013, 07:14

Вы истансите Transform, а затем приводите его к GameObject через as, т.к. такое приведение не может быть выполнено, в итоге получается null.
Можно инстансить монобехи и не держать ненужных переменных.
Синтаксис:
Используется csharp

using UnityEngine;
using System.Collections;

public class SpawnBase : MonoBehaviour
{
    public int heightBase = 2;
    public int widthBase = 2;
    public baseBlockProp triggerBlock;//здесь/ нужно заново назначить в инспекторе, т.к. поменялся тип
    public Transform planeBase;
    private Transform myTransform;


    // Use this for initialization
    void Start()
    {
        myTransform = transform;
        //gameObject.renderer.enabled = false;

        for (int i = 0; i < widthBase; i++)
        {
            for (int a = 0; a < heightBase; a++)
            {
                baseBlockProp clone = (baseBlockProp)Instantiate(triggerBlock, new Vector3(myTransform.position.x + triggerBlock.transform.localScale.x * a,//тип
                               myTransform.position.y + 0.1f,
                               myTransform.position.z + triggerBlock.transform.localScale.z * i), Quaternion.identity);

                //Рекомендованный код
                //---------------------------------------------------------------------------------------------
                //baseBlockProp kub = clone.GetComponent<baseBlockProp>();
                clone.i = a;//здесь
                //---------------------------------------------------------------------------------------------

            }
        }
        //До выполнения этой части вообще не доходит
        //------------------------------------------------------------------------------------------------------------------------------------------------------------
        myTransform.localScale = new Vector3(triggerBlock.transform.localScale.x * heightBase, 0.1f, triggerBlock.transform.localScale.z * widthBase);//здесь transform
        myTransform.position = new Vector3(myTransform.position.x + (heightBase - 1) * triggerBlock.transform.localScale.x / 2.0f,//здесь transform
                myTransform.position.y,
                myTransform.position.z + (widthBase - 1) * triggerBlock.transform.localScale.z / 2.0f);
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    }

    // Update is called once per frame
    void Update()
    {

    }
}
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Создание плоскости из кубиков

Сообщение AngryGrey 04 фев 2013, 07:54

Все получилось! Спасибо! :)
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение AngryGrey 04 фев 2013, 10:04

Еще вопросик, можно ли изменять параметр Tiling текстуры на префабах, так чтобы на одном префабе он был скажем 2, а на другом скажем 4? А то я накладываю одну и туже текстуру на две плоскости Plane. Потом на одной меняю Tiling на 3, но он же меняется на другой плоскости где этого мне не нужно... на префабах точно также....
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение Kayler 04 фев 2013, 17:16

AngryGrey писал(а):Еще вопросик, можно ли изменять параметр Tiling текстуры на префабах, так чтобы на одном префабе он был скажем 2, а на другом скажем 4? А то я накладываю одну и туже текстуру на две плоскости Plane. Потом на одной меняю Tiling на 3, но он же меняется на другой плоскости где этого мне не нужно... на префабах точно также....


нужно создать переменную с материалом, скопировать в нее материал, потом изменить в переменной, и уже объекту назначить эту переменную как материал, иначе получается что задействуются все объекты с этим материалом..

Синтаксис:
Используется csharp
Material[] materialsCopy = transform.renderer.materials;
//бла бла действие с materialsCopy (тот же тайлинг)
transform.renderer.materials = materialsCopy;
 

более подробно не могу сказать, но принцип такой..
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Создание плоскости из кубиков

Сообщение AngryGrey 13 фев 2013, 06:52

Не хочу создавать темы по каждому вопросу, поэтому буду здесь писать.
Есть скрипт:
Синтаксис:
Используется csharp
        void rotate_figura(bool R_rotate){
                int [,] temp_figura = new int [yf,xf];
                i_gps = 0;
                n_gps = 0;
                fgpsFigura = gpsFigura;
                h=k;
                for (int i = 0; i < xf; i++)
                        {
                                for (int n = 0; n < yf; n++)
                                {
                                        if (R_rotate){
                                                //Поворот вправо
                                                temp_figura[(yf-1)-n,i]=figura[(xf-1)-i,(yf-1)-n];
                                        }
                                        else{
                                                //Поворот влево
                                                temp_figura[(yf-1)-n,i]=figura[i,n];
                                        }
                                        //Сохранение новых координат точек фигуры
                                    if (temp_figura[(yf-1)-n,i]>0)
                                        {
                                                gpsFigura[i_gps,n_gps] = (yf-1)-n;
                                                gpsFigura[i_gps,n_gps+1] = i;
                                                i_gps++;       
                                                k++;
                                        }
                                }
                        }
                if (h == k)
                {
                        Debug.Log("h=k");
                }
                if (fgpsFigura == gpsFigura)
                {
                        Debug.Log("Yes");
                }
                //gpsFigura = fgpsFigura;
                figura = new int [yf,xf];
                figura = temp_figura;
                int temp = xf;
                xf = yf;
                yf = temp;
        }      


Здесь есть массив gpsFigura и fgpsFigura. Вопрос почему после изменений gpsFigura сравнение с fgpsFigura показывает, что они равны? Оо
Добавил проверяющие переменные h и k дублирующие изменения, с которыми все в порядке.
Последний раз редактировалось AngryGrey 13 фев 2013, 08:17, всего редактировалось 1 раз.
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

Re: Создание плоскости из кубиков

Сообщение seaman 13 фев 2013, 07:03

Потому что и то и другое - ссылка на одну и ту же область памяти.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Создание плоскости из кубиков

Сообщение AngryGrey 13 фев 2013, 07:12

Из всего мной прочитанного следует, что только перебором можно переписать один массив в другой... А жаль :(

С массивами свой касяк понял...
Возник другой вопрос есть ли UNity команда, с помощью которой можно уничтожить все дочерние объекты, оставив родительский, если дочерние объекты создавались динамически через Instantiate? В мануале ничего подобного пока не нашел... :(
AngryGrey
UNIт
 
Сообщения: 102
Зарегистрирован: 04 фев 2013, 02:58

След.

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

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

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