Показать сообщение отдельно
Старый 22.09.2020, 13:26   #16
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вызов гуя, есть проблемы.

В общем несколько советов (в порядке важности):

1. Не делать такие большие методы (как например Update класса SetkaHodaMonstra), а разделять на более мелкие методы. Это повысит читабельности коду и даст кускам кода имена (наименования методов). Для повышение читабельности так же можно использовать автоформат кода в Visual Studio (сочетание клавиш Ctrl+E, D или через меню Правка-Дополнительно-Форматировать документ).

2. Выносить специфические вещи в отдельные классы, не обязательно MonoBehaviour, а просто классы, выполняющие какую-то цель. Например генерацию меша сетки. Ну а если код отвечает за работу какого-то игрового объекта, то делать отдельный скрипт (MonoBehaviour) для этого объекта. Пусть свои функции он выполняет сам, а извне им только управлять (вызывать его методы, менять значения его открытых полей).

3. Избавляться от магических чисел. В коде много чисел, которые непонятно для чего служат. Лучше создавать константы с осмысленными именами для этих чисел и в коде применять эти константы. Если число определяет состояние, то использовать enum для задания состояний. Например FightScene.SkillPanelSower присваиваются какие-то значения и потом проверяются. Это просто числа, хз что они значат. Можно было бы сделать так:

public enum SkillPanelState
{
     
Hidden,
     
SkillsPanel,
     
ActionsPanel
}

public static 
SkillPanelState SkillPanelSower SkillPanelState.Hidden;

....
// где-то в коде
switch(FightScene.SkillPanelSower)
{
     case 
SkillPanelState.Hidden
          
//Скрыть панель, если не скрыта
          
break;
     case 
SkillPanelState.SkillsPanel
          
//Отобразить панель скилов, если скрыта или отображается что-то другое
          
break;
     case 
SkillPanelState.ActionsPanel
          
//Отобразить панель действий или еще чего-то, если скрыта или отображается что-то другое
          
break;

4. Использовать массивы или списки, вместо подобного кода:

public static int SkillButton1 0// Кнопка скилла 1.
    
public static int SkillButton2 0// Кнопка скилла 2.
    
public static int SkillButton3 0// Кнопка скилла 3.
    
public static int SkillButton4 0// Кнопка скилла 4.
    
public static int SkillButton5 0// Кнопка скилла 5.
    
public static int SkillButton6 0// Кнопка скилла 5.

    
public static int SkillRange1 0// Кнопка скилла 1.
    
public static int SkillRange2 0// Кнопка скилла 2.
    
public static int SkillRange3 0// Кнопка скилла 3.
    
public static int SkillRange4 0// Кнопка скилла 4.
    
public static int SkillRange5 0// Кнопка скилла 5.
    
public static int SkillRange6 0// Кнопка скилла 5. 

5. Не искал в коде дублирование данных, но если оно есть, то этого стоит избегать. Если в сцене есть какие-то скрипты на объектах, то их всегда можно найти и получить с них данные с помощью методов FindObjectOfType<T> или FindObjectsOfType<T>. Имея ссылку на объект в виде GameObject или другого компонента этого объекта можно всегда получить другие компоненты с этого объекта с помощью методов GetComponent<T> или GetComponentInChildren<T>. Если объект имеет несколько одинаковых компонентов, то есть аналогичные методы, возвращающие массивы компонентов GetComponents<T> или GetComponentsInChildren<T>.

6. Не создавать универсальные переменные. По типу таких:
private int UniversalCounter 0//Универсальный многоразовый счётчик для разных задачь
    
private int UniversalCounter2 0//Универсальный многоразовый счётчик для разных задачь
    
private int UniversalCounter3 0//Универсальный многоразовый счётчик для разных задачь 
Лучше создавать переменные в том месте, где они используются и давать им имена в этом контексте.

7. Первый раз вижу в коде использование ZERO как нуля) Но если даже так, то это константа, тогда она должна быть объявлена так:
private const int ZERO 0// Просто ноль, по тому, что мне нужен ноль. 
В таком случае не получится случайно этой переменной присвоить значение. Но тогда правда все твои циклы будут выдавать ошибку компиляции, потому что везде ты присваиваешь этой переменной значение 0. Хочу заметить, что цикл for может не иметь какую либо часть. Т.е. можно свободно заменить
for (ZERO 0ZERO StimeStime--)
{
      
SX SX SetkaDvijScaleZconstant;

на
for (; ZERO StimeStime--)
{
    
SX SX SetkaDvijScaleZconstant;

или на более понятный вариант - цикл while
while(ZERO Stime)
{
    
SX SX SetkaDvijScaleZconstant;
    
Stime--;


Все, завязываю с советами )
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Crystal (22.09.2020), Randomize (22.09.2020)