Skip to content

Instantly share code, notes, and snippets.

@Priler
Last active November 15, 2021 12:45
Show Gist options
  • Save Priler/03d7fe1893f179c9e23b632578ff87c3 to your computer and use it in GitHub Desktop.
Save Priler/03d7fe1893f179c9e23b632578ff87c3 to your computer and use it in GitHub Desktop.
CubeController.cs
using UnityEditor;
using UnityEngine;
using DG.Tweening;
/// <summary>
/// Attribute to select a single layer.
/// </summary>
public class LayerAttribute : PropertyAttribute
{}
[CustomPropertyDrawer(typeof(LayerAttribute))]
class LayerAttributeEditor : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
property.intValue = EditorGUI.LayerField(position, label, property.intValue);
}
}
[RequireComponent(typeof(Rigidbody))]
public class CubeController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 15f; // cube movement speed, applied to Rigidbody.MovePosition
[SerializeField] private float jumpForce = 30f; // cube jump force, applied to Rigidbody.AddForce
[SerializeField] private float fallMultiplier = 10f; // determinates fall gravity multiplier (how fast a cube will fall after jump)
[SerializeField, Layer] int groundLayer = 0; // ground layer selector (instead of tags? :3)
[SerializeField, Range(1, 360)] private int spinAnimationAngle = 180; // (DG.Tweening) DORotate target angle
[SerializeField, Range(0.1f, 1.0f)] private float spinAnimationTime = 0.75f; // (DG.Tweening) DORotate target animation time
private Rigidbody _rb;
private bool _doJump = false; // used to transfer input from Update into FixedUpdate
private bool _isJumping = false; // determinates if a cube is currently jumping or not
void Awake()
{
_rb = transform.GetComponent <Rigidbody>();
}
void Update() {
// Unity built-in Input Manager
if(Input.GetButtonDown("Jump") && !_isJumping) {
Jump();
}
}
// FixedUpdate is called once per Fixed Timestep (50 times/second default)
void FixedUpdate()
{
// move the cube forward
Vector3 moveVector = Vector3.forward * moveSpeed * Time.deltaTime;
_rb.MovePosition(transform.position + moveVector);
// check for a jump input
if(_doJump) {
_rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
_doJump = false;
}
// Gravity fall multiplier
_rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
void OnCollisionEnter(Collision collision) {
// CompareTag is alot performant than equality-operator or TryGetComponent
// but still, it is much faster to use layers :3
// (if you interested in such micro optimization)
if(collision.gameObject.layer == groundLayer) {
if(Input.GetButton("Jump") && _isJumping) {
// Bunny Hop
Jump();
} else if(_isJumping) {
_isJumping = false;
}
}
}
void Jump() {
_doJump = true; // set flag for FixedUpdate
_isJumping = true; // set jump status
// some cool DG stuff :]
transform.DOComplete();
transform.DOShakeScale(.5f, .5f, 3, 30);
transform.DORotate(new Vector3(spinAnimationAngle, 0, 0), spinAnimationTime, RotateMode.LocalAxisAdd).SetRelative(true);
}
}
@sunnamed434
Copy link

Hello Abraham, dont worry about your self, Roman is idiot, no reason to look to Roman he is Unity Noob Developer. But, why Jump Controller? Roman has really good video about this.

Best wishes,
Konstantin

@Lekret
Copy link

Lekret commented Jul 30, 2021

Огромный контроллер, который делает всё. Никакой декомпозиции и разделения ответственностей.
Плохой подход с использованием физики (то о чём говорил Рома), вместо математики.
Весь код в больших стандартный методах, что плохо читаемо и ещё хуже понимаемо. Нужно делать маленькие методы с правильными именами, и тогда это можно будет легко прочесть и понять.
Использование тэгов это плохая практика, нужно делать проверку на компонент.
Нажатие, который читается в OnCollisionEnter иногда будет теряться, потому что этот метод срабатывает во время FixedUpdate (если я не ошибся).
Код-стайл а-ля любой язык, кроме C#, со скобочками {} на уровне определения метода.

Посредственный код джуна у которого месяц опыта, зато везде пишет, какой он профессионал.

@Kosty177
Copy link

Если честно, помню как сам писал что-то похоже года 2 назад, когда только начинал работать с Unity.
Если честно, код ужасен, с таким кодом ты даже собеседование на Джуна не пройдёшь.
Кстати, во всех старых играх используется метод Романа с кривой, даже в Марио))
Ну и кстати, если тебя смотрит в 200 раз больше школьников, чем Романа, это ещё не говорит что ты хороший программист))

@kolebynov
Copy link

It's the best code that I've ever seen. You're god.

@sogorich
Copy link

@undrcrxwn
Copy link

хауди топ сакутин лох ставь лайк если согласен посмотрим сколько нас

@krammnic
Copy link

https://qna.habr.com/q/1019492 This habr habr question has written at 15 july and this repo has created erlier!

@Marefo
Copy link

Marefo commented Jul 30, 2021

Не совсем уместно сравнивать просмотры человека, который показывает основы многих областей ИТ и узко направленный канал, который раскрывает тематики в границах одной сферы, но глубже. (думаю ты как опытный ютубер должен это понимать)

И также, если человек показывает реализацию лучше чем в твоих видео это еще не значит что он твой фанат. У него есть своя аудитория, которая просит сделать обзор кода того или иного программиста.

@nilpunch
Copy link

