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();
}
}