-
-
Save Priler/03d7fe1893f179c9e23b632578ff87c3 to your computer and use it in GitHub Desktop.
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); | |
} | |
} |
It's the best code that I've ever seen. You're god.
https://qna.habr.com/q/1019492
No comments.
хауди топ сакутин лох ставь лайк если согласен посмотрим сколько нас
https://qna.habr.com/q/1019492 This habr habr question has written at 15 july and this repo has created erlier!
Не совсем уместно сравнивать просмотры человека, который показывает основы многих областей ИТ и узко направленный канал, который раскрывает тематики в границах одной сферы, но глубже. (думаю ты как опытный ютубер должен это понимать)
И также, если человек показывает реализацию лучше чем в твоих видео это еще не значит что он твой фанат. У него есть своя аудитория, которая просит сделать обзор кода того или иного программиста.
Господь, для чего ты пушишь флаг _doJump, чтобы потом его каждое обновление физики пулить в FixedUpdate чтобы сделать одно действите и сбросить флаг? Почему нельзя просто сделать это действие в тот момент, как флаг устанавливается? Тогда и флаг отпадает, и проверки уходят, код становится меньше и проще и убирается флаг с непонятным названием из-за дурацкого контекстом работы. Он даже называется как метод - DoJump. Так может он и должен быть методом?
Если ты не можешь принимать конструктивную критику (а ты себя выдаешь за профессионала), то это твои проблемы, а не критикующих. Роман против ввода в заблуждения своей аудитории, тем более что она у тебя большая. Если все начинающие программисты будут равняться на тебя, считая тебя профессионалом, то так и продолжат плодиться никому не нужные некомпетентные кадры. Ты делаешь развлекательный контент, не лезь в индустрию
- Код мой и взят из игры по GD3D, по ссылке с хабра - только формула fall multiplier совпадает, но я и не говорил - что сам её придумал (на то она и формула), этому я научился из урока
- Также из игры постанул код камеры - https://gist.github.com/Priler/c1e0b661674e41e83d07635257d8f5b6
- И наконец по самому коду, я вроде не говорил - что он максимально короткий и идеальный, но свою задачу выполняет, а др@#ить на длину кода и кодстайл смысла не вижу
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
блин чего они пристали-то.... чел реально просто тебя оскорбляет ради просмотров, пофиг на код вообще.
Я только начал изучать C# и Unity. В процессе делаю игру и возьму-ка этот код. Конечно с моим Говнокодом не сравнимо. Вот ищу способ как сделать нормальное управление на смартфоне. ХАУДИ СПАСИБО ЗА ПРЫЖОК.а Когда научусь буду использовать эти кривые.
Я только начал изучать C# и Unity. В процессе делаю игру и возьму-ка этот код. Конечно с моим Говнокодом не сравнимо. Вот ищу способ как сделать нормальное управление на смартфоне. ХАУДИ СПАСИБО ЗА ПРЫЖОК.а Когда научусь буду использовать эти кривые.
Что научишься? переписывать код, если уже на то пошло тогда лучше использовать более лучший код, и я бы не сказал что в коде Романа что-то сложное в плане кода..
Жаль, что кроме фраз "это говнокод" нет никакой нормальной аргументации.
А про форки с "не говнокодом" я уже молчу :3
Мда.
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Кроме каких-то микрооптимизаций - я ничего не вижу в комментах.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали
подсосыадепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.
Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали
подсосыадепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл
Если ты про литерал "Jump" в коде, то это инпут система в Unity.
А вот константы вроде KeyCode.Space, я наоборот - считаю плохой практикой, ибо хардкод.
Кодстайл - что именно? Не считая раскидывания по файлам, тут изначально планировался контроллер на полное управление кубом в казуалке.
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали
подсосыадепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл
Если ты про литерал "Jump" в коде, то это инпут система в Unity.
А вот константы вроде KeyCode.Space, я наоборот - считаю плохой практикой, ибо хардкод.
Кодстайл - что именно? Не считая раскидывания по файлам, тут изначально планировался контроллер на полное управление кубом в казуалке.
Хардкор это когда ты ошибся в написании строкового литерала и потом сидишь гадаешь, где оно произошло.
Ну и строковые литералы не поддерживают функцию поиска всех ссылок. И когда нужно будет найти классы где логика завязана на этом литерале, вряд-ли получится быстро это сделать.
К названию скрипта можно придраться. Типа CubeController. Его только на Куб можно повесить? А если на Сферу повесить? То, что код сломается?
Ещё не понятно за какие механики отвечает скрипт. Чтобы это узнать нужно код читать. И то, это не гарантирует успех.
Хардкор это когда ты ошибся в написании строкового литерала и потом сидишь гадаешь, где оно произошло.
Ну и строковые литералы не поддерживают функцию поиска всех ссылок. И когда нужно будет найти классы где логика завязана на этом литерале, вряд-ли получится быстро это сделать.
Не хардкоР, а хардкоД (выражение есть такое "захардкожено") ... это когда в код забит инпут, например, и его можно поменять только отредактировав код.
А в данном случае, "Jump" и его бинды редактируются как из панельки Input Manager в Unity, так и пользователем при запуске игры.
К названию скрипта можно придраться. Типа CubeController. Его только на Куб можно повесить? А если на Сферу повесить? То, что код сломается?
По идее, он сделан именно для управления кубом, да.
Так как писался для игры по Geometry Dash (3D версия).
На сфере код не сломается, но код не универсален и взят из контекста одной конкретной игры.
По желанию его, конечно же, можно свободно перенести и в другую игру - где есть кубик которым нужно управлять схожим образом.
Ещё не понятно за какие механики отвечает скрипт. Чтобы это узнать нужно код читать. И то, это не гарантирует успех.
По названию вполне понятно, что это контроллер для управления чем-то (кубом игрока, в данном случае).
Чтобы было еще понятнее, нужно больше комментариев и в идеале документация.
Но это здесь не требуется.
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!
Если честно, помню как сам писал что-то похоже года 2 назад, когда только начинал работать с Unity.
Если честно, код ужасен, с таким кодом ты даже собеседование на Джуна не пройдёшь.
Кстати, во всех старых играх используется метод Романа с кривой, даже в Марио))
Ну и кстати, если тебя смотрит в 200 раз больше школьников, чем Романа, это ещё не говорит что ты хороший программист))