Господь, для чего ты пушишь флаг _doJump, чтобы потом его каждое обновление физики пулить в FixedUpdate чтобы сделать одно действите и сбросить флаг? Почему нельзя просто сделать это действие в тот момент, как флаг устанавливается? Тогда и флаг отпадает, и проверки уходят, код становится меньше и проще и убирается флаг с непонятным названием из-за дурацкого контекстом работы. Он даже называется как метод - DoJump. Так может он и должен быть методом?

Если ты не можешь принимать конструктивную критику (а ты себя выдаешь за профессионала), то это твои проблемы, а не критикующих. Роман против ввода в заблуждения своей аудитории, тем более что она у тебя большая. Если все начинающие программисты будут равняться на тебя, считая тебя профессионалом, то так и продолжат плодиться никому не нужные некомпетентные кадры. Ты делаешь развлекательный контент, не лезь в индустрию

@Priler
Copy link
Author

Priler commented Jul 30, 2021

  1. Код мой и взят из игры по GD3D, по ссылке с хабра - только формула fall multiplier совпадает, но я и не говорил - что сам её придумал (на то она и формула), этому я научился из урока
  2. Также из игры постанул код камеры - https://gist.github.com/Priler/c1e0b661674e41e83d07635257d8f5b6
  3. И наконец по самому коду, я вроде не говорил - что он максимально короткий и идеальный, но свою задачу выполняет, а др@#ить на длину кода и кодстайл смысла не вижу

@Carhvax
Copy link

Carhvax commented Jul 30, 2021

Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.

@vovannn271
Copy link

блин чего они пристали-то.... чел реально просто тебя оскорбляет ради просмотров, пофиг на код вообще.

@egorIndsutriesLive
Copy link

Я только начал изучать C# и Unity. В процессе делаю игру и возьму-ка этот код. Конечно с моим Говнокодом не сравнимо. Вот ищу способ как сделать нормальное управление на смартфоне. ХАУДИ СПАСИБО ЗА ПРЫЖОК.а Когда научусь буду использовать эти кривые.

@0x59R11
Copy link

0x59R11 commented Jul 30, 2021

Я только начал изучать C# и Unity. В процессе делаю игру и возьму-ка этот код. Конечно с моим Говнокодом не сравнимо. Вот ищу способ как сделать нормальное управление на смартфоне. ХАУДИ СПАСИБО ЗА ПРЫЖОК.а Когда научусь буду использовать эти кривые.

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

@Priler
Copy link
Author

Priler commented Jul 31, 2021

Жаль, что кроме фраз "это говнокод" нет никакой нормальной аргументации.
А про форки с "не говнокодом" я уже молчу :3
Мда.

@Priler
Copy link
Author

Priler commented Aug 2, 2021

Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.

Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Кроме каких-то микрооптимизаций - я ничего не вижу в комментах.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.

@Carhvax
Copy link

Carhvax commented Aug 2, 2021

Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.

Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.

Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл

@Priler
Copy link
Author

Priler commented Aug 2, 2021

Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.

Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.

Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл

Если ты про литерал "Jump" в коде, то это инпут система в Unity.
А вот константы вроде KeyCode.Space, я наоборот - считаю плохой практикой, ибо хардкод.
Кодстайл - что именно? Не считая раскидывания по файлам, тут изначально планировался контроллер на полное управление кубом в казуалке.

@brend32
Copy link

brend32 commented Aug 2, 2021

Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.

Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.

Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл

Если ты про литерал "Jump" в коде, то это инпут система в Unity.
А вот константы вроде KeyCode.Space, я наоборот - считаю плохой практикой, ибо хардкод.
Кодстайл - что именно? Не считая раскидывания по файлам, тут изначально планировался контроллер на полное управление кубом в казуалке.

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

К названию скрипта можно придраться. Типа CubeController. Его только на Куб можно повесить? А если на Сферу повесить? То, что код сломается?
Ещё не понятно за какие механики отвечает скрипт. Чтобы это узнать нужно код читать. И то, это не гарантирует успех.

@Priler
Copy link
Author

Priler commented Aug 2, 2021

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

Не хардкоР, а хардкоД (выражение есть такое "захардкожено") ... это когда в код забит инпут, например, и его можно поменять только отредактировав код.
А в данном случае, "Jump" и его бинды редактируются как из панельки Input Manager в Unity, так и пользователем при запуске игры.

К названию скрипта можно придраться. Типа CubeController. Его только на Куб можно повесить? А если на Сферу повесить? То, что код сломается?

По идее, он сделан именно для управления кубом, да.
Так как писался для игры по Geometry Dash (3D версия).
На сфере код не сломается, но код не универсален и взят из контекста одной конкретной игры.
По желанию его, конечно же, можно свободно перенести и в другую игру - где есть кубик которым нужно управлять схожим образом.

Ещё не понятно за какие механики отвечает скрипт. Чтобы это узнать нужно код читать. И то, это не гарантирует успех.

По названию вполне понятно, что это контроллер для управления чем-то (кубом игрока, в данном случае).
Чтобы было еще понятнее, нужно больше комментариев и в идеале документация.
Но это здесь не требуется.

@Priler
Copy link
Author

Priler commented Aug 2, 2021

Hello Abraham, dont worry about your self, Roman is idiot, no reason to look to Roman he is Unity Noob Developer. But, why Jump Controller? Roman has really good video about this.

Best wishes,
Konstantin

Yeah, just renamed the file to "CubeController", makes more sense.
Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment