Refactoring

In this article, we will talk about Refactoring.


Refactoring is a code enhancement technique, its goal is to improve the code structure, without modifying the behaviors, thus improving your organization, and making maintenance easier.

For this article I will use my code named Enemy_2, and also the Enemy_1′ code that I created in Article about DRY. If you do not readed, the link is this mauroubaldo.com/using-principle-dry/.

Now here is our class Enemy_1:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_1 : MonoBehaviour
{

    float _Speed_X = 5;
    int _HP = 100;

    bool _Right_Movementation;
    bool _Left_Movementation;

    Rigidbody2D _Rdb;

    Vector2 _Right_Vector;
    Vector2 _Left_Vector;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Right_Movementation = true;

        _Rdb = GetComponent<Rigidbody2D>();
        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

        _Right_Vector = new Vector2(_Speed_X, _Rdb.velocity.y);
        _Left_Vector = new Vector2(-_Speed_X, _Rdb.velocity.y);

    }

    void Update()
    {

        if (_Right_Movementation == true)
            _Rdb.velocity = _Right_Vector;
        if (_Left_Movementation == true)
            _Rdb.velocity = _Left_Vector;

    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            _Right_Movementation = true;
            _Left_Movementation = false;
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            _Right_Movementation = false;
            _Left_Movementation = true;
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

And here is our Enemy_2:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Speed_X = 5;
    float _Speed_Y = 5;
    float _Time;

    int _HP = 100;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Rigidbody2D _Rdb;

    Vector2 _Right_Up_Diagonal;
    Vector2 _Right_Down_Diagonal;

    Vector2 _Left_Up_Diagonal;
    Vector2 _Left_Down_Diagonal;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Rdb = GetComponent<Rigidbody2D>();
        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

        _Right_Up_Diagonal = new Vector2(_Speed_X, _Speed_Y);
        _Right_Down_Diagonal = new Vector2(_Speed_X, -_Speed_Y);

        _Left_Up_Diagonal = new Vector2(-_Speed_X, _Speed_Y);
        _Left_Down_Diagonal = new Vector2(-_Speed_X, -_Speed_Y);

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Right_Up_Diagonal;

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Right_Down_Diagonal;

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Left_Up_Diagonal;

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Left_Down_Diagonal;

        _Time += Time.deltaTime;

        if(_Time > 5)
        {
            _Time = 0;

            if(_Up_Movementation == true)
            {
                Change_For_Down_Movementation();
            }

            if (_Down_Movementation == true)
            {
                Change_For_Up_Movementation();
            }

            if(_Left_Movementation == true)
            {
                Change_For_Right_Movementation();
            }

            if (_Right_Movementation == true)
            {
                Change_For_Left_Movementation();
            }

        }

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

For this case, I will create a class for each behavior, and in the final, I will create a class for to make managing behaviors of Enemies.

Now that We saw our classes, Let’s go.

Firstly, I will start with the Enemy class 1. So, our Enemy 1 has the following behaviors: Walk to the right side and to the left side, and He also causes damage to the Player, as I created the Damage class, I will create just the walking class, here is our new class:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Walk_Enemy : MonoBehaviour
{

    float _Speed_X = 5;

    Rigidbody2D _Rdb;

    Vector2 _Right_Vector;
    Vector2 _Left_Vector;

    void Start()
    {
        _Right_Vector = new Vector2(_Speed_X, _Rdb.velocity.y);
        _Left_Vector = new Vector2(-_Speed_X, _Rdb.velocity.y);

        _Rdb = GetComponent<Rigidbody2D>();
    }

    public void Right_Movementation()
    {
        _Rdb.velocity = _Right_Vector;
    }

    public void Left_Movementation()
    {
        _Rdb.velocity = _Left_Vector;
    }

}

As you can see, this class has a unique responsibility, which is to make Enemy_1 walk, our damage class was created in the DRY article, but I will show the class here as well.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Health_System_Enemy : MonoBehaviour
{

    int _HP = 100;

    //This method is used in Enemy_1 Class, and also Enemy_2 Class

    public void Reduce_HP(int Damage)
    {

        _HP -= Damage;
        if (_HP <= 0)
            print("Die");

    }

}

Now I will modify our class Enemy_1 for she to only manage the behaviors, but before I need to clear Enemy_1 class, because the class has many code without utility, she is dirty and with unnecessary code. I will show our Enemy_1 class before and after the changes.

Enemy_1 Before the changes:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_1 : MonoBehaviour
{

    float _Speed_X = 5;
    int _HP = 100;

    bool _Right_Movementation;
    bool _Left_Movementation;

    Rigidbody2D _Rdb;

    Vector2 _Right_Vector;
    Vector2 _Left_Vector;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Right_Movementation = true;

        _Rdb = GetComponent<Rigidbody2D>();
        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

        _Right_Vector = new Vector2(_Speed_X, _Rdb.velocity.y);
        _Left_Vector = new Vector2(-_Speed_X, _Rdb.velocity.y);

    }

    void Update()
    {

        if (_Right_Movementation == true)
            _Rdb.velocity = _Right_Vector;
        if (_Left_Movementation == true)
            _Rdb.velocity = _Left_Vector;

    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            _Right_Movementation = true;
            _Left_Movementation = false;
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            _Right_Movementation = false;
            _Left_Movementation = true;
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

After the changes:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_1 : MonoBehaviour
{

    bool _Right_Movementation;
    bool _Left_Movementation;

    Walk_Enemy _Walk_Left_And_Right_Side_Script;
    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();
        _Walk_Left_And_Right_Side_Script = GetComponent<Walk_Enemy>();

    }

    void Update()
    {

        if (_Right_Movementation == true)
            _Walk_Left_And_Right_Side_Script.Right_Movementation();

        if (_Left_Movementation == true)
            _Walk_Left_And_Right_Side_Script.Left_Movementation();

    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            _Right_Movementation = true;
            _Left_Movementation = false;
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            _Right_Movementation = false;
            _Left_Movementation = true;
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

Repair that I removed all the unnecessary code, and I kept only motion control movement variables, because the Enemy_1 class only will to manage the behaviors, she will control movement and to apply damage. 

As this is a very simple class, all the modifies look small, but in the Enemy_2 class, the changes will be more expressive.

I modified this class because for to show better the changes.

So Let’s go to Enemy_2 Class:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Speed_X = 5;
    float _Speed_Y = 5;
    float _Time;

    int _HP = 100;
    int _Bullet_Counter;

    bool _Follow_Autorization;
    bool _Fire_Autorization;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Rigidbody2D _Rdb;

    Vector2 _Right_Up_Diagonal;
    Vector2 _Right_Down_Diagonal;

    Vector2 _Left_Up_Diagonal;
    Vector2 _Left_Down_Diagonal;

    public GameObject _Bullet;
    public Transform _Cannon;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Rdb = GetComponent<Rigidbody2D>();
        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

        _Right_Up_Diagonal = new Vector2(_Speed_X, _Speed_Y);
        _Right_Down_Diagonal = new Vector2(_Speed_X, -_Speed_Y);

        _Left_Up_Diagonal = new Vector2(-_Speed_X, _Speed_Y);
        _Left_Down_Diagonal = new Vector2(-_Speed_X, -_Speed_Y);

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Right_Up_Diagonal;

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Right_Down_Diagonal;

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Left_Up_Diagonal;

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Left_Down_Diagonal;

        _Time += Time.deltaTime;

        if(_Time > 5)
        {
            _Time = 0;

            if(_Up_Movementation == true)
            {
                Change_For_Down_Movementation();
            }

            if (_Down_Movementation == true)
            {
                Change_For_Up_Movementation();
            }

            if(_Left_Movementation == true)
            {
                Change_For_Right_Movementation();
            }

            if (_Right_Movementation == true)
            {
                Change_For_Left_Movementation();
            }

        }

    }
    
    void Add_Value_In_Bullet_Counter()
    {
        _Bullet_Counter++;
    }
    void Shoot()
    {
        //Create bullet
        Instantiate(_Bullet, _Cannon.transform.position, Quaternion.identity);
        Add_Value_In_Bullet_Counter();
    }

    void Follow()
    {
        //To make the enemy follow player
    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

So, We can to see that, exist many useless code, as methods: Add_Value_In_Bullet_Counter, Shoot, Follow, and as variables: _Follow_Autorization, _Fire_Autorization, _Bullet_Counter, _HP, _Bullet, _Cannon.

Well, Let’s go, firstly I will start removing useless code, now this is our class:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Speed_X = 5;
    float _Speed_Y = 5;
    float _Time;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Rigidbody2D _Rdb;

    Vector2 _Right_Up_Diagonal;
    Vector2 _Right_Down_Diagonal;

    Vector2 _Left_Up_Diagonal;
    Vector2 _Left_Down_Diagonal;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Rdb = GetComponent<Rigidbody2D>();
        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

        _Right_Up_Diagonal = new Vector2(_Speed_X, _Speed_Y);
        _Right_Down_Diagonal = new Vector2(_Speed_X, -_Speed_Y);

        _Left_Up_Diagonal = new Vector2(-_Speed_X, _Speed_Y);
        _Left_Down_Diagonal = new Vector2(-_Speed_X, -_Speed_Y);

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Right_Up_Diagonal;

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Right_Down_Diagonal;

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Rdb.velocity = _Left_Up_Diagonal;

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Rdb.velocity = _Left_Down_Diagonal;

        _Time += Time.deltaTime;

        if(_Time > 5)
        {
            _Time = 0;

            if(_Up_Movementation == true)
            {
                Change_For_Down_Movementation();
            }

            if (_Down_Movementation == true)
            {
                Change_For_Up_Movementation();
            }

            if(_Left_Movementation == true)
            {
                Change_For_Right_Movementation();
            }

            if (_Right_Movementation == true)
            {
                Change_For_Left_Movementation();
            }

        }

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

But, You can see that the class is very big, Update method has 3 different functionalities, and this is not good, so now I will change this. For this case, the correct way is the same as Enemy_1, our class Enemy_2 only will to manage behaviors, for the sake of good practice’s question, I will add our movement in our Walk_Enemy_Script.

Now here is our Walk_Enemy_Script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Walk_Enemy : MonoBehaviour
{

    float _Speed_X = 5;
    float _Speed_Y = 5;

    Rigidbody2D _Rdb;

    Vector2 _Right_Vector;
    Vector2 _Left_Vector;

    Vector2 _Right_Up_Diagonal;
    Vector2 _Right_Down_Diagonal;

    Vector2 _Left_Up_Diagonal;
    Vector2 _Left_Down_Diagonal;

    void Start()
    {
        _Right_Vector = new Vector2(_Speed_X, _Rdb.velocity.y);
        _Left_Vector = new Vector2(-_Speed_X, _Rdb.velocity.y);

        _Right_Up_Diagonal = new Vector2(_Speed_X, _Speed_Y);
        _Right_Down_Diagonal = new Vector2(_Speed_X, -_Speed_Y);

        _Left_Up_Diagonal = new Vector2(-_Speed_X, _Speed_Y);
        _Left_Down_Diagonal = new Vector2(-_Speed_X, -_Speed_Y);

        _Rdb = GetComponent<Rigidbody2D>();
    }

    public void Right_Movementation()
    {
        _Rdb.velocity = _Right_Vector;
    }

    public void Left_Movementation()
    {
        _Rdb.velocity = _Left_Vector;
    }

    public void Right_Up_Diagonal()
    {
        _Rdb.velocity = _Right_Up_Diagonal;
    }

    public void Right_Down_Diagonal()
    {
        _Rdb.velocity = _Right_Down_Diagonal;
    }

    public void Left_Up_Diagonal()
    {
        _Rdb.velocity = _Left_Up_Diagonal;
    }

    public void Left_Down_Diagonal()
    {
        _Rdb.velocity = _Left_Down_Diagonal;
    }

}

Now, I will to remove the walk behavior in the Enemy_2, so for this. 

This is our class:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Time;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Health_System_Enemy _Health_System_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)

        if (_Right_Movementation == true && _Down_Movementation == true)

        if (_Left_Movementation == true && _Up_Movementation == true)

        if (_Left_Movementation == true && _Down_Movementation == true)

        _Time += Time.deltaTime;

        if(_Time > 5)
        {
            _Time = 0;

            if(_Up_Movementation == true)
            {
                Change_For_Down_Movementation();
            }

            if (_Down_Movementation == true)
            {
                Change_For_Up_Movementation();
            }

            if(_Left_Movementation == true)
            {
                Change_For_Right_Movementation();
            }

            if (_Right_Movementation == true)
            {
                Change_For_Left_Movementation();
            }

        }

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

Now I will to insert the walk movimentation using our class Walk_Enemy.

So here is our class:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Time;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Health_System_Enemy _Health_System_Enemy_Script;
    Walk_Enemy _Walk_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();
        _Walk_Enemy_Script = GetComponent<Walk_Enemy>();

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Right_Up_Diagonal();

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Right_Down_Diagonal();

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Left_Up_Diagonal();

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Left_Down_Diagonal();

        _Time += Time.deltaTime;

        if(_Time > 5)
        {
            _Time = 0;

            if(_Up_Movementation == true)
            {
                Change_For_Down_Movementation();
            }

            if (_Down_Movementation == true)
            {
                Change_For_Up_Movementation();
            }

            if(_Left_Movementation == true)
            {
                Change_For_Right_Movementation();
            }

            if (_Right_Movementation == true)
            {
                Change_For_Left_Movementation();
            }

        }

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

Looks better, but still not is good, because in Update method has many things happening, now I will change this.

Firstly is necessary to understand what this method is making.

Our variable _Time is receiving increment, after this, a verification is made, _Time receives zero, and the behavior is changed.

So I will to create a method for making the increment, and another for changing the behavior.

This is our class after to make the changes:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Time;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Health_System_Enemy _Health_System_Enemy_Script;
    Walk_Enemy _Walk_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();
        _Walk_Enemy_Script = GetComponent<Walk_Enemy>();

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Right_Up_Diagonal();

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Right_Down_Diagonal();

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Left_Up_Diagonal();

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Left_Down_Diagonal();

        Manage_Timer();

    }
    
    void Manage_Timer()
    {
        _Time += Time.deltaTime;

        if (_Time > 5)
        {
            _Time = 0;
            Change_Behavior();
        }

    }

    void Change_Behavior()
    {

        if (_Up_Movementation == true)
        {
            Change_For_Down_Movementation();
        }

        if (_Down_Movementation == true)
        {
            Change_For_Up_Movementation();
        }

        if (_Left_Movementation == true)
        {
            Change_For_Right_Movementation();
        }

        if (_Right_Movementation == true)
        {
            Change_For_Left_Movementation();
        }

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
        {
            Change_For_Right_Movementation();
        }

        if (collision.gameObject.CompareTag("Right_Limit"))
        {
            Change_For_Left_Movementation();
        }

        if (collision.gameObject.CompareTag("Up_Limit"))
        {
            Change_For_Down_Movementation();
        }

        if (collision.gameObject.CompareTag("Down_Limit"))
        {
            Change_For_Up_Movementation();
        }

        if (collision.gameObject.CompareTag("Player"))
        {
            _Health_System_Enemy_Script.Reduce_HP(15);
        }

    }

}

Now, all changes have been made, but for a legibility question, I will remove the { } in conditionals that have only one instruction.

So here is our new Enemy_2 class with all changes finished:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_2 : MonoBehaviour
{

    float _Time;

    bool _Right_Movementation;
    bool _Left_Movementation;
    bool _Up_Movementation;
    bool _Down_Movementation;

    Health_System_Enemy _Health_System_Enemy_Script;
    Walk_Enemy _Walk_Enemy_Script;

    void Start()
    {

        _Left_Movementation = true;
        _Up_Movementation = true;

        _Health_System_Enemy_Script = GetComponent<Health_System_Enemy>();
        _Walk_Enemy_Script = GetComponent<Walk_Enemy>();

    }

    void Update()
    {

        if (_Right_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Right_Up_Diagonal();

        if (_Right_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Right_Down_Diagonal();

        if (_Left_Movementation == true && _Up_Movementation == true)
            _Walk_Enemy_Script.Left_Up_Diagonal();

        if (_Left_Movementation == true && _Down_Movementation == true)
            _Walk_Enemy_Script.Left_Down_Diagonal();

        Manage_Timer();

    }
    
    void Manage_Timer()
    {
        _Time += Time.deltaTime;

        if (_Time > 5)
        {
            _Time = 0;
            Change_Behavior();
        }

    }

    void Change_Behavior()
    {

        if (_Up_Movementation == true)
            Change_For_Down_Movementation();
        

        if (_Down_Movementation == true)
             Change_For_Up_Movementation();
        

        if (_Left_Movementation == true)
            Change_For_Right_Movementation();
        

        if (_Right_Movementation == true)
            Change_For_Left_Movementation();

    }

    void Change_For_Up_Movementation()
    {
        _Up_Movementation = true;
        _Down_Movementation = false;
    }

    void Change_For_Down_Movementation()
    {
        _Up_Movementation = false;
        _Down_Movementation = true;
    }

    void Change_For_Left_Movementation()
    {
        _Left_Movementation = true;
        _Right_Movementation = false;
    }

    void Change_For_Right_Movementation()
    {
        _Left_Movementation = false;
        _Right_Movementation = true;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Left_Limit"))
            Change_For_Right_Movementation();

        if (collision.gameObject.CompareTag("Right_Limit"))
            Change_For_Left_Movementation();

        if (collision.gameObject.CompareTag("Up_Limit"))
            Change_For_Down_Movementation();

        if (collision.gameObject.CompareTag("Down_Limit"))
            Change_For_Up_Movementation();

        if (collision.gameObject.CompareTag("Player"))
            _Health_System_Enemy_Script.Reduce_HP(15);

    }

}

Very well, in this article, I talked about refactoring, a very important programming’s concept.

Follow-me in Instagram for stay knowing when I create new posts @mauro_developer

You can also leave your feedback, and your suggestion, I will read everything and answer your message

This project is uploaded in my github: github.com/MauroJrDeveloper/Refactoring-Article

Thank you for reading.