Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 45

Плавание плота

15.04.2020, 22:13. Показов 2022. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал код для управления плота посредством стрелок, код с поворотами и перемещениями Translate писал впервые.
Посмотрите, может у кого есть предложения по оптимизации или сокращению размера.
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
using UnityEngine;
 
public class Swiming : MonoBehaviour
{
    public bool rightveslo;//Торможение по правому веслу
    public bool lefttveslo;//Торможение по левому веслу
    float SpeedBracking=0.998f;//Коэффицент торможения
    public GameObject LeftOar;//Левое весло
    public GameObject RightOar;//Правое весло
    public GameObject Player;//Персонаж
    public bool go;//Булевая возможности хода
    public float brakingOne;//Торможение по линии вправо
    public float brakingTwo;//Торможение по линии влево
    public float braking;//Торможение по линии хода
    public GameObject Oars;//Вёсла
    bool RotateRight;//Булевая поворота вправо
    bool RotateLeft;//Булевая поворота влево
    public bool Move;//Булевая хода
    public float Speed;//Скорость
     void Start()
    {      
        RotateRight = false;
        RotateLeft = false;
        go = false;
        brakingOne = 0;
        brakingTwo = 0;
        braking = 0;
    }
    void FixedUpdate()
    {
        if (braking < 0.1)
        {
            braking = 0;
        }
        if (brakingOne < 0.1)
        {
            brakingOne = 0;
        }
        if (brakingTwo < 0.1)
        {
            brakingTwo = 0;
        }
        if (go)//Если ход возможен
        {
            Player.GetComponent<FirstPersonAIO>().walkSpeed = 0;//Обнуление скорости персонажа          
            if (Input.GetKey(KeyCode.UpArrow)&& RotateLeft==false&& RotateRight==false)//Если нажата стрелка вверх
            {             
             Oars.GetComponent<Animator>().SetBool("MoveRight", false);//Анимация поворота влево прекращена
             Oars.GetComponent<Animator>().SetBool("MoveLeft", false);//Анимация поворота вправо прекращена
             Oars.GetComponent<Animator>().SetBool("Move", true);//Анимация хода вперёд включена
             if (RightOar.transform.localScale.x>1.50045 )//Если размер весла больше числа 
             {
                  Move = true;//Булевая хода активна
             }
            }
            else//Иначе
            {             
              Oars.GetComponent<Animator>().SetBool("Move", false);//Анимация хода прекращена
              Move = false;//Булевая хода деактивирована
            }
          if (Input.GetKey(KeyCode.RightArrow)&& RotateLeft==false&& Move==false)//Если нажата стрелка вправо
          {
           RotateRight = true;        
           brakingOne = 1;
           LeftMove();//Активировать метод гребли вправо
          }
          else
          {
           RotateRight = false;
           rightveslo = false;
           brakingOne = brakingOne *SpeedBracking;//Торможение поворота вправо * Торможение
           transform.Rotate(Vector3.up * Time.deltaTime * brakingOne*2);////Поворот вправо * торможение поворота вправо * 2                                 
           Oars.GetComponent<Animator>().SetBool("MoveLeft", false);//Анимация поворота вправо прекращена          
          }
         if (Input.GetKey(KeyCode.LeftArrow)&&RotateRight == false && Move == false)//Если нажата стрелка влево
         {
          RotateLeft = true;                 
          brakingTwo = 1;
          RightMove();//Активировать метод гребли влево
         }
         else//Иначе
         {                
          RotateLeft = false;                           
          Oars.GetComponent<Animator>().SetBool("MoveRight", false);////Анимация поворота влево прекращена     
                brakingTwo = brakingTwo * SpeedBracking;//Торможение поворота влево * торможение
                transform.Rotate(Vector3.down * Time.deltaTime * brakingTwo*2);////Поворот вправо * торможение поворота вправо * 2
            }
         if (Move)//Если ход активен
         {
          braking = 1;
          transform.Translate(Vector3.right * Time.deltaTime * Speed);//Перемещение объекта * скорость
         }
         else//Иначе
         {
          braking = braking * SpeedBracking;//Торможение хода * торможение
          transform.Translate(Vector3.right * Time.deltaTime * braking);//Перемещение объекта * торможение 
         }
        }
        else//Иначе
        {
            Player.GetComponent<FirstPersonAIO>().walkSpeed = 4;//Скорость персонажа = 4
        }
    }
     
