Дмитрий Дмитриев
Просветленный
(40225)
3 недели назад
Ваш код имеет несколько моментов, которые можно улучшить и упростить.
Класс Player (для перемещения)
Уберем лишние проверки и методы:
Вместо двух методов IsRunning() и Rotate(), можно использовать один метод для обработки входных данных и возвращения необходимых значений. Это упростит код и сделает его более читаемым.
Улучшим структуру кода:
Разделим методы на более мелкие, чтобы каждый выполнял конкретную задачу.
Использование свойства Instance:
Вместо публичного доступа к Instance, лучше сделать его приватным и добавить метод для получения экземпляра класса (singleton pattern).
Вот как может выглядеть улучшенный код:
csharp
Копировать код
using UnityEngine;
public class Player : MonoBehaviour
{
public static Player Instance { get; private set; }
private Rigidbody2D rb;
[SerializeField] private float speed = 1f;
private float minSpeed = 0f;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
Instance = this;
}
private void FixedUpdate()
{
Vector2 inputVector = HandleMove();
bool isRunning = inputVector.x != 0;
bool isRotate = inputVector.x < 0;
PlayerVisual.Instance.SetAnimation(isRunning, isRotate);
// Применяем движение
rb.velocity = inputVector * (speed * Time.fixedDeltaTime);
}
private Vector2 HandleMove()
{
Vector2 inputVector = new Vector2(Input.GetAxis("Horizontal"), 0f);
return inputVector.normalized; // Нормализуем, чтобы диагональное движение не было быстрее
}
}
Класс PlayerVisual (для анимации)
Изменение метода анимации:
Вместо вызова методов IsRunning() и Rotate() из класса Player, можно передавать необходимые параметры напрямую в метод анимации.
Использование одного метода для установки анимации:
Объединим установку состояний анимации и разворот спрайта в один метод.
Вот улучшенный код для PlayerVisual:
csharp
Копировать код
using UnityEngine;
public class PlayerVisual : MonoBehaviour
{
private Animator animator;
private SpriteRenderer spriteRenderer;
private const string IS_RUN = "IsRun";
private void Awake()
{
animator = GetComponent<Animator>();
spriteRenderer = GetComponent<SpriteRenderer>();
}
public void SetAnimation(bool isRunning, bool isRotate)
{
animator.SetBool(IS_RUN, isRunning);
spriteRenderer.flipX = isRotate;
}
}
Общие замечания:
Singleton Pattern: В улучшенной версии Player используется паттерн Singleton для доступа к экземпляру класса через Player.Instance. Это позволяет избежать публичного статического доступа к экземпляру и упрощает управление состояниями игрока.
Уменьшение нагрузки: Убраны лишние вызовы методов из FixedUpdate(), что снижает нагрузку на процессор и делает код более эффективным.
luxury brain
Мыслитель
(8901)
3 недели назад
привет! давай разберёмся, как можно упростить и улучшить твой код для unity. в общем, у тебя два класса, которые в целом делают свою работу, но есть несколько моментов, которые можно улучшить.### 1. объединение логики в одном классеесли классы сильно зависят друг от друга, можно рассмотреть возможность объединения их в одном. например, анимацию и движение можно делать в одном классе `player`. это избавит от необходимости постоянно запрашивать состояние другого класса.### 2. использование `update` вместо `fixedupdate`если у тебя нет физики, чтобы работать в `fixedupdate`, лучше использовать `update`, так как это более распространённый подход для обработки ввода.### 3. упрощение метода `handlemove`эта функция может возвращать просто `inputvector`, и не имеет смысла вызывать её дважды.### 4. улучшение проверки состояниявместо создания нескольких методов `isrunning` и `rotate`, можно сделать это в одном месте и обновлять состояние анимации.### пример кода:вот пример, как можно это всё объединить:```csharpusing unityengine;public class player : monobehaviour{ public static player instance { get; private set; } private rigidbody2d rb; private animator animator; private spriterenderer spriterender; [serializefield] private float speed = 1f; private void awake() { rb = getcomponent<rigidbody2d>(); animator = getcomponent<animator>(); spriterender = getcomponent<spriterenderer>(); instance = this; } private void update() { handlemove(); } private void handlemove() { float moveinput = input.getaxis("horizontal"); vector2 movement = new vector2(moveinput, 0) * (speed * time.deltatime); rb.velocity = movement; bool isrunning = mathf.abs(moveinput) > mathf.epsilon; animator.setbool("isrun", isrunning); if (isrunning) { spriterender.flipx = moveinput < 0; // повернуть спрайт влево } }}```### что изменилось:1. убрал ненужные переменные и методы.2. все логики в одном методе для простоты.3. используется `update`, чтобы получать ввод и обновлять анимацию.4. проверка на анимацию и флип-спрайт выполняется сразу.это поможет сделать код чище и понятнее. надеюсь, что этопоможет! если есть вопросы — спрашивай!
Класс для перемещения Класс для анимации