Инвентарь - Форум Игроделов
Чт, 02 Май 2024, 05:45 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Инвентарь (Знаю что очень избитая тема, но прошу знатоков помочь)
Инвентарь
Thedrhax14Дата: Пт, 10 Июн 2016, 15:42 | Сообщение # 1
 
Сообщений: 54
Награды: 0
Репутация: 1
Статус: Offline
Всем привет,

Уже какой раз я пишу инвентарь и всегда приходилось обходится одним циклом и только одним типом инвентаря: либо только по горизонтали, либо только по вертикали.
Не давно все же решил попытаться сделать одновременно и так и так. И все же Unity3d просто виснет когда использую два цикла. Напишите пожалуйста решение этой проблемы:
Код

#pragma strict
import UnityEngine.UI;
import System.Collections.Generic;

var Availabe_items:List.<_Item> = new List.<_Item>();
var Own_items:List.<_Item> = new List.<_Item>();
var Amount_of_Icon_Items:int;
var A_O_I_I:GameObject[];
var Empty_icon:GameObject;
var ViewPoint:Transform;

class _Item
{
    var Model:GameObject;
    var Icon:GameObject;
    var ID:int;
}

function Start () {

}

function Update ()
{
    A_O_I_I = GameObject.FindGameObjectsWithTag("Icon_Item");
    if(Amount_of_Icon_Items<Own_items.Count)
    {
  var E_I:GameObject = Instantiate(Empty_icon,ViewPoint.position,ViewPoint.rotation);
  E_I.transform.parent = ViewPoint.transform;
  E_I.transform.localScale.x = 1;
  E_I.transform.localScale.y = 1;
  E_I.transform.localScale.z = 1;
  Amount_of_Icon_Items++;
    }
    if(Amount_of_Icon_Items>=Own_items.Count)
  {
   for(var x:int;x<=Own_items.Count;x++)
    {
     /*for(var y:int;x>4;y++)
      {
       A_O_I_I[x].GetComponent(RectTransform).anchoredPosition = Vector2((-60+40*x),120-40*y);
      }*/
    }
  }
}


То что закомментировано как раз и заставляет Unity3d зависать.
P.S. мне надо что бы Unity смещал вниз на 40*y единиц измерения в UI, когда количество иконок в одной строке больше 4.


Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/

Сообщение отредактировал Thedrhax14 - Пт, 10 Июн 2016, 15:43
 
СообщениеВсем привет,

Уже какой раз я пишу инвентарь и всегда приходилось обходится одним циклом и только одним типом инвентаря: либо только по горизонтали, либо только по вертикали.
Не давно все же решил попытаться сделать одновременно и так и так. И все же Unity3d просто виснет когда использую два цикла. Напишите пожалуйста решение этой проблемы:
Код

#pragma strict
import UnityEngine.UI;
import System.Collections.Generic;

var Availabe_items:List.<_Item> = new List.<_Item>();
var Own_items:List.<_Item> = new List.<_Item>();
var Amount_of_Icon_Items:int;
var A_O_I_I:GameObject[];
var Empty_icon:GameObject;
var ViewPoint:Transform;

class _Item
{
    var Model:GameObject;
    var Icon:GameObject;
    var ID:int;
}

function Start () {

}

function Update ()
{
    A_O_I_I = GameObject.FindGameObjectsWithTag("Icon_Item");
    if(Amount_of_Icon_Items<Own_items.Count)
    {
  var E_I:GameObject = Instantiate(Empty_icon,ViewPoint.position,ViewPoint.rotation);
  E_I.transform.parent = ViewPoint.transform;
  E_I.transform.localScale.x = 1;
  E_I.transform.localScale.y = 1;
  E_I.transform.localScale.z = 1;
  Amount_of_Icon_Items++;
    }
    if(Amount_of_Icon_Items>=Own_items.Count)
  {
   for(var x:int;x<=Own_items.Count;x++)
    {
     /*for(var y:int;x>4;y++)
      {
       A_O_I_I[x].GetComponent(RectTransform).anchoredPosition = Vector2((-60+40*x),120-40*y);
      }*/
    }
  }
}


То что закомментировано как раз и заставляет Unity3d зависать.
P.S. мне надо что бы Unity смещал вниз на 40*y единиц измерения в UI, когда количество иконок в одной строке больше 4.

Автор - Thedrhax14
Дата добавления - 10 Июн 2016 в 15:42
VolkOrievithДата: Пт, 10 Июн 2016, 21:39 | Сообщение # 2
Нет аватара
 
