Skip to content

Instantly share code, notes, and snippets.

@HolyMonkey
Forked from Priler/CubeController.cs
Last active August 7, 2021 04:22
Show Gist options
  • Save HolyMonkey/910a23147ef6a41e3aaffa278c2123f3 to your computer and use it in GitHub Desktop.
Save HolyMonkey/910a23147ef6a41e3aaffa278c2123f3 to your computer and use it in GitHub Desktop.
JumpManager.cs
using UnityEngine;
//Внезапно хауди списывая код с уроков забыл послушать что он означал
//В конечном итоге у него получился просто постоянный скейлинг гравитации
[RequireComponent(typeof(Rigidbody))]
class GravityScale : MonoBehaviour
{
[SerializeField] private float _scale = 10f;
private Rigidbody _self;
private void Awake()
{
_self = transform.GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
_self.velocity += Physics.gravity * (_scale - 1) * Time.deltaTime;
}
}
using UnityEngine;
class Ground : MonoBehaviour { }
using UnityEngine;
//Если делаешь GetComponent не забывай про RequireComponent
[RequireComponent(typeof(Rigidbody))]
public class Jump : MonoBehaviour
{
[SerializeField] private float _force; //Jump - Force. А не Jump.JumpForce.
private Rigidbody _self;
private bool _jumping;
private void Awake()
{
_self = transform.GetComponent<Rigidbody>();
}
private void Update()
{
//нет ничего страшного в придание импульса в Update, применится он всё равно в FixedUpdate
if (Input.GetKeyDown(KeyCode.Space)) //Использовать строквые литералы в коде плохая идея
TryJump();
}
private void OnCollisionEnter(Collision collision)
{
//В целом идея проверять нахождение на земле через коллизии способ плохой
//Но реализовать его можно гораздо лучше, например сделав проверку по наличию компонента а не тега
if (collision.gameObject.TryGetComponent(out Ground ground))
_jumping = false;
}
private void TryJump()
{
if (_jumping)
return;
_self.AddForce(Vector3.up * _force, ForceMode.Impulse);
_jumping = true;
}
}
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
class Movement : MonoBehaviour
{
[SerializeField] private float _unitsPerSecond = 15f;
private Rigidbody _self;
private void Awake()
{
_self = transform.GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Vector3 offset = transform.forward * _unitsPerSecond * Time.deltaTime;
_self.MovePosition(transform.position + offset);
}
}
@nilpunch
Copy link

nilpunch commented Aug 1, 2021

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

@Emanx140
Copy link

Emanx140 commented Aug 2, 2021

Да, в 10 раз лучше выглядит.
Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

@nilpunch
Copy link

nilpunch commented Aug 2, 2021

Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

Нет, не нужно. Во время обновления цикла FixedUpdate вместо Time.deltaTime движок подставляет Time.fixedDeltaTime

@Emanx140
Copy link

Emanx140 commented Aug 2, 2021

Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

Нет, не нужно. Во время обновления цикла FixedUpdate вместо Time.deltaTime движок подставляет Time.fixedDeltaTime

Спасибо! Будем знать :)

@RoBit666
Copy link

RoBit666 commented Aug 2, 2021

Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

Нет, не нужно. Во время обновления цикла FixedUpdate вместо Time.deltaTime движок подставляет Time.fixedDeltaTime

Не слышал про подобное, можно пруфы?)

@Emanx140
Copy link

Emanx140 commented Aug 2, 2021

Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

Нет, не нужно. Во время обновления цикла FixedUpdate вместо Time.deltaTime движок подставляет Time.fixedDeltaTime

Не слышал про подобное, можно пруфы?)

https://docs.unity3d.com/2018.4/Documentation/ScriptReference/Time-fixedDeltaTime.html
Только выбери версию 2018.4. В новой документации почему-то убрано пояснение.
Еще я проверил в версии 2021 и действительно Time.deltaTime и Time.fixedDeltaTime в FixedUpdate выдает одно и то же время.

