Как можно улучшить этот код(ревью)?



@motkot

Вот код, что-то типо сборки пк. Сейчас таких скрипта 2, они похожи, но мне кажется это плохо. Как это можно улучшить?
Можно ли как то избавиться от тегов?
Код материнской платы
using UnityEngine;

public class MotherBoardPlace : MonoBehaviour
{

    Collision collision;

    private void OnCollisionEnter(Collision collision)
    {
        this.collision = collision;
        switch(collision.collider.tag)
        {
            case "Processor":
                Place("ProcessorPlace", Vector3.zero);
                break;
            case "ram":
                Place("RamPlace", new Vector3(0, 0, 90));
                break;
            case "CpuFan":
                Place("CpuFanPlace", new Vector3(0, 0, 90));
                break;
        }
    }

    private void Place(string PlaceName, Vector3 Angle)
    {
        collision.rigidbody.isKinematic = true;
        collision.rigidbody.detectCollisions = false;
        collision.rigidbody.useGravity = false;
        collision.transform.parent = transform.Find(PlaceName);
        collision.transform.localPosition = Vector3.zero;
        collision.transform.localEulerAngles = Vector3.zero + Angle;
        if (!Grabbing.GrabObj.collider.CompareTag("Motherboard"))
        {
            Grabbing.grab = false;
        }

    }
}
Код корпуса компа
using UnityEngine;

public class Place : MonoBehaviour
{
    Collision collision;
    private void OnCollisionEnter(Collision collision)
    {
        this.collision = collision;
        switch(collision.collider.tag)
        {
            case "Motherboard":
                place("MotherboardPlace", Vector3.zero);
                break;

            case "Power":
                place("PowerPlace", Vector3.zero);
                break;
            case "Hdd":
                place("HddPlace", Vector3.zero);
                break;
            case "Ssd":
                place("SsdPlace", Vector3.zero);
                break;
            case "PcDoor":
                place("PcDoorPlace", Vector3.zero);
                break;
        }
    }

    private void place(string PlaceName, Vector3 Angle)
    {
        collision.rigidbody.isKinematic = true;
        collision.rigidbody.detectCollisions = false;
        collision.rigidbody.useGravity = false;
        collision.transform.parent = transform.Find(PlaceName);
        collision.transform.localPosition = Vector3.zero;
        collision.transform.localEulerAngles = Vector3.zero + Angle;
    }
}


Решения вопроса 1



@GavriKos Куратор тега Unity

— не используйте Find и прочее
— нет констант — переименование тегов влечет редактирование кода
— именование и кодстайл так себе (метод place в классе Place)
— с архитекторуй да, так себе



1

комментарий


Ответы на вопрос 1



@profesor08

Строчки в коде замени на enum
https://docs.microsoft.com/en-us/dotnet/csharp/lan…

Именование путает, непонятное.

Плохая архитектура привела к дублированию кода. Тебе надо взять объект и расположить в другом объекте, это можно вынести в отдельный код, который будет заниматься расположением одного объекта внутри другого. Сами объект должны предоставлять всю необходимую информацию, возможно их можно сделать инстансом одного класса, который характеризовал некий объект с именем и внутренними слотами, если они есть. Таким образом можно будет организовать любую вложенность и компоновку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *