-
-
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); | |
} | |
} |
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали подсосы адепты Сакутина.
Кроме каких-то микрооптимизаций - я ничего не вижу в комментах.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали
подсосыадепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.
Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл
Хауди, не юли, говнокод так говнокод, чего этого стесняться? Не твой фанат и не фанат Сакутина, критик из него тот еще, но говорит в общем-то по делу.
Прикол в том, что говнокода тут нет, просто в комменты набежали
подсосыадепты Сакутина.
Объективно кроме каких-то микрооптимизаций я ничего не вижу.
Может ты скажешь, почему код в гисте - г@вно?) Только без токсичности, а объективно.Объективно, вполне нормальный код, средненького такого джуна - не без изъянов, но он работает, задачу выполняет, для прототипа какой-нибудь гиперказуалки, попробовать и выкинуть сойдет. А ошибки классические для всех джунов - все завязано на мертвый узел; вызов методов по строке, которые изначально были заложены как костыль, хотя есть аналоги с константами; ну и с алгоритмами беда;кодстайл
Если ты про литерал "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!
Жаль, что кроме фраз "это говнокод" нет никакой нормальной аргументации.
А про форки с "не говнокодом" я уже молчу :3
Мда.