@Priler
Copy link

Priler commented Aug 2, 2021

Форчанский появился, ща взглянем )

  1. TryGetComponent на твоем месте я бы по рукам бил за любое использование GetComponent вне Start/Awake.
    И кстати, проверка по слоям работает быстрее этого варианта (примерно в 2 раза).

  2. KeyCode.Space - хардкод, круто )
    Чтобы поменять инпут - придется менять скрипт, браво!
    А это, игроку чтоб поменять бинд - надо декомпилировать игру? :]
    А вообще уже давно есть New Input System.

  3. AddForce в Update, тоже надо по рукам бить за такое.
    Он то может и выполнится нормально, но там очень много но.
    Вообще это Bad Practice писать так код.

  4. Булевы переменные лучше именовать с префиксами "is", "has", "can" (в данном случае оно "adds value" как раз, если что)
    Это рекомендация Microsoft Naming Convention

  5. _self. Конечно это не Python, а C#. Но здесь есть ключевое слово this. Мягко говоря, это не нарушение. Но имхо условный _rb смотрелся бы лучше и был более понятным.

  6. Файлик контроллера лучше называть с постфиксом Controller.
    Например, JumpController, MovementController и т.д.
    Почитай, дружок пирожок.

@RoBit666
Copy link

RoBit666 commented Aug 2, 2021

Только в FixedUpdate вместо Time.deltaTime надо использовать Time.fixedDeltaTime

Нет, не нужно. Во время обновления цикла FixedUpdate вместо Time.deltaTime движок подставляет Time.fixedDeltaTime

Не слышал про подобное, можно пруфы?)

https://docs.unity3d.com/2018.4/Documentation/ScriptReference/Time-fixedDeltaTime.html
Только выбери версию 2018.4. В новой документации почему-то убрано пояснение.
Еще я проверил в версии 2021 и действительно Time.deltaTime и Time.fixedDeltaTime в FixedUpdate выдает одно и то же время.

Видимо из-за timescale это было. В ранних версиях небыло fixedUnscaledDeltaTime

@brend32
Copy link

brend32 commented Aug 2, 2021

  1. TryGetComponent на твоем месте я бы по рукам бил за любое использование GetComponent вне Start/Awake.
    И кстати, проверка по слоям работает быстрее этого варианта (примерно в 2 раза).

Не актуально в данной ситуации. Разницы в производительности не будет (оно появляется только в случаях вызова несколько сотен тысяч раз за обновление). TryGetComponent намного удобней использовать если потом нужно производить какую либо логию со столкнувшимся объектом.

  1. KeyCode.Space - хардкод, круто )

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.
Лучше вывести в константу значение литерала и потом использовать её.

  1. AddForce в Update, тоже надо по рукам бить за такое.

На этот случай распространяется НО. Плохо вызывать физические функции слишком много раз (не важно в Update или FixedUpdate). Так как Update вызывается много раз за секунду (в зависимости от фреймрейта), то это лишние вызовы физики.

  1. Булевы переменные лучше именовать с префиксами "is", "has", "can".
    Это рекомендация Microsoft Naming Convention

Там написано:

DO name Boolean properties with an affirmative phrase (CanSeek instead of CantSeek). Optionally, you can also prefix Boolean properties with "Is", "Can", or "Has", but only where it adds value.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

@RoBit666
Copy link

RoBit666 commented Aug 2, 2021

