forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Uawi. Вопрос - ответ (http://forum.boolean.name/showthread.php?t=18687)

Uawi 09.11.2013 11:59

Uawi. Вопрос - ответ
 
Как сделать выборку из массива? Есть генерация по осям X -> Z по 5 боксов на каждую, как выбрать эти объекты?

По фото видно, что надо по Z выбрать весь третий ряд, а по X весь второй...

pax 09.11.2013 13:23

Ответ: Uawi. Вопрос - ответ
 
Поясни вопрос, что значит "Выбрать"?

Uawi 09.11.2013 16:17

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от pax (Сообщение 269838)
Поясни вопрос, что значит "Выбрать"?

То есть мне надо взять эти элементы и что-то сделать с ними, например сменить матреиал. Как сделать выборку

Nex 09.11.2013 16:46

Ответ: Uawi. Вопрос - ответ
 
Не знаю точно, но должны в map[x,z] быть хендлы на объекты.
в map[0,0] будет самый левый-верхний куб.

Uawi 09.11.2013 21:21

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от Nex (Сообщение 269854)
Не знаю точно, но должны в map[x,z] быть хендлы на объекты.
в map[0,0] будет самый левый-верхний куб.

Не, ну подсчитать я и так могу, а вот если их будет >500, то хочется увидеть оптимизированных способ.

dsd 09.11.2013 21:47

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от Uawi (Сообщение 269835)
Как сделать выборку из массива? Есть генерация по осям X -> Z по 5 боксов на каждую, как выбрать эти объекты?
По фото видно, что надо по Z выбрать весь третий ряд, а по X весь второй...

PHP код:

for( int x=0x<xMaxx++){ doSomething(map[x,3]);}
for( 
int z=0z<zMaxz++){ doSomething(map[3,z]);} 

как-то так

Uawi 09.11.2013 22:16

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от dsd (Сообщение 269899)
PHP код:

for( int x=0x<xMaxx++){ doSomething(map[x,3]);}
for( 
int z=0z<zMaxz++){ doSomething(map[3,z]);} 

как-то так

Спасибо, но я уже решил этот вопрос)))
PHP код:

Destroy(map[2,z]);
                
Destroy(map[x,2]); 


Uawi 10.11.2013 00:03

Ответ: Uawi. Вопрос - ответ
 
Вот еще вопросик, как сделать так, чтобы объекты создавались один раз? Я сделал дополнительный цикл чтобы он сработал один раз, но объекты создаются 5 раз. Как предотвратить это?

PHP код:

using UnityEngine;
using System.Collections;