    void LeftMove()
    {
        Oars.GetComponent<Animator>().SetBool("MoveLeft", true);//Анимация поворота вправо включена
        Oars.GetComponent<Animator>().SetBool("MoveRight", false);//Анимация поворота влево прекращена
        Oars.GetComponent<Animator>().SetBool("Move", false);//Анимация хода прекращена
        if (LeftOar.transform.localScale.x > 1.50045)// Если размер объекта по х > числа
        {
            transform.Rotate(Vector3.up * Time.deltaTime * 2);//Поворот объекта вправо * 2
            rightveslo = true;
        }
        
        if (rightveslo)
        {
         transform.Rotate(Vector3.up * Time.deltaTime * SpeedBracking*2);//Поворот объекта вправо * торможение * 2
        }
                   
    }
    void RightMove()
    {
        Oars.GetComponent<Animator>().SetBool("MoveRight", true);//Анимация поворота влево включена
        Oars.GetComponent<Animator>().SetBool("Move", false);//Анимация хода прекращена
        Oars.GetComponent<Animator>().SetBool("MoveLeft", false);//Анимация поворота вправо включена
        if (RightOar.transform.localScale.x > 1.50045)// Если размер объекта по х > числа
        {
            transform.Rotate(Vector3.down * Time.deltaTime * 2);//Поворот объекта влево * 2
            lefttveslo = true;
        }
        if (lefttveslo)
        {
            transform.Rotate(Vector3.down * Time.deltaTime * SpeedBracking * 2);//Поворот объекта влево * торможение * 2
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2020, 22:13
Ответы с готовыми решениями:

Плавание тела в двух жидкостях
Подскажите: почему, когда тело погружено в две жидкости , несмешиваемые, как на рисунке, то при составлении уравнения равновесия системы...

Выбор и програмирование 3D плота
Добрый день, У меня есть 3 координаты: x,y,z. Мне надо сделать по ним плот. Эти три координаты это координаты точки на мосту, таких точек...

Для каждой из точек определить расстояние до ближайшей стороны плота
вводится массив точек на плоскости (кординаты x и y).Вводится кординаты прямоугольного плота (кординаты левого верхнего угла,длина и...

8
15.04.2020, 22:24

Не по теме:

Код идеальный. Ничего не меняй. Всё очень ясно и понятно, структура просто бомба, про оптимизацию вообще нечего сказать, один восторг да и только!

0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 45
15.04.2020, 22:28  [ТС]
Если это не прикол, то мне приятно)
0
 Аватар для squakoon
68 / 48 / 20
Регистрация: 09.10.2013
Сообщений: 156
16.04.2020, 11:46
EgorCol1, к сожалению, это был прикол.
Компоновать символы так, чтобы это компилировалось и даже работало — вы уже научились. После первых успехов очень важно не оттягивать продолжение обучения. Чтобы не приходилось годами учиться на собственных ошибках, отличным вариантом может быть чтение технической литературы, где вам удастся узнать о лучших и повсеместно используемых практиках программирования.

Ваш пример кода в текущем состоянии откровенно ужасен. Минимум — его очень некомфортно читать из-за отсутствия форматирования.

В мире разработки ПО есть много дополнительных и очень важных формальностей, которые у вас не соблюдены. На данном этапе "читабельность" и качество вашего кода сильно хромают — это абсолютно нормально, все через это проходят.

Наберитесь терпения, больше гуглите о том, как делать нужно и как не стоит, читайте классику, практикуйтесь. Удачи!
2
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
16.04.2020, 19:37
Цитата Сообщение от EgorCol1 Посмотреть сообщение
Посмотрите, может у кого есть предложения по оптимизации или сокращению размера.
С вашего разрешения я хотел бы поделиться некоторыми самыми простыми рекомендациями.

По оптимизации.

Про GetComponent<>
Кликните здесь для просмотра всего текста
Сам метод GetComponent<> не рекомендуют вызывать часто, тем более в Update. Этот метод каждый раз при вызове - перебирает все компоненты объекта и ищет необходимый. Поэтому лучше один раз получить ссылку на нужный компонент и использовать эту ссылку, например

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test : MonoBehaviour
{
    public GameObject Oars; // объект со сцены
 
    private Animator _oarsAnimator; // ссылка на компонент
 
    private void Start()
    {
        _oarsAnimator = Oars.GetComponent<Animator>(); // в старте единожды получили ссылку на аниматор
    }
 
    private void Update()
    {
        // где-то в коде
        _oarsAnimator.SetBool("MoveRight", false);
        _oarsAnimator.SetBool("MoveLeft", false);
        _oarsAnimator.SetBool("Move", true);
    }
 
}


На счёт манипуляции параметров аниматора через строки _oarsAnimator.SetBool("MoveRight", false);
Кликните здесь для просмотра всего текста
Передача строки так же не оптимальное решение. Плюс всегда можно сделать опечатку, а потом долго искать причину проблемы. Для оптимизации и решения подобного случая, есть специальный метод, который возвращает хеш имени нужного параметра, точнее строки (хеш это уникальный int, а число всегда работает быстрее, чем стока). Поэтому можно сначала получить хеши всех нужных параметров, сохранить их в приватных полях и использовать именно их. Например оптимизируем ещё больше:
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
public class Test : MonoBehaviour
{
    public GameObject Oars; // объект со сцены
 
    private Animator _oarsAnimator; // ссылка на компонент
 
    // хеши имён клипов
    private int _oarsMoveRightHash;
    private int _oarsMoveLeftHash;
    private int _oarsMoveHash;
    private void Start()
    {
        // в старте единожды получили ссылку на аниматор
        _oarsAnimator = Oars.GetComponent<Animator>();
 
        // получаем хеши всех нужных имён параметров
        _oarsMoveRightHash = Animator.StringToHash("MoveRight");
        _oarsMoveLeftHash = Animator.StringToHash("MoveLeft");
        _oarsMoveHash = Animator.StringToHash("Move");
    }
 
    private void Update()
    {
        // где-то в коде
        _oarsAnimator.SetBool(_oarsMoveRightHash, false);
        _oarsAnimator.SetBool(_oarsMoveLeftHash, false);
        _oarsAnimator.SetBool(_oarsMoveHash, true);
    }
}



Частый вызов одних и тех же операций, иногда проще вынести в отдельный метод. Например у вас следующие строки встречаются три раза.
C#
1
2
3
Oars.GetComponent<Animator>().SetBool("MoveLeft", true);//Анимация поворота вправо включена
Oars.GetComponent<Animator>().SetBool("MoveRight", false);//Анимация поворота влево прекращена
Oars.GetComponent<Animator>().SetBool("Move", false);//Анимация хода прекращена
Кликните здесь для просмотра всего текста
По-сути что здесь происходит? У вас есть неких три параметра, которые ВСЕГДА работают в группе. И вы хотите чтобы "включённым" был ВСЕГДА только один из них.
Решение - создать метод, который сначала "выключает" все эти три параметра, а потом включает только нужный. Нужный параметр можно передавать в метод, например ещё больше оптимизируем:
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
public class Test : MonoBehaviour
{
    public GameObject Oars; // объект со сцены
 
    private Animator _oarsAnimator; // ссылка на компонент
 
    // хеши имён клипов
    private int _oarsMoveRightHash;
    private int _oarsMoveLeftHash;
    private int _oarsMoveHash;
    private void Start()
    {
        // в старте единожды получили ссылку на аниматор
        _oarsAnimator = Oars.GetComponent<Animator>();
 
        // получаем хеши всех нужных имён параметров
        _oarsMoveRightHash = Animator.StringToHash("MoveRight");
        _oarsMoveLeftHash = Animator.StringToHash("MoveLeft");
        _oarsMoveHash = Animator.StringToHash("Move");
 
    }
 
    private void Update()
    {
        // где-то в коде
 
        // просто вызываем метод
        // и передаём ему хеш только того параметра,
        // который должен быть включен.
 
        // допустим нужно включить только движение влево
        oarsRightLeftMoveEnableOnly(_oarsMoveLeftHash);
 
 
        // а потом только движение вперёд
        oarsRightLeftMoveEnableOnly(_oarsMoveHash);
    }
 
    // оставляет "включённым" только один из трёх параметров 
    private void oarsRightLeftMoveEnableOnly(int rightLeftMoveHash)
    {
        _oarsAnimator.SetBool(_oarsMoveRightHash, false);
        _oarsAnimator.SetBool(_oarsMoveLeftHash, false);
        _oarsAnimator.SetBool(_oarsMoveHash, false);
 
        _oarsAnimator.SetBool(rightLeftMoveHash, true);
    }
 
}


по оптимизации пока хватит на первых порах. Теперь немного о том, как сделать код немного понятнее, взяв за основу некоторые принятые соглашения.

У вас встречаются "магические числа".

Player.GetComponent<FirstPersonAIO>().wa lkSpeed = 4;
LeftOar.transform.localScale.x > 1.50045
transform.Rotate(Vector3.down * Time.deltaTime * 2);

Кликните здесь для просмотра всего текста
Проблема в том, что если вы захотите изменить некоторое из них, вам придётся изменять его по всему коду и очень просто пропустить одно из них. Это очень неудобно, согласитесь.
Лучше вынесите такие числа в поля класса, там и виднее и очень легко будет редактироваться один раз из одного места, например

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
public class Test : MonoBehaviour
{
    // все магические числа лучше сделать полями
    private float _maxScaleX = 1.50045f;
    private float _breakMultiply = 2f;
    void LeftMove()
    {
        //if (LeftOar.transform.localScale.x > 1.50045)
        //{
        //    transform.Rotate(Vector3.up * Time.deltaTime * 2);
        //    rightveslo = true;
        //}
 
        //if (rightveslo)
        //{
        //    transform.Rotate(Vector3.up * Time.deltaTime * SpeedBracking * 2);
        //}
 
        if (LeftOar.transform.localScale.x > _maxScaleX) // <------------
        {
            transform.Rotate(Vector3.up * Time.deltaTime * _breakMultiply); // <------------
            rightveslo = true;
        }
 
        if (rightveslo)
        {
            transform.Rotate(Vector3.up * Time.deltaTime * SpeedBracking * _breakMultiply);// <------------
        }
    }
    
}


Касательно инспектора в Unity. Часто делают все публичные поля, лишь бы их было видно в инспекторе. Хотя большинство полей должны быть приватными (по логике класса).
Кликните здесь для просмотра всего текста
Если вы хотите наблюдать за поведением приватных полей в инспекторе и изменять их для разных тестов, то можете временно установить перед ним специальный атрибут, который будет показывать эти приватные поля, например:
C#
1
2
3
4
5
6
7
8
public class Test : MonoBehaviour
{
    [SerializeField]
    private float _someNumber;
 
    [SerializeField]
    private bool _isMove;
}
Если вы не хотите просто увидеть ВСЕ приватные поля класса, то установите инспектор с режима Normal в режим Debug, тогда будет видно всё стразу, без необходимости печатать возле каждого поля атрибут. Изменить режим инспектора можно - кликнув по иконке в самом верхнем правом углу инспектора (там ещё есть маленькая иконка замочка).


Например ещё часто делают публичное поле для GameObject-а, только для того, чтобы потом в классе "вытащить" из него один компонент. Например у вас это был объект Player, хотя по сути, вам нужен был только компонент (FirstPersonAIO) из этого объекта и всё. И глядя на инспектор, где есть поле для GameObject-а, совсем не факт, что туда нужно переместить объект именно с компонентом FirstPersonAIO.
Решение очень простое, вы делаете публичное FirstPersonAIO поле, а в инспектор всё так же перетащите ваш объект со сцены, на котором есть этот компонент, и тогда поле автоматически заполниться именно ссылкой на FirstPersonAIO.

Так же, нет смысла делать публичные поля для GameObject-ов, если вы будете пользоваться только их трансформом. У вас это были вёсла. Делайте поля Transform, и у вас будет стразу ссылка на нужный вам компонент.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test : MonoBehaviour
{
    //public GameObject Player;
    public FirstPersonAIO Player;//Персонаж
 
    //public GameObject LeftOar;
    public Transform LeftOar;//Левое весло
 
    private void Update()
    {
        //Player.GetComponent<FirstPersonAIO>().walkSpeed = 3;
        Player.walkSpeed = 3;
 
        //LeftOar.transform.localScale = Vector3.one;
        LeftOar.localScale = Vector3.one;
    }
}


Ещё много чего можно сказать, но вы сами всё узнаете со временем.
Если применить некоторые их этих советов на ваш код, то он выглядит примерно так, но это не обязательно, скорее просто для наглядности:
Кликните здесь для просмотра всего текста
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using UnityEngine;
 
public class Swimming : MonoBehaviour
{
    public FirstPersonAIO Player;//Персонаж
    public Transform LeftOar;//Левое весло
    public Transform RightOar;//Правое весло
    public Animator OarsAnimator;//Вёсла
    [Space]
 
    public bool canGo;//Булевая возможности хода
    public float speed;//Скорость
    [Space]
 
    // торможения
    private bool _isRightVesloBreaking;//Торможение по правому веслу
    private bool _isLefttVesloBreaking;//Торможение по левому веслу
    private float _speedBraking = 0.998f;//Коэффицент торможения
 
    private float _brakingOne;//Торможение по линии вправо
    private float _brakingTwo;//Торможение по линии влево
    private float _braking;//Торможение по линии хода
 
    // булевы движения
    private bool _isRightRotate;//Булевая поворота вправо
    private bool _isLeftRotate;//Булевая поворота влево
    private bool _isMove;//Булевая хода
 
    // хеши имён клипов
    private int _oarsMoveRightHash;
    private int _oarsMoveLeftHash;
    private int _oarsMoveHash;
 
    // магические числа
    private int _playerNormalSpeed = 4;
    private float _maxOarScaleX = 1.50045f;
    private float _rotateMultiply = 2f;
 
    void Start()
    {
        canGo = false;
        _brakingOne = 0;
        _brakingTwo = 0;
        _braking = 0;
 
        _isRightRotate = false;
        _isLeftRotate = false;
 
        _oarsMoveRightHash = Animator.StringToHash("MoveRight");
        _oarsMoveLeftHash = Animator.StringToHash("MoveLeft");
        _oarsMoveHash = Animator.StringToHash("Move");
    }
    void Update()
    {
        // коррекция торможения
        if (_braking < 0.1f) _braking = 0f;
        if (_brakingOne < 0.1f) _brakingOne = 0f;
        if (_brakingTwo < 0.1f) _brakingTwo = 0f;
 
 
        if (canGo)//Если ход возможен
        {
            Player.walkSpeed = 0;//Обнуление скорости персонажа
 
            if (Input.GetKey(KeyCode.UpArrow) && _isLeftRotate == false && _isRightRotate == false)//Если нажата стрелка вверх
            {
                oarsRightLeftMoveEnableOnly(_oarsMoveHash); // вкочить только анимацию хода
 
                if (RightOar.localScale.x > _maxOarScaleX)//Если размер весла больше числа
                {
                    _isMove = true;//Булевая хода активна
                }
            }
            else//Иначе
            {
                OarsAnimator.SetBool(_oarsMoveHash, false);//Анимация хода прекращена
                _isMove = false;//Булевая хода деактивирована
            }
 
 
            if (Input.GetKey(KeyCode.RightArrow) && _isLeftRotate == false && _isMove == false)//Если нажата стрелка вправо
            {
                _isRightRotate = true;
                _brakingOne = 1f;
                LeftMove();//Активировать метод гребли вправо
            }
            else
            {
                _isRightRotate = false;
                _isRightVesloBreaking = false;
                _brakingOne = _brakingOne * _speedBraking;//Торможение поворота вправо * Торможение
                transform.Rotate(Vector3.up * Time.deltaTime * _brakingOne * _rotateMultiply);////Поворот вправо * торможение поворота вправо * _rotateMultiply
                OarsAnimator.SetBool(_oarsMoveLeftHash, false);//Анимация поворота вправо прекращена
            }
 
 
            if (Input.GetKey(KeyCode.LeftArrow) && _isRightRotate == false && _isMove == false)//Если нажата стрелка влево
            {
                _isLeftRotate = true;
                _brakingTwo = 1f;
                RightMove();//Активировать метод гребли влево
            }
            else//Иначе
            {
                _isLeftRotate = false;
                OarsAnimator.SetBool(_oarsMoveRightHash, false);////Анимация поворота влево прекращена
                _brakingTwo = _brakingTwo * _speedBraking;//Торможение поворота влево * торможение
                transform.Rotate(Vector3.down * Time.deltaTime * _brakingTwo * _rotateMultiply);////Поворот вправо * торможение поворота вправо * _rotateMultiply
            }
 
            if (_isMove)//Если ход активен
            {
                _braking = 1f;
                transform.Translate(Vector3.right * Time.deltaTime * speed);//Перемещение объекта * скорость
            }
            else//Иначе
            {
                _braking = _braking * _speedBraking;//Торможение хода * торможение
                transform.Translate(Vector3.right * Time.deltaTime * _braking);//Перемещение объекта * торможение
            }
        }
        else//Иначе
        {
            Player.walkSpeed = _playerNormalSpeed;//Скорость персонажа = 4
        }
    }
 
    void LeftMove()
    {
 
        oarsRightLeftMoveEnableOnly(_oarsMoveLeftHash); // включить только анимацию поворота влево
 
        if (LeftOar.localScale.x > _maxOarScaleX)// Если размер объекта по х > числа
        {
            transform.Rotate(Vector3.up * Time.deltaTime * _rotateMultiply);//Поворот объекта вправо * _rotateMultiply
            _isRightVesloBreaking = true;
        }
 
        if (_isRightVesloBreaking)
        {
            transform.Rotate(Vector3.up * Time.deltaTime * _speedBraking * _rotateMultiply);//Поворот объекта вправо * торможение * _rotateMultiply
        }
 
    }
    void RightMove()
    {
 
        oarsRightLeftMoveEnableOnly(_oarsMoveRightHash); // включить только анимацию поворота вправо
 
        if (RightOar.localScale.x > _maxOarScaleX)// Если размер объекта по х > числа
        {
            transform.Rotate(Vector3.down * Time.deltaTime * _rotateMultiply);//Поворот объекта влево * _rotateMultiply
            _isLefttVesloBreaking = true;
        }
        if (_isLefttVesloBreaking)
        {
            transform.Rotate(Vector3.down * Time.deltaTime * _speedBraking * _rotateMultiply);//Поворот объекта влево * торможение * _rotateMultiply
        }
    }
 
    // оставляет "включённым" только один из трёх параметров 
    private void oarsRightLeftMoveEnableOnly(int rightLeftMoveHash)
    {
        OarsAnimator.SetBool(_oarsMoveRightHash, false);
        OarsAnimator.SetBool(_oarsMoveLeftHash, false);
        OarsAnimator.SetBool(_oarsMoveHash, false);
 
        OarsAnimator.SetBool(rightLeftMoveHash, true);
    }
}
5
 Аватар для MrFelix
75 / 53 / 25
Регистрация: 08.03.2020
Сообщений: 243
16.04.2020, 19:54
samana,
Private переменные вначале ставится нижнее подчёркивание
Public переменные всегда идут без нижнего подчёркивания
Компоненты и GameObjects не зависимо от public или private с большой буквы

Я правильно понял?

Это правило хорошего тона в коде или есть какие-то рекомендации в книгах по оформлению кода или почему вообще именно так?
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
16.04.2020, 20:04
Лучший ответ Сообщение было отмечено EgorCol1 как решение

Решение

Цитата Сообщение от MrFelix Посмотреть сообщение
Это правило хорошего тона в коде или есть какие-то рекомендации в книгах по оформлению кода или почему вообще именно так?
Где-то есть принятые соглашения по C#, но я их не искал в сети. И не всегда я использую.
Например мне неудобно называть публичные поля и методы с заглавной буквы, вот просто неудобно и всё..
А приватные привык уже с нижнего подчёркивания начинать, так нагляднее в коде и сразу понятно чем я манипулирую. Хотя по соглашению, если не ошибаюсь, то там должен быть префикс _m.
Ещё частенько могу писать this, перед публичными полями/свойствами, тоже чисто для себя, для наглядности.

Цитата Сообщение от MrFelix Посмотреть сообщение
Компоненты и GameObjects не зависимо от public или private с большой буквы
Я не знаю, как правильно это делают. Но я не обращаю внимания, компонент это или GameObject, ведь это просто поле и мне важно публичное оно или приватное, исходя из этого и называю их по-разному. Приватные с маленькой буквы и _ вначале, а публичные тоже с маленькой, но без _ .
1
 Аватар для squakoon
68 / 48 / 20
Регистрация: 09.10.2013
Сообщений: 156
16.04.2020, 20:35
Вставлю свои пять копеек для MrFelix.

В самых популярных и, возможно, широко используемых практиках, насколько мне известно, используют следующий принцип: публичные поля любого типа именуются с заглавной буквы, а приватные начинаются с символа подчеркивания и последующим началом с прописной буквы.
Бытуют также взгляды (которые лично я полностью разделяю), что венгерская нотация, которая была упомянута в предыдущем ответе — не очень удачная практика именования.

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

Всегда можно нагуглить популярные соглашения по кодСтайлу и книги известных авторов, где все по полочкам растолковывается. Также полезно иногда смотреть код из открытых репозиториев авторитетных разработчиков.
1
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 45
16.04.2020, 21:26  [ТС]
Благодарю за столь подробный ответ! Я обязательно приму всё к сведению, и постараюсь нормализовать свой код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2020, 21:26
Помогаю со студенческими работами здесь

Найти наибольшую возможную длину плота из заданного количества бревен
Здравствуйте. Задача не проходит 1 тест. Результаты. Условие: Использовав N деревянных бревен длиной L i (i = 1..N) нужно...

На плот прыгает человек. Какой будет общая скорость плота и человека?
На плот массой 100 кг, имеющий скорость 1м/с, направленную вдоль реки, прыгает человек массой 50кг со скоростью 1,5 м/с перпендикулярно к...

Определить, к какой стороне или к какому углу плота пловец доплывёт быстрее всего
Степан летом отдыхает у бабушки в деревне. Особенно ему нравится купаться на сельском озере. Посредине озера плавает плот, который имеет...

Определить, к какой стороне или к какому углу плота пловец доплывёт быстрее всего
Посередине озера плавает плот, имеющий форму прямоугольника. Стороны плота направлены вдоль параллелей и меридианов. Введём систему...

С какой наименьшей скоростью и под каким углом относительно воды должен прыгнуть человек вдоль плота
Плот массой 150 кг и длиной 2 м плавает на воде. На плоту находится человек массой 80 кг. С какой наименьшей скоростью и под каким (в°)...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru