Optimize the code

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using SWS;

public class PathCreator : MonoBehaviour
{
    public static Action StartPlayersAccordingToTheirPath;


    private static PathCreator Instance;

    [SerializeField] float LineDrawStepsDistance = 0.05f;

    [SerializeField] float LineDrawStepsDistanceToforAddWayPoint = 0.05f;

    [SerializeField] float DefaultYPositionForLinerendere = 0.25f;

    Ray Ray;
    RaycastHit RaycastHit;
    [SerializeField] LayerMask LayerMaskToDraw;

    List<Vector3> PointsForLineRenderer;
    List<Vector3> PointsForWayPointLineRenderer;

    bool CanStartRayCast = false;
    public LayerMask layermask;
    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        PointsForLineRenderer = new List<Vector3>();
        PointsForWayPointLineRenderer = new List<Vector3>();
    }
    public static void ResetPointForLinRendereList()
    {
        Instance.PointsForLineRenderer.Clear();
    }


    string CurrentPlayerID = null;



    void CanDrawPathForActivePlayer()
    {
        Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit RaycastHit;
        if (Physics.Raycast(Ray, out RaycastHit))
        {
            if (RaycastHit.transform.TryGetComponent<StartingPoint>(out StartingPoint Data))
            {
                //Debug.Log("Get Starting Point " + Data.PlayerDataSO.PlayerID);
                CurrentPlayerID = Data.PlayerData.PlayerID;

            }
            else
            {
                CurrentPlayerID = null;


            }
        }
    }

    private void Update()
    {
        if (!ReferenceManger.Instance.PlayerSelectionManager.HaveReferenceOrNot())
            return;

        CanDrawPathForActivePlayer();

        //MouseButton Button Start
        if (Input.GetMouseButtonDown(0))
        {
            CastingRayCast();
            PointsForLineRenderer.Clear();

            PointsForWayPointLineRenderer.Clear();
        }
        //MouseButton Button Pressing
        if (Input.GetMouseButton(0))
        {
            if (CanStartRayCast)
            {

                //WorkFine
                //Debug.Log("Button");
                CastingRayCast();
            }
        }
        //MouseButton Release
        else if (Input.GetMouseButtonUp(0))//Original
        //if (Input.GetMouseButtonUp(0))
        {
            if (ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer != null)
            {
                if (ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.positionCount > 3)
                {

                    //assign points here
                    CreatePathAtRunTime();
                }
            }

            ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.HideParticalGameObject();

            CanStartRayCast = false;
        }
    }


    float DistanceToLastPoint(Vector3 point)
    {
        float distance = -1;
        //if (!PointsForLineRenderer.Any())
        //    return Mathf.Infinity;

        if (PointsForLineRenderer.LastOrDefault().z > point.z)
        {
            distance = Vector3.Distance(PointsForLineRenderer.LastOrDefault(), point);
        }
        else
        {
            distance = Vector3.Distance(point, PointsForLineRenderer.LastOrDefault());

        }
        //Debug.Log("Last Distance" + distance);
        return distance;
    }
    float DistanceToLastPointForWayPoint(Vector3 point)
    {
        float  distance;
        if (PointsForWayPointLineRenderer.LastOrDefault().z > point.z )
        //if (PointsForWayPointLineRenderer.LastOrDefault().x> point.x && PointsForWayPointLineRenderer.LastOrDefault().y > point.y && PointsForWayPointLineRenderer.LastOrDefault().z > point.z)
        {
            distance = Vector3.Distance(PointsForWayPointLineRenderer.LastOrDefault(), point);
        }
        else
        {
            distance = Vector3.Distance(point, PointsForWayPointLineRenderer.LastOrDefault());
        }
        return distance;
    }
    public bool CanDrawPath(Vector3 currentPosition)
    {
        bool canDraw = true;
        //RaycastHit hit;
        Vector3 fromPosition = PointsForWayPointLineRenderer[PointsForWayPointLineRenderer.Count-1];
        currentPosition.y= fromPosition.y = -1f;
        Vector3 direction = currentPosition - fromPosition;

        //Debug.DrawRay(fromPosition, direction,Color.blue);
        if (Physics.Raycast(fromPosition, direction,Vector3.Distance(fromPosition, currentPosition) ,layermask))
        {
            //print("ray just hit the gameobject: " + hit.collider.gameObject.name);
            //if(hit.collider.gameObject.name=="Cube")
            canDraw = false;

        }
        return canDraw;
    }
    private Vector3 lastHitPosition;
    private void CastingRayCast()
    {
        //Working
        Ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(Ray, out RaycastHit))
        {


            if (!CanStartRayCast)
            {
                //if (RaycastHit.transform.CompareTag("BOX"))//Original
                if (RaycastHit.transform.TryGetComponent<StartingPoint>(out StartingPoint Data))
                {
                    if (ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PlayerDataSO.PlayerID == CurrentPlayerID)
                    {
                        if(ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.StartingPoint.CanStartPathForFirstTime)//For First Time Draw Path
                            CanStartRayCast = true;
                    }
                    ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.ShowParticalGameObject();
                }
                else
                {
                    CanStartRayCast = false;
                }
            }
            if (CanStartRayCast)
            {
                
                ReferenceManger.Instance.PlayerSelectionManager.ResetAllPlayersPositions();

                //Only Add WayPoints When we are on the Ground
                //And Must be the Last WayPoint Distance must meet the Requirement

                


                Vector3 PosforLineRendereParticals = new Vector3(RaycastHit.point.x, RaycastHit.point.y, RaycastHit.point.z);

                ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.ParticalsForLineRendere.transform.position = PosforLineRendereParticals;

                

                if (DistanceToLastPoint(RaycastHit.point) > LineDrawStepsDistance)
                {

                    

                    if (ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.positionCount >= 2)
                    {
                        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.gameObject.SetActive(true);
                        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.StartingPoint.CanStartPathForFirstTime = false;//For First Time Draw Path
                    }

                    Vector3 HitPosition = RaycastHit.point;
                                                            //Working Fine
                    if (PointsForWayPointLineRenderer.Count > 1)
                    {
                        if (!CanDrawPath(HitPosition))
                        {
                            //Hide Draw Particals
                            return;
                        }
                    }
                    ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.gameObject.SetActive(true);
                    PointsForLineRenderer.Add(HitPosition);//Original
                    lastHitPosition = HitPosition;
                    //Vector3 HitPosition = new Vector3(RaycastHit.point.x, RaycastHit.point.y, RaycastHit.point.z);


                    if (DistanceToLastPointForWayPoint(RaycastHit.point)> LineDrawStepsDistanceToforAddWayPoint)
                    {

                        PointsForWayPointLineRenderer.Add(HitPosition);//Original
                        Debug.Log("WayPoint Hit Pos"+HitPosition);
                    }

                    ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.positionCount = PointsForLineRenderer.Count;
                    ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.SetPositions(PointsForLineRenderer.ToArray());
    

                    //Debug.Log("raycast");//WorkFine


                    //When We Hit To Parking Point 
                    if (RaycastHit.transform.TryGetComponent<ParkingPoint>(out ParkingPoint parkingPoint))
                    {
                        if (ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PlayerDataSO.PlayerID == parkingPoint.PlayerDataSO.PlayerID)
                        {
                            //WorkFine
                            //Debug.Log("We Hit the Parking Point Of" + parkingPoint.PlayerDataSO.PlayerID);

                            CanStartRayCast = false;


                            //Now Just Add LittleBit add More Points to LineRendere
                            
                            Vector3 LastPointForLineRendere = (parkingPoint.GetCenterPointsPosition());

                            //Debug.Log(LastPointForLineRendere);

                            PointsForLineRenderer.Add(LastPointForLineRendere);
                            PointsForWayPointLineRenderer.Add(LastPointForLineRendere);

                            ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.positionCount = PointsForLineRenderer.Count;
                            ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.LineRenderer.SetPositions(PointsForLineRenderer.ToArray());
                        }
                    }//When We Hit To Parking Point
                }
            }
        }

    }//Function

    private bool CanAddPath(Vector3 CurrentPoint)
    {
        if(PointsForLineRenderer[PointsForLineRenderer.Count - 1]==CurrentPoint)
        {
            return false;
        }
        else
        {
            return true;
        }
    }


    public List<Vector3> GetPointsForLineRenderer()
    {
        return PointsForLineRenderer;
    }
    
    void CreatePathAtRunTime()
    {
        if (!ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.IsResetPostion)
        {
            return;
        }
        //float AboveYValueforPlatforms;


        int Size = PointsForWayPointLineRenderer.Count;
        List<Vector3> positions = new List<Vector3>();
        positions.Clear();
        positions = PointsForWayPointLineRenderer;

        positions.Add(PointsForLineRenderer[PointsForLineRenderer.Count - 1]);





        Transform[] waypoints = new Transform[positions.Count];

        //instantiate waypoints
        for (int i = 0; i < positions.Count; i++)
        {
            GameObject newPoint = new GameObject("Waypoint " + i);

            waypoints *= newPoint.transform;*
            //waypoints.position = new Vector3(positions_.x, .2f, positions*.z);
            
            //we Use by Default valiue -3.53 which might be helpfull to Keep Player above from the platforms
            //AboveYValueforPlatforms = -1.53f;
            waypoints.position = new Vector3(positions.x, positions_.y, positions*.z);//original which already work Fine
            //waypoints.position = new Vector3(positions.x, positions_.y-AboveYValueforPlatforms, positions*.z);
            
        
        }
        
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PathManager.Create(waypoints, true);
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PathManager.drawCurved = true;
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PathManager.drawDirection = true;
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.splineMove.pathContainer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PathManager;
        
        //MovePlayerAccordingToWayPoints();
        
        StartPlayersAccordingToTheirPath?.Invoke();
    }
    
    //
    void MovePlayerAccordingToWayPoints()
    {
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.splineMove.pathContainer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.PathManager;
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.splineMove.enabled = true;
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.splineMove.StartMove();
        ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer.IsResetPostion = false;
    }
 }

Whatever you want to do here, the step 1 is to clear all the messy and confusing code parts

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using SWS;

public class PathCreator : MonoBehaviour
{
    public static Action StartPlayersAccordingToTheirPath;
    static PathCreator Instance;
    
    [UnityEngine.Serialization.FormerlySerializedAs("LineDrawStepsDistance")]
    [SerializeField] float _lineDrawStepsDistance = 0.05f;

    [UnityEngine.Serialization.FormerlySerializedAs("LineDrawStepsDistanceToforAddWayPoint")]
    [SerializeField] float _lineDrawStepsDistanceToforAddWayPoint = 0.05f;

    [UnityEngine.Serialization.FormerlySerializedAs("DefaultYPositionForLinerendere")]
    [SerializeField] float _defaultYPositionForLineRenderer = 0.25f;
    
    [UnityEngine.Serialization.FormerlySerializedAs("LayerMaskToDraw")]
    [SerializeField] LayerMask _layerMaskToDraw;

    List<Vector3> _pointsForLineRenderer = new List<Vector3>();
    List<Vector3> _pointsForWayPointLineRenderer = new List<Vector3>();
    bool _canStartRayCast = false;
    public LayerMask layermask;
    string _currentPlayerID = null;
    Vector3 _lastHitPosition;

    void Awake ()
    {
        Instance = this;
    }
    
    void Update()
    {
        if (!ReferenceManger.Instance.PlayerSelectionManager.HaveReferenceOrNot())
            return;
    
        CanDrawPathForActivePlayer();
    
        //MouseButton Button Start
        if (Input.GetMouseButtonDown(0))
        {
            CastingRayCast();
            _pointsForLineRenderer.Clear();
            _pointsForWayPointLineRenderer.Clear();
        }
        //MouseButton Button Pressing
        if (Input.GetMouseButton(0))
        {
            if (_canStartRayCast)
            {
                //WorkFine
                //Debug.Log("Button");
                CastingRayCast();
            }
        }
        //MouseButton Release
        else if (Input.GetMouseButtonUp(0))//Original
        //if (Input.GetMouseButtonUp(0))
        {
            var selectedPlayer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer;
            if (selectedPlayer != null)
            {
                if (selectedPlayer.LineRenderer.positionCount > 3)
                {
                    //assign points here
                    CreatePathAtRunTime();
                }
            }
            selectedPlayer.HideParticalGameObject();
            _canStartRayCast = false;
        }
    }
    
    void CanDrawPathForActivePlayer()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            if (hit.transform.TryGetComponent<StartingPoint>(out StartingPoint Data))
            {
                //Debug.Log("Get Starting Point " + Data.PlayerDataSO.PlayerID);
                _currentPlayerID = Data.PlayerData.PlayerID;
            }
            else
            {
                _currentPlayerID = null;
            }
        }
    }
    
    float DistanceToLastPoint(Vector3 point)
    {
        return Vector3.Distance(point, _pointsForLineRenderer.LastOrDefault());
    }

    float DistanceToLastPointForWayPoint(Vector3 point)
    {
        return Vector3.Distance(point, _pointsForWayPointLineRenderer.LastOrDefault());
    }

    void CastingRayCast()
    {
        //Working
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            var selectedPlayer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer;
            var lineRenderer = selectedPlayer.LineRenderer;
    
            if (!_canStartRayCast)
            {
                //if (RaycastHit.transform.CompareTag("BOX"))//Original
                if (hit.transform.TryGetComponent<StartingPoint>(out StartingPoint Data))
                {
                    if (selectedPlayer.PlayerDataSO.PlayerID == _currentPlayerID)
                    {
                        if(selectedPlayer.StartingPoint.CanStartPathForFirstTime)//For First Time Draw Path
                            _canStartRayCast = true;
                    }
                    selectedPlayer.ShowParticalGameObject();
                }
                else
                {
                    _canStartRayCast = false;
                }
            }

            if (_canStartRayCast)
            {
                ReferenceManger.Instance.PlayerSelectionManager.ResetAllPlayersPositions();
    
                //Only Add WayPoints When we are on the Ground
                //And Must be the Last WayPoint Distance must meet the Requirement
    
                selectedPlayer.ParticalsForLineRendere.transform.position = hit.point;
    
                if (DistanceToLastPoint(hit.point) > _lineDrawStepsDistance)
                {
                    if (lineRenderer.positionCount >= 2)
                    {
                        lineRenderer.gameObject.SetActive(true);
                        selectedPlayer.StartingPoint.CanStartPathForFirstTime = false;//For First Time Draw Path
                    }
    
                    //Working Fine
                    if (_pointsForWayPointLineRenderer.Count > 1)
                    {
                        if (!CanDrawPath(hit.point))
                        {
                            //Hide Draw Particals
                            return;
                        }
                    }
                    lineRenderer.gameObject.SetActive(true);
                    _pointsForLineRenderer.Add(hit.point);//Original
                    _lastHitPosition = hit.point;
                    //Vector3 HitPosition = new Vector3(RaycastHit.point.x, RaycastHit.point.y, RaycastHit.point.z);
    
                    if (DistanceToLastPointForWayPoint(hit.point)> _lineDrawStepsDistanceToforAddWayPoint)
                    {
                        _pointsForWayPointLineRenderer.Add(hit.point);//Original
                        Debug.Log("WayPoint Hit Pos"+hit.point);
                    }
    
                    lineRenderer.positionCount = _pointsForLineRenderer.Count;
                    lineRenderer.SetPositions(_pointsForLineRenderer.ToArray());
    
                    //Debug.Log("raycast");//WorkFine
    
                    //When We Hit To Parking Point 
                    if (hit.transform.TryGetComponent<ParkingPoint>(out ParkingPoint parkingPoint))
                    {
                        if (selectedPlayer.PlayerDataSO.PlayerID == parkingPoint.PlayerDataSO.PlayerID)
                        {
                            //WorkFine
                            //Debug.Log("We Hit the Parking Point Of" + parkingPoint.PlayerDataSO.PlayerID);
    
                            _canStartRayCast = false;
    
                            //Now Just Add LittleBit add More Points to LineRendere
                                
                            Vector3 lastPointForLineRendeer = parkingPoint.GetCenterPointsPosition();
    
                            //Debug.Log(LastPointForLineRendere);
    
                            _pointsForLineRenderer.Add(lastPointForLineRendeer);
                            _pointsForWayPointLineRenderer.Add(lastPointForLineRendeer);
    
                            lineRenderer.positionCount = _pointsForLineRenderer.Count;
                            lineRenderer.SetPositions(_pointsForLineRenderer.ToArray());
                        }
                    }//When We Hit To Parking Point
                }
            }
        }
    
    }//Function
    
    bool CanAddPath(Vector3 CurrentPoint)
    {
        return _pointsForLineRenderer[_pointsForLineRenderer.Count - 1]!=CurrentPoint;
    }
    
    public List<Vector3> GetPointsForLineRenderer()
    {
        return _pointsForLineRenderer;
    }

    void CreatePathAtRunTime()
    {
        var selectedPlayer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer;
        if (!selectedPlayer.IsResetPostion)
        {
            return;
        }
        //float AboveYValueforPlatforms;

        _pointsForWayPointLineRenderer.Add(_pointsForLineRenderer[_pointsForLineRenderer.Count - 1]);
        
        //instantiate waypoints
        Transform[] waypoints = new Transform[_pointsForWayPointLineRenderer.Count];
        for (int i = 0; i < _pointsForWayPointLineRenderer.Count; i++)
        {
            waypoints *= new GameObject("Waypoint " + i).transform;*
            //waypoints.position = new Vector3(positions_.x, .2f, positions*.z);
            
            //we Use by Default valiue -3.53 which might be helpfull to Keep Player above from the platforms
            //AboveYValueforPlatforms = -1.53f;
            waypoints.position = _pointsForWayPointLineRenderer*;//original which already work Fine*
            //waypoints.position = new Vector3(positions.x, positions_.y-AboveYValueforPlatforms, positions*.z);
        }
        
        var pathManager = selectedPlayer.PathManager;
        pathManager.Create(waypoints, true);
        pathManager.drawCurved = true;
        pathManager.drawDirection = true;
        selectedPlayer.splineMove.pathContainer = pathManager;
        
        //MovePlayerAccordingToWayPoints();
        
        StartPlayersAccordingToTheirPath?.Invoke();
    }
    
    void MovePlayerAccordingToWayPoints()
    {
        var selectedPlayer = ReferenceManger.Instance.PlayerSelectionManager.CurrentSelectedPlayer;
        var splineMove = selectedPlayer.splineMove;
        splineMove.pathContainer = selectedPlayer.PathManager;
        splineMove.enabled = true;
        splineMove.StartMove();
        selectedPlayer.IsResetPostion = false;
    }
    
    public bool CanDrawPath(Vector3 currentPosition)
    {
        bool canDraw = true;
        //RaycastHit hit;
        Vector3 fromPosition = _pointsForWayPointLineRenderer[_pointsForWayPointLineRenderer.Count-1];
        currentPosition.y= fromPosition.y = -1f;
        Vector3 direction = currentPosition - fromPosition;
        
        //Debug.DrawRay(fromPosition, direction,Color.blue);
        if (Physics.Raycast(fromPosition, direction,Vector3.Distance(fromPosition, currentPosition) ,layermask))
        {
            //print("ray just hit the gameobject: " + hit.collider.gameObject.name);
            //if(hit.collider.gameObject.name=="Cube")
            canDraw = false;
        }
        return canDraw;
    }
    
    public static void ResetPointForLinRendereList ()
    {
        Instance._pointsForLineRenderer.Clear();
    }
}