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);
}
}
@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