Задать вопрос
@piffo

Оптимизация кода?

Есть 2 довольно больших скрипта.
Вот первый
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControler : MonoBehaviour
{
    Rigidbody2D rb;
    bool isGround = false;
    public float maxSpeed = 10f;
    private bool isFacingRight = true;
    private Animator anim;
    public BoxCollider2D[] col9;
    public CapsuleCollider2D col3;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        col9 = GetComponents<BoxCollider2D>();
        col3 = GetComponent<CapsuleCollider2D>();

        kuk();
    }

    void OnTriggerStay2D(Collider2D col)
    {
        if (col.tag == "ground") isGround = true;
    }
    void OnTriggerExit2D(Collider2D col)
    {
        if (col.tag == "ground") isGround = false;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGround)
        {
            puk();
            anim.SetBool("jump", true);
        }
    }

    void FixedUpdate()
    {
        rb.velocity = new Vector2(Input.GetAxis("Horizontal") * 6f, rb.velocity.y);
        float move = Input.GetAxis("Horizontal");
        anim.SetFloat("Speed", Mathf.Abs(move));
        if (move > 0 && !isFacingRight)
            Flip();
        else if (move < 0 && isFacingRight)
            Flip();
        rb.velocity = new Vector2(move * maxSpeed, rb.velocity.y);
        anim.SetBool("jump", isGround);
        if (!isGround)
            return;
    }

    void puk()
    {
        rb.AddForce(transform.up * 10f, ForceMode2D.Impulse);
    }

    void kuk()
    {
        col9[0].offset = new Vector2(0f, -0.41f);
        col9[1].offset = new Vector2(0f, -0.08f);
        col3.offset = new Vector2(0f, 0.29f);
    }

    private void Flip()
    {
        isFacingRight = !isFacingRight;
        transform.Rotate(0, 180, 0);
    }
}

Это основной скрипт персонажа, он висит на префабе персонажа, который есть на каждой сцене. Это те методы, которые должны быть на персонаже, на каждой сцене. Если нужно что-то добавить для определённой сцены, то я создаю отдельный скрипт и уже добавляю его на соответствующую сцену. Вот о каждом методе:
Start, здесь мы всё кэшируем.
OnTriggerStay2D и OnTriggerExit2D для того, чтобы проверять стоит персонаж на земле или нет.
Update для прыжка.
Fixed Update для перемещения вправо, влево и его переворота; также для того чтобы персонаж не прыгал бесконечно.
puk это я думаю ясно.
kuk чтобы при старте игры коллайдеры персонажа перемещались.
Flip тоже ясно.

Вот второй скрипт. Он висит на персонаже на одном из уровней.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class transition : MonoBehaviour
{
    public GameObject came;
    public GameObject charter;
    public GameObject txt;
    public GameObject move1;
    public GameObject[] cames;
    int wer = 5;
    bool bol;
    Vector2 vec;
    Vector3 came1;
    Vector3 came2;

    private void Start()
    {
        StartCoroutine(fuk());
        bol = cames[0].GetComponent<camemove31>().bol;
        came1 = new Vector3(0f, 0f, 0f);
        came2 = new Vector3(3.93f, 0f, 0f);
    }

    private void Update()
    {
        Debug.Log(wer);
        if (bol == true)
        {
            cames[2].SetActive(false);
            cames[3].SetActive(true);
        }
        if (bol == false)
        {
            cames[2].SetActive(true);
            cames[3].SetActive(false);
        }
        if (came.transform.position == came1)
            bol = true;
        if (came.transform.position == came2)
            bol = false;
    }

    IEnumerator fuk()
    {
        txt.SetActive(true);
        yield return new WaitForSeconds(5f);
        txt.SetActive(false);
    }

    IEnumerator dick()
    {
        this.gameObject.GetComponent<Animator>().enabled = false;
        yield return new WaitForSeconds(0.1f);
        this.gameObject.GetComponent<Animator>().enabled = true;
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.name == "set5")
        {
            kok();
            came.transform.position = vec;

            if (wer == 4)
            {
                wer--;
                return;
            }
            if (wer == 3)
            {
                wer--;
                return;
            }
            if (wer != 4 || wer != 3)
                wer = 5;
        }
        if (col.gameObject.name == "wall3")
        {
            StartCoroutine(dick());
            charter.transform.position = new Vector3(12.456f, -2.817f, 90f);
            came.transform.position = came2;

            if (wer == 5)
            {
                wer--;
                return;
            }
            if (wer == 1)
                SceneManager.LoadScene("Level4");
            if (wer != 5 || wer != 1)
                wer = 5;
        }
        if (col.gameObject.name == "wall4")
        {
            StartCoroutine(dick());
            charter.transform.position = new Vector3(-8.527035f, -2.821f, 90f);
            came.transform.position = came1;

            if (wer == 2)
            {
                wer--;
                return;
            }
            if (wer != 2)
                wer = 5;
        }
        if (col.gameObject.name == "cametrig")
        {
            cames[0].SetActive(true);
        }
        if (col.gameObject.name == "cametrig2")
        {
            cames[1].SetActive(true);
        }
    }

    void OnTriggerStay2D(Collider2D col)
    {
        if (col.gameObject.name == "set5")
        {
            kok();
            came.transform.position = vec;
        }
    }

    void OnTriggerExit2D(Collider2D col)
    {
        if (col.gameObject.name == "set5")
        {
            charter.transform.position = new Vector3(-7.62f, 2.79f, 90f);
            move1.SetActive(true);
        }
    }

    void kok()
    {
        vec = charter.transform.position;
    }
}

Да, я знаю жуткий говнокод, здесь я думаю ничего не нужно объяснять, достаточно почитать. Общая концепция уровня такая: выхода с уровня нету, если персонаж пойдёт налево, то его перенесёт направо, если налево, то соответственно направо. Также есть яма, если туда прыгнуть, то персонажа перенесёт обратно на землю. Чтобы пройти уровень нужно пройти налево, два раза вниз, направо и опять налево.
Так вот к сути. Как эти скрипты можно оптимизировать?
  • Вопрос задан
  • 291 просмотр
Подписаться 1 Средний 10 комментариев
Решения вопроса 1
2chevskii
@2chevskii
Если бы каждый мог в поиск, тостер бы вымер.
puk999, ладно, тогда проанализирую ваш код:
С точки зрения читабельности - отвратительно. Названия методов, переменных и т.п. должны быть самодескриптивными, то есть - название должно давать примерное представление о функциональности.
Эти вектора безумные - лучше вынести в отдельные переменные с понятными названиями, и их переиспользовать. Это и на производительности скажется положительно.
Также - я обычно выношу весь функционал, вызываемый хуками, в отдельные методы, тоже полезно для читабельности кода. Когда начнете ваять компоненты на 2к строк - поймете, что это важно.
FixedUpdate 1-го скрипта:
Ваш if-elseif можно превратить в один лишь if, дабы не повторять код:
if (move > 0 && !isFacingRight || move < 0 && isFacingRight)
{
    Flip();
}

На кой хер это нужно, вообще не шарю:
if (!isGround)
                return;


Этот вот метод больше нигде не вызывается, нахрен он существует? Тогда уж все из Update перенесите в отдельный метод, и туда же всуньте логику puk()
5eaca69b88e0b593471086.png
Такая же претензия к методу kok() во втором скрипте.

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

Также - не злоупотребляйте GetComponent'ами, они не бесплатные, в плане производительности, лучше все, что будете использовать, заранее в Start/Awake вытащить в поля, и их уже использовать.

Как то так.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы