public void InitializeDebrisArray(RobotEnvironment env) { environment = env; // Get list of debris Transforms List <Debris> debrisList = environment.GetDebris(); // Initialize list of DebrisInfos debrisInfos = new List <DebrisInfo>(); // Add each debris transform and starting values to info list foreach (Debris d in debrisList) { DebrisInfo info = new DebrisInfo(); info.transform = d.transform; info.lastKnownPosition = Vector3.zero; info.isVisible = false; info.distanceFromRobot = Vector3.Distance(d.transform.position, transform.position); info.lastDistanceFromRobot = info.distanceFromRobot; debrisInfos.Add(info); } UpdateVision(); }
public List <DebrisInfo> UpdateVision() { if (debrisInfos == null) { return(new List <DebrisInfo>()); } if (debrisInfos.Count > 0 && debrisInfos[0].transform == null) { return(new List <DebrisInfo>()); } Vector3 currentSensorPosition = transform.InverseTransformPoint(sensorPosition.position); // For every debris -> check if it is visible for (int i = 0; i < debrisInfos.Count; i++) { // Assign struct to variable to allow modification DebrisInfo currentDebrisInfo = debrisInfos[i]; // Current debris-position Vector3 currentDebrisPosition = transform.InverseTransformPoint(currentDebrisInfo.transform.position); // Vector from Sensor-position to current Debris-position Vector3 directionToDebris = currentDebrisPosition - currentSensorPosition; // Last Debris distance currentDebrisInfo.lastDistanceFromRobot = currentDebrisInfo.distanceFromRobot; // Debris distance from robot currentDebrisInfo.distanceFromRobot = currentDebrisPosition.magnitude; // If debris is within vision cone if (DirectionIsWithinVision(directionToDebris)) { Ray ray = new Ray(currentSensorPosition, directionToDebris); float distanceToDebris = Vector3.Distance(currentSensorPosition, currentDebrisPosition); // Cast a ray from the Sensor-position to Debris-position // If raycast from Robot to Debris gets blocked -> not visible, else -> visible if (Physics.Raycast(ray, out RaycastHit hitInfo, distanceToDebris, layerMask)) { currentDebrisInfo.isVisible = false; } else { currentDebrisInfo.isVisible = true; currentDebrisInfo.lastKnownPosition = currentDebrisPosition; } }
void Start() { instance = this; DontDestroyOnLoad(this); }