Форчанский появился, ща взглянем )

  1. TryGetComponent на твоем месте я бы по рукам бил за любое использование GetComponent вне Start/Awake.
    И кстати, проверка по слоям работает быстрее этого варианта (примерно в 2 раза).
  2. KeyCode.Space - хардкод, круто )
    Чтобы поменять инпут - придется менять скрипт, браво!
    А это, игроку чтоб поменять бинд - надо декомпилировать игру? :]
    А вообще уже давно есть New Input System.
  3. AddForce в Update, тоже надо по рукам бить за такое.
    Он то может и выполнится нормально, но там очень много но.
    Вообще это Bad Practice писать так код.
  4. Булевы переменные лучше именовать с префиксами "is", "has", "can" (в данном случае оно "adds value" как раз, если что)
    Это рекомендация Microsoft Naming Convention
  5. _self. Конечно это не Python, а C#. Но здесь есть ключевое слово this. Мягко говоря, это не нарушение. Но имхо условный _rb смотрелся бы лучше и был более понятным.
  1. Что _self что _rb полная херня. Оба не понятно что обозначают. Rigid Body имеет не такое длинное название чтобы его не написать как _rigidBody.

@Priler
Copy link

Priler commented Aug 2, 2021

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

@HolyMonkey
Copy link
Author

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

Какую смысловую нагрузку добавит is к названию jumping?

@HolyMonkey
Copy link
Author

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

Целые научные работы пишутся про опечатки в коде а тема статического анализа одна из важнейших в программирование.

Но к чему это, если ты точно никогда не ошибёшься. ;)

@devID767
Copy link

devID767 commented Aug 2, 2021

  1. AddForce в Update, тоже надо по рукам бить за такое.
    Он то может и выполнится нормально, но там очень много но.
    Вообще это Bad Practice писать так код.

А как правильно реализовать данный пункт?

@Priler
Copy link

Priler commented Aug 2, 2021

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

Какую смысловую нагрузку добавит is к названию jumping?

Судя по тому, что ты пишешь комментарии в коде на русском языке (что само по себе bad practice).
Могу сделать предположение, что уровень твоего английского не позволяет тебе понять смысловую нагрузку.
Прикрепляю скриншот, чтобы было понятнее - а про глагол "to be" уже сам потом почитаешь.

is boolean

Да и вообще, получается Jump._jumping :]
Сам себе противоречишь.
Может тогда уже Jump.isGrounded или там Jump.isInAir.

@HolyMonkey
Copy link
Author

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

Какую смысловую нагрузку добавит is к названию jumping?

Судя по тому, что ты пишешь комментарии в коде на русском языке (что само по себе bad practice).
Могу сделать предположение, что уровень твоего английского не позволяет тебе понять смысловую нагрузку.
Прикрепляю скриншот, чтобы было понятнее - а про глагол "to be" уже сам потом почитаешь.

is boolean

У меня на русском, для русскоязычной аудитории, комментарии в тысячу раз информативней твоего акынского «что вижу о том и пою». «Это функция такая-то».

Иди скобки у себя для начало выравни, хоть на колхозника перестанешь смахивать. ;)

В Гугл транслейту ещё хорошо бы почитать правила английского, например про образование герундиев.

В С# нет общего правила что мы обязательно должны использовать Is, даже наоборот в правилах по Event оно отбрасывается как излишнее.

Например CoinsChanging а не CoinsIsChanging

Также если мы проведём исследование C# Source Reference мы не получим явного ответа, на эту тему я кстати писал статью. ;)

К однозначным выводам прийти не удалось, по этому в этом плане все должны договариваться локально при желание.

@HolyMonkey
Copy link
Author

Да и вообще, получается Jump._jumping :]
Сам себе противоречишь.
Может тогда уже Jump.isGrounded или там Jump.isInAir.

Как ты любишь ломать предметную терминологию. К сожалению да, Jumping я потащил в след за твоим корявым решение проверки заземления по OnCollisionEnter, отдельный компонент с состояние заземленности мне нравится действительно больше.

@HolyMonkey
Copy link
Author

HolyMonkey commented Aug 2, 2021

Давай отойдём от возвышенного скобочко-дрочьства и поговорим о твоей реализации бани хопа. Как это работает?

@NVcoder24
Copy link

Форчанский появился, ща взглянем )

  1. TryGetComponent на твоем месте я бы по рукам бил за любое использование GetComponent вне Start/Awake.
    И кстати, проверка по слоям работает быстрее этого варианта (примерно в 2 раза).
  2. KeyCode.Space - хардкод, круто )
    Чтобы поменять инпут - придется менять скрипт, браво!
    А это, игроку чтоб поменять бинд - надо декомпилировать игру? :]
    А вообще уже давно есть New Input System.
  3. AddForce в Update, тоже надо по рукам бить за такое.
    Он то может и выполнится нормально, но там очень много но.
    Вообще это Bad Practice писать так код.
  4. Булевы переменные лучше именовать с префиксами "is", "has", "can" (в данном случае оно "adds value" как раз, если что)
    Это рекомендация Microsoft Naming Convention
  5. _self. Конечно это не Python, а C#. Но здесь есть ключевое слово this. Мягко говоря, это не нарушение. Но имхо условный _rb смотрелся бы лучше и был более понятным.
  6. Файлик контроллера лучше называть с постфиксом Controller.
    Например, JumpController, MovementController и т.д.
    Почитай, дружок пирожок.

Нет.

@EntaltsevSN
Copy link

Строковой литерал не лучше. Даже хуже, ведь нужно постоянно помнить как его писать.

Ну да, тяжело запомнить как пишется английское слово Jump.

Они говорят что можно добавить префиксы "Is", "Can", or "Has", если они имеют силу.

Перечитай мой коммент, чел.

Какую смысловую нагрузку добавит is к названию jumping?

Судя по тому, что ты пишешь комментарии в коде на русском языке (что само по себе bad practice).
Могу сделать предположение, что уровень твоего английского не позволяет тебе понять смысловую нагрузку.
Прикрепляю скриншот, чтобы было понятнее - а про глагол "to be" уже сам потом почитаешь.

is boolean

Да и вообще, получается Jump._jumping :]
Сам себе противоречишь.
Может тогда уже Jump.isGrounded или там Jump.isInAir.

Т.е. ты себя оправдываешь с помощью гугл переводчика, который слово jumping не правильно переводит? Может обратимся к знаниям английского, а не переводчику?
Для особо одарённого англоговорящего, напоминаю: jimp - прыгать, jumping - прыжок, а все производные, is, can, has - условные выражения, которые переводчик никогда правильно не переведёт, так как не понимает.

Го учить английский, мальчишка

@enikey87
Copy link

enikey87 commented Aug 4, 2021

Имхо ебейший оверинжиринг.

@sunnamed434
Copy link

sunnamed434 commented Aug 4, 2021

Роман, я думаю стоит остановиться на видео уроках по юнити, хауди многому научился, пора начать жесткое, давай английский по 300 bucks, ждем курс!

@HolyMonkey

@sappChak
Copy link

sappChak commented Aug 6, 2021

Форчанский появился, ща взглянем )

  1. TryGetComponent на твоем месте я бы по рукам бил за любое использование GetComponent вне Start/Awake.
    И кстати, проверка по слоям работает быстрее этого варианта (примерно в 2 раза).
  2. KeyCode.Space - хардкод, круто )
    Чтобы поменять инпут - придется менять скрипт, браво!
    А это, игроку чтоб поменять бинд - надо декомпилировать игру? :]
    А вообще уже давно есть New Input System.
  3. AddForce в Update, тоже надо по рукам бить за такое.
    Он то может и выполнится нормально, но там очень много но.
    Вообще это Bad Practice писать так код.
  4. Булевы переменные лучше именовать с префиксами "is", "has", "can" (в данном случае оно "adds value" как раз, если что)
    Это рекомендация Microsoft Naming Convention
  5. _self. Конечно это не Python, а C#. Но здесь есть ключевое слово this. Мягко говоря, это не нарушение. Но имхо условный _rb смотрелся бы лучше и был более понятным.
  6. Файлик контроллера лучше называть с постфиксом Controller.
    Например, JumpController, MovementController и т.д.
    Почитай, дружок пирожок.

Какой еще n@xui "дружок пирожок", он же вроде не твоя ежедневная еда

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