Сообщений: 222
Награды: 0
Репутация: 53
Статус: Offline
Я лишь скину часть своего скрипта, извините, лень вникать в Вашу систему. Возможно, и скорее всего, решение Вашего вопроса тут есть.
Функция UpdateVolume - обновления инвентаря. Она расставляет предметы по местам, не выходя за рамки назначенных ячеек.
Причем при желании, можно довольно легко расширить, или сузить его.
Скрипт находит дочерние объекты со скриптом "Subject" и считывает с них информацию. Если макс. объем превышен, то "выкидывает" лишнее.
Запускать функцию нужно каждый раз, когда обновляется содержимое.

Код

var Volume : float; // текущий объем (в литрах)
var MaxVolume : float; // максимальный объем (в литрах)
var Weight : float; // текущий вес
var CellString : CellStrings[]; // строки
var Offest : int; // не важно
class CellStrings {
var CellColumn : boolean[]; // столбцы
}

function Start () {
UpdateVolume ();
}

function UpdateVolume (){

for (var SClear : CellStrings in CellString){
for (var CClear : boolean in SClear.CellColumn){
CClear = false;
}}                    // обнуление предыдущих результатов.
//Debug.Log("BagUpdate");
Volume = 0.0;                    // обнуление предыдущих результатов.
Weight = 0.0;                    // обнуление предыдущих результатов.
for (var Hit : Subject in GetComponentsInChildren.<Subject>()){ // для всех дочерних объектов со скриптом Subject одно и то же:..
if (Volume + Hit.Volume < MaxVolume){                    // не переполнен ли?
Volume += Hit.Volume;
Weight += Hit.Weight;
Hit.transform.localScale = Vector3.zero;
var SFree : boolean;
var CFree : boolean;
var CN : int;
var SN : int;

for (var SHit : CellStrings in CellString){
for (var CHit : boolean in SHit.CellColumn){
if (!Posted){
if (!CHit){
CHit = true;
Hit.MyCell.x = CN;
Hit.MyCell.y = SN;
Posted = true;
}
CN ++;
}
}
SN++;
}
}else{                  // если переполнено, выкидываем.
Hit.gameObject.GetComponent.<Rigidbody>().isKinematic = false;
Hit.transform.parent = null;
Hit.transform.localScale = Vector3(1,1,1);
}
}
}

Скрин окна инспектора:


З.Ы:
возможны совсем маленькие ошибочки в самом скрипте, я редактировал его прямо тут.


Сообщение отредактировал VolkOrievith - Пт, 10 Июн 2016, 21:56
 
СообщениеЯ лишь скину часть своего скрипта, извините, лень вникать в Вашу систему. Возможно, и скорее всего, решение Вашего вопроса тут есть.
Функция UpdateVolume - обновления инвентаря. Она расставляет предметы по местам, не выходя за рамки назначенных ячеек.
Причем при желании, можно довольно легко расширить, или сузить его.
Скрипт находит дочерние объекты со скриптом "Subject" и считывает с них информацию. Если макс. объем превышен, то "выкидывает" лишнее.
Запускать функцию нужно каждый раз, когда обновляется содержимое.

Код

var Volume : float; // текущий объем (в литрах)
var MaxVolume : float; // максимальный объем (в литрах)
var Weight : float; // текущий вес
var CellString : CellStrings[]; // строки
var Offest : int; // не важно
class CellStrings {
var CellColumn : boolean[]; // столбцы
}

function Start () {
UpdateVolume ();
}

function UpdateVolume (){

for (var SClear : CellStrings in CellString){
for (var CClear : boolean in SClear.CellColumn){
CClear = false;
}}                    // обнуление предыдущих результатов.
//Debug.Log("BagUpdate");
Volume = 0.0;                    // обнуление предыдущих результатов.
Weight = 0.0;                    // обнуление предыдущих результатов.
for (var Hit : Subject in GetComponentsInChildren.<Subject>()){ // для всех дочерних объектов со скриптом Subject одно и то же:..
if (Volume + Hit.Volume < MaxVolume){                    // не переполнен ли?
Volume += Hit.Volume;
Weight += Hit.Weight;
Hit.transform.localScale = Vector3.zero;
var SFree : boolean;
var CFree : boolean;
var CN : int;
var SN : int;

for (var SHit : CellStrings in CellString){
for (var CHit : boolean in SHit.CellColumn){
if (!Posted){
if (!CHit){
CHit = true;
Hit.MyCell.x = CN;
Hit.MyCell.y = SN;
Posted = true;
}
CN ++;
}
}
SN++;
}
}else{                  // если переполнено, выкидываем.
Hit.gameObject.GetComponent.<Rigidbody>().isKinematic = false;
Hit.transform.parent = null;
Hit.transform.localScale = Vector3(1,1,1);
}
}
}

Скрин окна инспектора:


З.Ы:
возможны совсем маленькие ошибочки в самом скрипте, я редактировал его прямо тут.

Автор - VolkOrievith
Дата добавления - 10 Июн 2016 в 21:39
seamanДата: Пт, 10 Июн 2016, 23:06 | Сообщение # 3
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Вам нужно для начала понять что такое for? Что в нем для чего.
Вот это лажа:
Код
for(var y:int;x>4;y++)
 
СообщениеВам нужно для начала понять что такое for? Что в нем для чего.
Вот это лажа:
Код
for(var y:int;x>4;y++)

Автор - seaman
Дата добавления - 10 Июн 2016 в 23:06
Thedrhax14Дата: Сб, 11 Июн 2016, 10:56 | Сообщение # 4
 
Сообщений: 54
Награды: 0
Репутация: 1
Статус: Offline
seaman,

То есть for нельзя так использовать как я попытался? Тогда что посоветуйте?


Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/
 
Сообщениеseaman,

То есть for нельзя так использовать как я попытался? Тогда что посоветуйте?

Автор - Thedrhax14
Дата добавления - 11 Июн 2016 в 10:56
ЛевшаДата: Сб, 11 Июн 2016, 14:30 | Сообщение # 5
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата
for (var SClear : CellStrings in CellString) { }

foreach (var SClear : CellStrings in CellString) { }


X.cor.R (Prologue)
 
Сообщение
Цитата
for (var SClear : CellStrings in CellString) { }

foreach (var SClear : CellStrings in CellString) { }

Автор - Левша
Дата добавления - 11 Июн 2016 в 14:30
VolkOrievithДата: Сб, 11 Июн 2016, 19:01 | Сообщение # 6
Нет аватара
 
Сообщений: 222
Награды: 0
Репутация: 53
Статус: Offline
Цитата Thedrhax14 ()
Тогда что посоветуйте?


У вас с переменными лажа. Написано "var y : int" а проверяется "х>4".
От сюда и лаги. Бесконечный цикл.

Цитата Левша ()
foreach (var SClear : CellStrings in CellString) { }

А зачем foreach, если for работает неплохо? В чем тут разница?
Не знаю, как в C#, а в JS "for" в таком случаи листает как раз все с начала до конца.


Сообщение отредактировал VolkOrievith - Сб, 11 Июн 2016, 19:01
 
Сообщение
Цитата Thedrhax14 ()
Тогда что посоветуйте?


У вас с переменными лажа. Написано "var y : int" а проверяется "х>4".
От сюда и лаги. Бесконечный цикл.

Цитата Левша ()
foreach (var SClear : CellStrings in CellString) { }

А зачем foreach, если for работает неплохо? В чем тут разница?
Не знаю, как в C#, а в JS "for" в таком случаи листает как раз все с начала до конца.

Автор - VolkOrievith
Дата добавления - 11 Июн 2016 в 19:01
seamanДата: Сб, 11 Июн 2016, 22:09 | Сообщение # 7
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Цитата
А зачем foreach, если for работает неплохо?

Я конечно JS не знаю, но в C# такой for не будет работать
 
Сообщение
Цитата
А зачем foreach, если for работает неплохо?

Я конечно JS не знаю, но в C# такой for не будет работать

Автор - seaman
Дата добавления - 11 Июн 2016 в 22:09
ЛевшаДата: Вс, 12 Июн 2016, 14:12 | Сообщение # 8
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата seaman ()
В чем тут разница?

Принципиально разницы никакой.

Цитата seaman ()
в C# такой for не будет работать

На Js такой for тоже работать не будет.
smile


X.cor.R (Prologue)
 
Сообщение
Цитата seaman ()
В чем тут разница?

Принципиально разницы никакой.

Цитата seaman ()
в C# такой for не будет работать

На Js такой for тоже работать не будет.
smile

Автор - Левша
Дата добавления - 12 Июн 2016 в 14:12
VolkOrievithДата: Вс, 12 Июн 2016, 15:04 | Сообщение # 9
Нет аватара
 
Сообщений: 222
Награды: 0
Репутация: 53
Статус: Offline
Цитата Левша ()
На Js такой for тоже работать не будет.

У меня всегда такой for работал. Перебирал весь массив по порядку.
 
Сообщение
Цитата Левша ()
На Js такой for тоже работать не будет.

У меня всегда такой for работал. Перебирал весь массив по порядку.

Автор - VolkOrievith
Дата добавления - 12 Июн 2016 в 15:04
Thedrhax14Дата: Вс, 12 Июн 2016, 18:45 | Сообщение # 10
 
Сообщений: 54
Награды: 0
Репутация: 1
Статус: Offline
Спасибо за ответ
Щас попробую еще

