Hi guys, I have an environment with almost 400 cars and every car contains 9 sensors. Everytime when my car detect something i use return to avoid using another RayCast, but still I have problems:
private void prioritySensors()
{
if (_currentWayPoint == null)
return;
if (Intersection)
_intersectionAhead = false;
_reverse = false;
CarAhead = "";
_priority = false;
_isCarAhead = false;
FrontCenterSensorPriority = false;
FrontLeftSensorPriority = false;
FrontObliqueLeftSensorPriority = false;
FrontRightSensorPriority = false;
FrontObliqueRightSensorPriority = false;
LeftSideSensorPriority = false;
RightSideSeonsorPriority = false;
BackLeftSensorPriority = false;
BackRightSensorPriority = false;
// dimensiunea senzorului va fi adaptata in functie de viteza
float newFrontSensorsLength = 0;
// speed 15 -------------- FrontSL
// speed x -------------- newFrontSL
if (CurrentSpeed > 100)
newFrontSensorsLength = 40;
else if (CurrentSpeed > 80)
newFrontSensorsLength = 35;
else if (CurrentSpeed > 60)
newFrontSensorsLength = 30;
else if (CurrentSpeed > 40)
newFrontSensorsLength = 25;
else if (CurrentSpeed > 30)
newFrontSensorsLength = 20;
else if (CurrentSpeed > 20)
newFrontSensorsLength = 15;
else if (CurrentSpeed > 15)
newFrontSensorsLength = 10;
else
newFrontSensorsLength = 3;
if (Intersection)
newFrontSensorsLength += 2;
// Stabilim dimensiunea senzorilor in intersectii
float newFronSideSensorsLength = FrontSideSensorsLength;
float newFrontObliqSensorsAngle = FrontObliqSensorsAngle;
if (RoundAbout)
newFronSideSensorsLength *= 1.5f;
else if (Intersection && !GoRight)
{
newFronSideSensorsLength = 12;
if (GoForward)
{
newFronSideSensorsLength = 8;
newFrontObliqSensorsAngle = 5;
}
}
float dim = FrontSideSensorsLength;
RaycastHit hit = new RaycastHit();
Color colorSensor = new Color();
colorSensor = Color.green;
Vector3 frontSensorsStartPosition = transform.position;
frontSensorsStartPosition += transform.forward * FrontSensorsPosition.z; // are aceeasi directie ca si masina
frontSensorsStartPosition += transform.up * FrontSensorsPosition.y; // se afla la aceeasi inaltime indiferent de pozitia masinii
Vector3 sideSensorsStartPosition = transform.position;
sideSensorsStartPosition += transform.forward * SideSensorsPosition.z; // are aceeasi directie ca si masina
sideSensorsStartPosition += transform.up * SideSensorsPosition.y; // se afla la aceeasi inaltime indiferent de pozitia masinii
Vector3 backObliqSensorsStartPosition = transform.position;
backObliqSensorsStartPosition += transform.forward * (-1) * BackSensorsPosition.z; // are aceeasi directie ca si masina
backObliqSensorsStartPosition += transform.up * BackSensorsPosition.y; // se afla la aceeasi inaltime indiferent de pozitia masinii
RaycastHit[] hits;
hits = Physics.RaycastAll(frontSensorsStartPosition, transform.forward, newFrontSensorsLength);
// Front Center
bool hited = false;
if (hits.Length > 0)
{
foreach (var h in hits)
{
// reduc viteza in intersectii
if (h.collider.gameObject.CompareTag("Intersection"))
{
_intersectionAhead = true;
if (CurrentSpeed > 30)
{
_isCarAhead = true;
return;
}
}
if (h.collider.gameObject.CompareTag("Car"))
{
hit = h;
hited = true;
break;
}
}
if (hited)
{
FrontCenterSensorPriority = true;
//Debug.DrawLine(frontSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
// Front Left
frontSensorsStartPosition -= transform.right * FrontObliqSensorsPosition;
dim = (Intersection && !GoRight) ? newFronSideSensorsLength : newFrontSensorsLength + 1;
if (Physics.Raycast(frontSensorsStartPosition, transform.forward, out hit, dim))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
//Debug.Log("FL Dim: " + dim + " NewLength" + newFrontSensorsLength + " Inter: " + newFronSideSensorsLength);
FrontLeftSensorPriority = true;
Debug.DrawLine(frontSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
// Oblique Left
dim = (Intersection && !GoRight) ? newFronSideSensorsLength : FrontSideSensorsLength;
if (Physics.Raycast(frontSensorsStartPosition, Quaternion.AngleAxis(-newFrontObliqSensorsAngle, transform.up) * transform.forward, out hit, dim))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
//Debug.Log("OL Dim: " + dim + " NewLength" + FrontSideSensorsLength + " Inter: " + newFronSideSensorsLength);
FrontObliqueLeftSensorPriority = true;
Debug.DrawLine(frontSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
// Front Right
frontSensorsStartPosition += 2 * transform.right * FrontObliqSensorsPosition;
dim = (Intersection && !GoRight) ? newFronSideSensorsLength : newFrontSensorsLength + 1;
if (Physics.Raycast(frontSensorsStartPosition, transform.forward, out hit, dim))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
//Debug.Log("FR Dim: " + dim + " NewLength" + newFrontSensorsLength + " Inter: "+ newFronSideSensorsLength);
FrontRightSensorPriority = true;
Debug.DrawLine(frontSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
// Oblique Right
dim = (Intersection && !GoRight) ? newFronSideSensorsLength : FrontSideSensorsLength;
if (Physics.Raycast(frontSensorsStartPosition, Quaternion.AngleAxis(FrontObliqSensorsAngle, transform.up) * transform.forward, out hit, dim))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
//Debug.Log("OR Dim: " + dim + " NewLength" + FrontSideSensorsLength + " Inter: " + newFronSideSensorsLength);
FrontObliqueRightSensorPriority = true;
Debug.DrawLine(frontSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
// RIGHT SIDE
sideSensorsStartPosition += transform.right * SidePosition;
if (!Intersection && (Mathf.Abs(_targetSteerAngle) > 7) || (Mathf.Abs(_dirAngle) > 10 && (_distance < 2)))
{
if (Physics.Raycast(sideSensorsStartPosition, Quaternion.AngleAxis(90, transform.up) * transform.forward, out hit, SideSensorsLength))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
RightSideSeonsorPriority = true;
Debug.DrawLine(sideSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
}
// LEFT SIDE
sideSensorsStartPosition -= 2 * transform.right * SidePosition;
if (!Intersection && (Mathf.Abs(_targetSteerAngle) > 7 || (Mathf.Abs(_dirAngle) > 10 && (_distance < 2))))
{
if (Physics.Raycast(sideSensorsStartPosition, Quaternion.AngleAxis(-90, transform.up) * transform.forward, out hit, SideSensorsLength))
{
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
LeftSideSensorPriority = true;
Debug.DrawLine(sideSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
}
// RIGHT OBLIQUE BACK
if (GoRight && !Intersection && _distance < 3)
{
backObliqSensorsStartPosition += transform.right * BackObliqSensorsPosition;
// Acest senzor se activeaza atunci cand masina isi schimba banda
if (Physics.Raycast(backObliqSensorsStartPosition, Quaternion.AngleAxis(BackObliqSensorsAngle, transform.up) * transform.forward, out hit, BackObliqSensorsLength))
{
//Debug.Log("RIGHT");
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
BackRightSensorPriority = true;
Debug.DrawLine(backObliqSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
}
// LEFT OBLIQUE BACK
if (GoLeft && !Intersection && _distance < 3)
{
backObliqSensorsStartPosition -= 2 * transform.right * BackObliqSensorsPosition;
if (Physics.Raycast(backObliqSensorsStartPosition, Quaternion.AngleAxis(-BackObliqSensorsAngle, transform.up) * transform.forward, out hit, BackObliqSensorsLength))
{
//Debug.Log("LEFT");
if (!hit.collider.CompareTag("WayPoint") && !hit.collider.CompareTag("NotForSensors") && !hit.collider.CompareTag("Intersection"))
{
BackLeftSensorPriority = true;
Debug.DrawLine(backObliqSensorsStartPosition, hit.point, colorSensor);
CarAhead = hit.collider.gameObject.name;
if (hit.collider.CompareTag("Player"))
{
_isCarAhead = true;
return;
}
_priority = getPriority(hit.collider.gameObject, hit);
_isCarAhead = !_priority;
return;
}
}
}
}