격자 기반 인벤토리를 만들려고 노력 중이며 지금까지 한 가지를 제외하고는 모든 것이 잘 진행되고 있습니다.격자 기반 인벤토리 최적화
인벤토리는 으로 구성되고 Grids
은 사용자 정의 크기 (예 : 5x3, 3x3)를 가질 수 있습니다. Cell
은 항상 1x1이며 다른 크기 (예 : Grids
) 일 수있는 Items
을 보유 할 수 있습니다.
HandleCursor
함수를 사용하여 인벤토리에서 상호 작용을 처리하고 있는데, 사용자가 항목/셀 또는 물건을 움직여서 강조 표시하는지 확인하기 위해 모든 프레임을 실행하는 기능입니다.
아래의 코드에서 볼 수 있듯이 나는 그것을 수행하기 위해 많은 것을 사용하고 있습니다. 어떻게 든 최적화 할 수 있다면 궁금합니다. 그래서 CPU에서 어렵지 않습니다. (바로 지금 그리드를 강조 표시합니다.)/항목은 내 인벤토리 스크립트 0.27-0.31ms의 오버 헤드를 만들 수 있습니다.
각Cell
의
Rect
내 커서를 포함하는 경우 검사보다 더 나은 대안이 있습니까?
는이 종류를 물어 잘못된 장소 인 경우
죄송합니다 질문 수 :
내 코드 :
void HandleHighlighting()
{
HandleHighlightingCells();
HandleHighlightingItems();
HandleHighlightingPickedItem();
}
모든 그리드에 모든 세포를 강조 : 재고
void HandleHighlightingCells()
{
for (int i = 0; i < Grids.Count; i++)
{
InventoryGrid grid = Grids[i];
if (grid.GetRect().Contains(Input.mousePosition))
{
for (int x = 0; x < grid.width; x++)
{
for (int y = 0; y < grid.height; y++)
{
InventoryCell cell = grid.cells[x, y];
if (cell.GetRect().Contains(Input.mousePosition))
{
if (highlightedCell && highlightedCell != cell)
{
highlightedCell.Highlight(EItemHighlightMode.NONE);
}
highlightedCell = cell;
highlightedCell.Highlight(EItemHighlightMode.BASE);
}
else
{
if (cell == highlightedCell)
{
highlightedCell = null;
}
cell.Highlight(EItemHighlightMode.NONE);
}
}
}
}
else
{
for (int x = 0; x < grid.width; x++)
{
for (int y = 0; y < grid.height; y++)
{
InventoryCell cell = grid.cells[x, y];
if (highlightedCell && highlightedCell != cell)
{
if (highlightedCell.grid == grid)
{
highlightedCell = null;
}
}
cell.Highlight(EItemHighlightMode.NONE);
}
}
}
}
}
강조 항목 :
void HandleHighlightingItems()
{
if (highlightedCell && highlightedCell.heldItem)
{
InventoryItem item = highlightedCell.heldItem;
if (highlightedItem && highlightedItem != item)
{
for (int i = 0; i < highlightedItem.occupiedCells.Length; i++)
{
highlightedItem.occupiedCells[i].Highlight(EItemHighlightMode.NONE);
}
}
highlightedItem = item;
for (int i = 0; i < item.occupiedCells.Length; i++)
{
item.occupiedCells[i].Highlight(EItemHighlightMode.BASE);
}
}
else
{
if (highlightedItem)
{
for (int i = 0; i < highlightedItem.occupiedCells.Length; i++)
{
highlightedItem.occupiedCells[i].Highlight(EItemHighlightMode.NONE);
}
highlightedItem = null;
}
}
}
강조 포착 항목 :
void HandleHighlightingPickedItem()
{
if (pickedItem)
{
if (highlightedCell)
{
InventoryGrid grid = highlightedCell.grid;
InventoryCell[] cellsToHighlight = new InventoryCell[pickedItem.width * pickedItem.height];
InventoryItem firstItem = null;
bool valid = true;
int index = 0;
for (int x = 0; x < pickedItem.width; x++)
{
for (int y = 0; y < pickedItem.height; y++)
{
if (highlightedCell.x + x < grid.width && highlightedCell.y + y < grid.height)
{
InventoryCell cell = grid.cells[highlightedCell.x + x, highlightedCell.y + y];
cellsToHighlight[index] = cell;
if (highlightedItem)
{
if (cell.heldItem != highlightedItem)
{
if (cell.heldItem)
{
valid = false;
}
}
}
else
{
if (cell.heldItem)
{
if (!firstItem)
{
firstItem = cell.heldItem;
}
else
{
if (cell.heldItem != firstItem)
{
valid = false;
}
}
}
}
}
else
{
valid = false;
}
index++;
}
}
for (int i = 0; i < cellsToHighlight.Length; i++)
{
if (cellsToHighlight[i])
{
if (valid)
{
cellsToHighlight[i].Highlight(EItemHighlightMode.VALID);
}
else
{
cellsToHighlight[i].Highlight(EItemHighlightMode.INVALID);
}
}
}
}
}
}
Theres는 '코드 리뷰 사이트 : https://codereview.stackexchange.com/ – Adelin
@Adelin 내가 그것을 바로 이곳입니다 있는지 확실하지 않습니다하지만 난 거기 – Fiffe
을 게시합니다, 감사합니다. 도움말 센터를 확인하십시오. 받아 들일 수없는 제목의 사례를 보았을 수도 있습니다. [...] : [if 문을 단순화합니다. (너무 많은 질문에 적용됩니다.] (https : // codereview. stackexchange.com/help/how-to-ask)* – Adelin