Уже какой раз я пишу инвентарь и всегда приходилось обходится одним циклом и только одним типом инвентаря: либо только по горизонтали, либо только по вертикали. Не давно все же решил попытаться сделать одновременно и так и так. И все же Unity3d просто виснет когда использую два цикла. Напишите пожалуйста решение этой проблемы:
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; }
То что закомментировано как раз и заставляет Unity3d зависать. P.S. мне надо что бы Unity смещал вниз на 40*y единиц измерения в UI, когда количество иконок в одной строке больше 4. Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/
Сообщение отредактировал Thedrhax14 - Пт, 10 Июн 2016, 15:43
Я лишь скину часть своего скрипта, извините, лень вникать в Вашу систему. Возможно, и скорее всего, решение Вашего вопроса тут есть. Функция 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
То есть for нельзя так использовать как я попытался? Тогда что посоветуйте? Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/
Добавлено (12 Июн 2016, 18:45) --------------------------------------------- Все же да, проблема была в моем недопонимании о циклах, вот такой код в конце концов у меня получился (его часть):
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; }