public class 
Generation MonoBehaviour {
    
    
GameObject[,] map;
    
    
// Префабы блока и растения
    
public GameObject _blockprefab_plantprefab;
    
    
// Переменные для назначения максимального количества блоков по X и Z
    
public int maxXmaxZ;
    
// Дистанция между блоками и высота от боков
    
public float _distance_heightplantsdistance;
    
    public 
void Start () {
        
map = new GameObject[maxXmaxZ];
        
        for (
int x 0maxXx++) {
            for (
int z 0maxZz++) {
                
map[xz] = (GameObject)Instantiate(_blockprefab, new Vector3(_distance_distance), Quaternion.identity);
                for (
int p 01p++) {
                    
Instantiate (_plantprefab, new Vector3(2_heightplantsdistancez), Quaternion.identity);
                    
Instantiate (_plantprefab, new Vector3(x_heightplantsdistance2), Quaternion.identity);                        
                }
            }
        }    
    }



dsd 10.11.2013 00:31

Ответ: Uawi. Вопрос - ответ
 
Код:

using UnityEngine;
using System.Collections;

public class Generation : MonoBehaviour {
   
    GameObject[,] map;
   
    // Префабы блока и растения
    public GameObject _blockprefab, _plantprefab;
   
    // Переменные для назначения максимального количества блоков по X и Z
    public int maxX, maxZ;
    // Дистанция между блоками и высота от боков
    public float _distance, _heightplantsdistance;
   
    public void Start () {
        map = new GameObject[maxX, maxZ];
       
        for (int x = 0; x < maxX; x++) {
            for (int z = 0; z < maxZ; z++) {
                map[x, z] = (GameObject)Instantiate(_blockprefab, new Vector3(x * _distance, 0 , z * _distance), Quaternion.identity);
                for (int p = 0; p < 1; p++) {
                  if(x==2) Instantiate (_plantprefab, new Vector3(2, _heightplantsdistance, z), Quaternion.identity);
                  if(z==2 && x!=2) Instantiate (_plantprefab, new Vector3(x, _heightplantsdistance, 2), Quaternion.identity);                       
                }
            }
        }   
    }
}

каким нить условием

Uawi 10.11.2013 01:19

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от dsd (Сообщение 269909)
Код:

using UnityEngine;
using System.Collections;

public class Generation : MonoBehaviour {
   
    GameObject[,] map;
   
    // Префабы блока и растения
    public GameObject _blockprefab, _plantprefab;
   
    // Переменные для назначения максимального количества блоков по X и Z
    public int maxX, maxZ;
    // Дистанция между блоками и высота от боков
    public float _distance, _heightplantsdistance;
   
    public void Start () {
        map = new GameObject[maxX, maxZ];
       
        for (int x = 0; x < maxX; x++) {
            for (int z = 0; z < maxZ; z++) {
                map[x, z] = (GameObject)Instantiate(_blockprefab, new Vector3(x * _distance, 0 , z * _distance), Quaternion.identity);
                for (int p = 0; p < 1; p++) {
                  if(x==2) Instantiate (_plantprefab, new Vector3(2, _heightplantsdistance, z), Quaternion.identity);
                  if(z==2 && x!=2) Instantiate (_plantprefab, new Vector3(x, _heightplantsdistance, 2), Quaternion.identity);                       
                }
            }
        }   
    }
}

каким нить условием

Хмммм, занятно, попробуем днем. Спасибо

Uawi 10.11.2013 18:39

Ответ: Uawi. Вопрос - ответ
 
Да, спасибо, помогло

Uawi 17.11.2013 20:04

Ответ: Uawi. Вопрос - ответ
 
Разбираюсь с 2D. Как сделать плавное перемещение вверх до определенной позиции?

pax 17.11.2013 20:33

Ответ: Uawi. Вопрос - ответ
 
к примеру так http://docs.unity3d.com/Documentatio...moothDamp.html

Uawi 17.11.2013 20:59

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от pax (Сообщение 270363)

Спасибо, вот огромное прямо!

А вот что это означало?
Код:

ref yVelocity

Uawi 17.11.2013 21:23

Ответ: Uawi. Вопрос - ответ
 
Подскажите, почему один раз срабатывает? Как сделать так, чтобы нажал на кнопку и поехал вверх объект, а не как у меня... Нажал - > сдвинулся и остановился...

Код:

        public void OnGUI () {
                if (GUI.Button (new Rect (10, 10, 60, 30), "Вверх")) {
                        float _newposition = Mathf.SmoothDamp(_lift.transform.position.y, _positions[0 + up], ref yVelocity, _smoothTime);
                        _lift.transform.position = new Vector3(_lift.transform.position.x, _newposition, 0);                       
                }
        }


pax 17.11.2013 22:17

Ответ: Uawi. Вопрос - ответ
 
наверное надо up++; добавить

Uawi 17.11.2013 22:40

Ответ: Uawi. Вопрос - ответ
 
Цитата:

Сообщение от pax (Сообщение 270366)
наверное надо up++; добавить

Up - это переменная показывающая на сколько этажей вверх надо подняться, то есть если надо подняться на второй, то массив -> 0 + up, где up = 2.

Если в Update написать, то все нормально, а вот через нажатие на кнопку не выходит

Uawi 17.11.2013 23:18

Ответ: Uawi. Вопрос - ответ
 
Посмотрите, вот у меня есть код, который должен сделать подъем лифта на два этажа выше(это 1 в _positions) и опустить на 1 вниз от текущей позиции, как сделать так?

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

Код:

using UnityEngine;
using System.Collections;

public class Action : MonoBehaviour {

        // Объект лифта
        GameObject _lift;
        float yVelocity, _newposition;

        // Массив позиций
        public float[] _positions;
        // Время подъема
        public float _smoothTime;

        // Нужный этаж
        public int floor = 3;
        // Текущий этаж
        public int current = 0;

        // Переменные для показа направленности движения
        public bool _actionUp = false, _actionDown = false;

        public void Awake () {
                // Указываем лифт
                _lift = (GameObject)GameObject.FindGameObjectWithTag("Лифт");
        }

        public void Update () {
                // Если вверх активно
                if (_actionUp) {
                        // Вызываем корутину
                        StartCoroutine (_WaitUpFalse());

                }
                // Если вниз активно
                if (_actionDown) {
                        // Вызываем корутину
                        StartCoroutine (_WaitDownFalse());                       
                }
        }

        public void OnGUI () {
                if (GUI.Button (new Rect (10, 10, 60, 30), "Вверх") && _actionDown == false) {
                        // Вверх активируем
                        _actionUp = true;
                }
                if (GUI.Button (new Rect (80, 10, 60, 30), "Вниз") && _actionUp == false) {
                        // Вниз активируем
                        _actionDown = true;
                }
        }

        // Для отмены действия вверх
        public IEnumerator _WaitUpFalse () {
                // Указыывем новую позицию
                _newposition = Mathf.SmoothDamp(_lift.transform.position.y, _positions[current + 1], ref yVelocity, _smoothTime);
                // Перемещаем объект
                _lift.transform.position = new Vector3(_lift.transform.position.x, _newposition, 0);
                // Ждем
                yield return new WaitForSeconds (_smoothTime * 3);
                // Отменяем действие
                _actionUp = false;
        }

        // Для отмены действия вниз
        public IEnumerator _WaitDownFalse () {
                // АНАЛОГИЧНО
                _newposition = Mathf.SmoothDamp(_lift.transform.position.y, _positions[current - 1], ref yVelocity, _smoothTime);
                _lift.transform.position = new Vector3(_lift.transform.position.x, _newposition, 0);
                yield return new WaitForSeconds (_smoothTime * 3);
                _actionDown = false;
        }
}

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

Uawi 18.11.2013 00:32

Ответ: Uawi. Вопрос - ответ
 
Простите за тот же пост...

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

Спасибо

Uawi 18.11.2013 23:25

Ответ: Uawi. Вопрос - ответ
 
Вот, переписал код, только теперь вообще не поднимается лифт, есть изменения в позиции на доли секунды, а скрипт работает полностью, кроме вот поднятия, точнее работает полностью, только не до конца:
PHP код:

using UnityEngine;
using System.Collections;

public class 
Action MonoBehaviour {

    
// Объект лифта
    
GameObject elevator;
    
// Скорость по Y
    
float yVelocity;

    
// Публичная переменная этажа
    
public int floor 0;
    
// Перменные для контроля передвижения
    
public int updown;
    
// Массив позиций игрока
    
public float[] positions;
    
// Время подъема
    
public float smoothTime;
    
// Перменные флажка для контроля передвижения
    
public bool uppingdowning;

    public 
void Awake () {
        
elevator = (GameObject)GameObject.FindGameObjectWithTag("Лифт");
    }

    public 
void OnGUI () {
        
// Стиль
        
GUI.skin.button.normal.background null;
        
GUI.skin.button.hover.background null;
        
GUI.skin.button.active.background null;

        
// Левая кнопка, отвечающая за подъем вверх
        
if (GUI.Button (new Rect (00Screen.width 4Screen.height), "") && downing == false) {
            
StartCoroutine (Upping ());
        }
        
// Правая кнопка, отвечающая за спуск
        
if (GUI.Button (new Rect (Screen.width Screen.width 40Screen.width 4Screen.height), "") && upping == false) {
            
StartCoroutine (Downing ());
        }
    }

    public 
IEnumerator Upping () {
        
upping true;
        
downing false;

        
floor += up;

        
float newposition Mathf.SmoothDamp(elevator.transform.position.ypositions[floor], ref yVelocitysmoothTime);
        
elevator.transform.position = new Vector3(elevator.transform.position.xnewpositionelevator.transform.position.z);

        yield return new 
WaitForSeconds (smoothTime 3);

        
upping false;
        
downing false;
    }

    public 
IEnumerator Downing () {
        
downing true;
        
upping false;

        
floor -= down;
        
        
float newposition Mathf.SmoothDamp(elevator.transform.position.ypositions[floor], ref yVelocitysmoothTime);
        
elevator.transform.position = new Vector3(elevator.transform.position.xnewpositionelevator.transform.position.z);
        
        yield return new 
WaitForSeconds (smoothTime 3);

        
downing false;
        
upping false;
    }





Часовой пояс GMT +4, время: 02:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot