Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
1

Указания по оптимизации кода

04.07.2018, 16:09. Показов 732. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что скажете? Не будет сильно грузить? 24 экземпляра этого скрипта находятся в сцене.
Критика поддерживается!

P.S. Скрипт отвечает за перетаскивание предмета в инвентаре.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class TESTDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerClickHandler {
    
    private TESTInventorySlot inventorySlot;
    public TESTInventorySlot InventorySlot
    {
        get { return inventorySlot; }
    }
    private TESTInventory inventory;
    private Transform canvas;
    private Transform oldParent;
    private Image image;
    
    // Start is called on the frame when a script is enabled just before any of the Update methods is called the first time.
    protected void Start()
    {
        if (inventory == null)
            inventory = TESTInventory.Instance;
    }
    
    // This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
    protected void OnValidate()
    {
        if (inventorySlot == null)
            inventorySlot = GetComponentInParent<TESTInventorySlot>();
            
        if (canvas == null)
            canvas = GameObject.FindWithTag("Canvas").transform;
            
        if (image == null)
            image = GetComponent<Image>();
    }
    
    //Called when begin drag
    public void OnBeginDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            image.raycastTarget = false;
            oldParent = transform.parent;
            SetCanvasAsParent(true);
        }
    }
    
    //Called every frame when drag
    public void OnDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
            transform.position = Input.mousePosition;
    }
    
    //Called when end drag
    public void OnEndDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            image.raycastTarget = true;
            GameObject pointer = eventData.pointerCurrentRaycast.gameObject;
            if (pointer == null)
                Drop(inventorySlot);
            else if (pointer != null)
            {
                TESTInventorySlot tmpInventorySlot;
                if (pointer.GetComponent<TESTDrag>())
                {
                    TESTDrag tmpDrag = pointer.GetComponent<TESTDrag>();
                    tmpInventorySlot = tmpDrag.InventorySlot;
                }
                else tmpInventorySlot = pointer.GetComponent<TESTInventorySlot>();
                Item tmpItem = tmpInventorySlot.Item;
                
                if(tmpItem == null)
                {
                    SetCanvasAsParent(false);
                    inventory.AddItem(inventorySlot.Item, inventorySlot.Count, tmpInventorySlot.index);
                    tmpInventorySlot.itemObj = inventorySlot.itemObj;
                    inventory.RemoveItem(inventorySlot);
                }
                else if (tmpItem == inventorySlot.Item)
                {
                    if (tmpInventorySlot.Count < tmpItem.maxStack)
                    {
                        SetCanvasAsParent(false);
                        int canAdd = tmpItem.maxStack - tmpInventorySlot.Count;
                        if (canAdd == 0) SetCanvasAsParent(false);
                        else if (inventorySlot.Count <= canAdd)
                        {
                            tmpInventorySlot.Count += inventorySlot.Count;
                            inventory.RemoveItem(inventorySlot);
                        }
                        else
                        {
                            int surplus = inventorySlot.Count - canAdd;
                            int toAdd = inventorySlot.Count - surplus;
                            tmpInventorySlot.Count += toAdd;
                            inventorySlot.Count -= toAdd;
                        }
                    }
                    else SetCanvasAsParent(false);
                }
                else
                {
                    SetCanvasAsParent(false);
                    GameObject tmpItemObj = tmpInventorySlot.itemObj;
                    int tmpCount = tmpInventorySlot.Count;
                    
                    inventory.RemoveItem(tmpInventorySlot);
                    inventory.AddItem(inventorySlot.Item, inventorySlot.Count, tmpInventorySlot.index);
                    tmpInventorySlot.itemObj = inventorySlot.itemObj;
                    
                    inventory.RemoveItem(inventorySlot);
                    inventory.AddItem(tmpItem, tmpCount, inventorySlot.index);
                    inventorySlot.itemObj = tmpItemObj;
                }
            }
            else if (transform.parent == canvas)
                SetCanvasAsParent(false);
        }
    }
    
    public void Drop(TESTInventorySlot drop)
    {
        drop.itemObj.transform.SetParent(null);
        drop.itemObj.transform.position = inventory.transform.position + inventory.transform.forward;
        PickUp pickUp = drop.itemObj.GetComponent<PickUp>();
        pickUp.Count = drop.Count;
        Collider collider = drop.itemObj.GetComponent<Collider>();
        collider.enabled = true;
        drop.itemObj.AddComponent<Rigidbody>();
        drop.itemObj.SetActive(true);
        inventory.RemoveItem(drop);
        SetCanvasAsParent(false);
    }
    
    public void OnPointerClick(PointerEventData eventData)
    {
        Item item = inventorySlot.Item;
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            Debug.Log("Item: " + item.name + "\nDescription: " + item.description + "\nMaxStack: " + item.maxStack + "\nCount: " + inventorySlot.Count);
        }
        else if (eventData.button == PointerEventData.InputButton.Right && item.GetType() == typeof(ConsumableItem))
        {
            item.Use();
            if (inventorySlot.Count > 1)inventorySlot.Count--;
            else inventory.RemoveItem(inventorySlot);
        }
    }
    
    public void SetCanvasAsParent(bool value) { if (value) transform.SetParent(canvas); else transform.SetParent(inventorySlot.transform); }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2018, 16:09