Добавлено (12 Июн 2016, 18:45)
---------------------------------------------
Все же да, проблема была в моем недопонимании о циклах, вот такой код в конце концов у меня получился (его часть):

Код

#pragma strict
import UnityEngine.UI;
import System.Collections.Generic;

var Availabe_items:List.<_Item> = new List.<_Item>();
var Own_items:List.<_Item> = new List.<_Item>();
var Amount_of_Icon_Items:int;
var A_O_I_I:GameObject[];
var Empty_icon:GameObject;
var ViewPoint:Transform;

var Opened:boolean;
var Paused:boolean;
var Invent:GameObject;

var slotsX:int = -60;
var slotsY:int = 120;
@System.Serializable
class _Item
{
    var Model:GameObject;
    var Icon:GameObject;
    var ID:int;
}

function Start () {
    for(var x:int;x<7;x++)
  {
   for(var y:int;y<4;y++)
    {
     //A_O_I_I[i].GetComponent(RectTransform).anchoredPosition = new Vector2(-60+40*x,120-40*y);
     var E_I:GameObject = Instantiate(Empty_icon,ViewPoint.position,ViewPoint.rotation);
     E_I.transform.parent = ViewPoint.transform;
     E_I.transform.localScale.x = 1;
     E_I.transform.localScale.y = 1;
     E_I.transform.localScale.z = 1;
     E_I.GetComponent(RectTransform).anchoredPosition = new Vector2(slotsX,slotsY);
     Amount_of_Icon_Items++;
     slotsX = slotsX + 40;
     if(y==3)
      {
       slotsX = -60;
       slotsY = slotsY - 40;
      }
    }
  }
}

function Update ()
{
    if(Input.GetKeyDown (KeyCode.Tab) && !Paused)
    {
  if(!Opened)
   {
    Opened = true;
    Invent.SetActive(true);
   }
  else
   {
    Opened = false;
    Invent.SetActive(false);
   }
    }
    if(Input.GetKeyDown (KeyCode.Escape))
    {
  if(Opened)
   {
    Opened = false;
   }
  if(!Paused)
   {
    Paused = true;
    Invent.SetActive(false);
   }
  else
   {
    Paused = false;
   }
    }
}


Спасибо всем за помощь.


Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/
 
СообщениеСпасибо за ответ
Щас попробую еще

Добавлено (12 Июн 2016, 18:45)
---------------------------------------------
Все же да, проблема была в моем недопонимании о циклах, вот такой код в конце концов у меня получился (его часть):

Код

#pragma strict
import UnityEngine.UI;
import System.Collections.Generic;

var Availabe_items:List.<_Item> = new List.<_Item>();
var Own_items:List.<_Item> = new List.<_Item>();
var Amount_of_Icon_Items:int;
var A_O_I_I:GameObject[];
var Empty_icon:GameObject;
var ViewPoint:Transform;

var Opened:boolean;
var Paused:boolean;
var Invent:GameObject;

var slotsX:int = -60;
var slotsY:int = 120;
@System.Serializable
class _Item
{
    var Model:GameObject;
    var Icon:GameObject;
    var ID:int;
}

function Start () {
    for(var x:int;x<7;x++)
  {
   for(var y:int;y<4;y++)
    {
     //A_O_I_I[i].GetComponent(RectTransform).anchoredPosition = new Vector2(-60+40*x,120-40*y);
     var E_I:GameObject = Instantiate(Empty_icon,ViewPoint.position,ViewPoint.rotation);
     E_I.transform.parent = ViewPoint.transform;
     E_I.transform.localScale.x = 1;
     E_I.transform.localScale.y = 1;
     E_I.transform.localScale.z = 1;
     E_I.GetComponent(RectTransform).anchoredPosition = new Vector2(slotsX,slotsY);
     Amount_of_Icon_Items++;
     slotsX = slotsX + 40;
     if(y==3)
      {
       slotsX = -60;
       slotsY = slotsY - 40;
      }
    }
  }
}

function Update ()
{
    if(Input.GetKeyDown (KeyCode.Tab) && !Paused)
    {
  if(!Opened)
   {
    Opened = true;
    Invent.SetActive(true);
   }
  else
   {
    Opened = false;
    Invent.SetActive(false);
   }
    }
    if(Input.GetKeyDown (KeyCode.Escape))
    {
  if(Opened)
   {
    Opened = false;
   }
  if(!Paused)
   {
    Paused = true;
    Invent.SetActive(false);
   }
  else
   {
    Paused = false;
   }
    }
}


Спасибо всем за помощь.

Автор - Thedrhax14
Дата добавления - 12 Июн 2016 в 18:45
Форум Игроделов » UNITY3D » СКРИПТИНГ » Инвентарь (Знаю что очень избитая тема, но прошу знатоков помочь)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024