Ответы с готовыми решениями:

Оптимизации кода
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; int main()...

Методы оптимизации кода
Написал статью по оптимизации кода на С++. Ее можно почитать тут: А вы какие еще способы...

Советы по оптимизации кода
Написал парсер данных. Подскажите как можно было сделать проще? Стрелка должна быть в отдельной...

Совет по оптимизации кода PHP
Здравтвуйте, уважаемые пользователя форума, прошу вашего совета, по более коректному наисанию...

7
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
04.07.2018, 16:38 2
NotGoodEnough, передвижения то будет по 1 объекту, правильно?
0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
04.07.2018, 17:09  [ТС] 3
k0vpack, Физически да, а фактически зависит от переменной count в скрипте TESTInventorySlot
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using TMPro;
 
public class TESTInventorySlot : MonoBehaviour, IDropHandler {
    
    public int index;
    public bool isEmpty = true;
    public GameObject itemObj;
    
    protected TESTDrag drag;
    protected Image image;
    [SerializeField] protected Item item;
    public Item Item
    {
        get { return item; }
        set
        {
            item = value;
            
            if (item == null)
            {
                image.sprite = null;
                image.enabled = false;
                itemObj = null;
                isEmpty = true;
            }
            else
            {
                image.sprite = item.icon;
                image.enabled = true;
                isEmpty = false;
            }
        }
    }
    
    protected TMP_Text counter;
    [SerializeField] protected int count;
    public int Count
    {
        get { return count; }
        set
        {
            count = value;
            
            if(count > 1)
            {
                counter.text = count.ToString();
                counter.enabled = true;
            }
            else counter.enabled = false;
        }
    }
    
    // This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
    protected virtual void OnValidate()
    {
        //Get Drag from children
        if (drag == null)
            drag = GetComponentInChildren<TESTDrag>();
            
        //Get image for icons from children
        if (image == null && drag != null)
            image = drag.GetComponent<Image>();
        
        //Get the Text of the children Drag
        if (counter == null)
            counter = drag.GetComponentInChildren<TMP_Text>();
    }
    
    public void OnDrop(PointerEventData eventData)
    {
        TESTInventory inventory = TESTInventory.Instance;
        TESTDrag currentDrag = eventData.pointerDrag.GetComponent<TESTDrag>();
        TESTInventorySlot inventorySlot = currentDrag.InventorySlot;
        
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            
        }
    }
}
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
05.07.2018, 12:33 4
Сильно гузить что именно?
0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
05.07.2018, 14:05  [ТС] 5
JerryLetehen, Систему, процессор, видеокарту...
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
05.07.2018, 23:29 6
NotGoodEnough, у меня на VR проекте 1600+ Скриптов. Одновременно на сцене бывает иногда 450+ (включая только активные объекты). Практический совет: оптимизация - один из последних этапов разработки.
Всё, так или иначе, будет в отдельности грузить вами указанные компоненты. Открывайте Profiler и следите за показателями: они покажут вам кто, что и когда и какой скрипт и какой метод, строка нагружает тот или иной компонент вашей системы.
0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
06.07.2018, 17:33  [ТС] 7
JerryLetehen,
Цитата Сообщение от JerryLetehen Посмотреть сообщение
у меня на VR проекте 1600+ Скриптов
Ну во-первых: Сильно грузится пк?
А во-вторых: Большинство из этих скриптов, примерно, 800-1000 не более 100 строк. И из этого кол-ва штук 250-300 - вспомогательные(промежуточные) скрипты.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
07.07.2018, 19:09 8
Цитата Сообщение от NotGoodEnough Посмотреть сообщение
Сильно грузится пк?
Зависит от системы, что логично.
NotGoodEnough, like I said
Цитата Сообщение от JerryLetehen Посмотреть сообщение
Открывайте Profiler и следите за показателями
0
07.07.2018, 19:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2018, 19:09
Помогаю со студенческими работами здесь

Научиться искусству оптимизации кода
Доброго вечера. Такой вопрос, может есть у кого свободная минутка и может научить правилу...

Нужен совет по оптимизации кода
Ребят, вот столкнулся с задачей написать небольшой код по нахождению наибольшего числа-палиндрома...

Нужен совет в оптимизации кода
Нужно оптимизировать метод Deallocate, который переводит нужный указатель из allotted в exempted,...

Оптимизации кода для улучшения производительности
Почему VB.net такой тормозной по сравнению с VC++ ?! риторический вопрос :) Какие вообще есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru