void LateUpdate() { if (active) { if (!AIControlled) { torque = Input.GetAxis("Vertical") * maxPower * 250 * Time.deltaTime; steer = Input.GetAxis("Horizontal") * maxSteer; brake = Input.GetKey("space") ? GetComponent <Rigidbody>().mass * 0.25f : 0.0f; } else { steering = neuralNet.CalculateNN(CalculateRaycasts()); steer = steering * maxSteer; torque = aiAcceleration * maxPower * 250 * Time.deltaTime; brake = 0; if (Vector3.Distance(transform.position, objective) < 5) { Inactive(true); } } rearLeftWheel.motorTorque = torque; rearRightWheel.motorTorque = torque; frontRightWheel.steerAngle = steer; frontLeftWheel.steerAngle = steer; frontLeftWheel.brakeTorque = brake; frontRightWheel.brakeTorque = brake; rearLeftWheel.brakeTorque = brake; rearRightWheel.brakeTorque = brake; cSamplesInterval += Time.fixedDeltaTime; if (cSamplesInterval > fitSamplesInterval) { CalculateFitness(); UpdateUI(); cSamplesInterval = 0; } } }
// Update is called once per frame void FixedUpdate() { brain = nn.ReadBrain(); // Rotate the charater based on Horizonal Input & later NN Output transform.rotation = Quaternion.Euler(transform.eulerAngles + Vector3.up * movement * 2.5f); // If attempt has ended if (!ended) { // Auto move Forrest forward rb.MovePosition(transform.position + transform.forward * (Time.deltaTime * 10)); } // Set up a raycast hit for knowing what we hit RaycastHit hit; // Set up out 5 feelers for undertanding the world Vector3[] feeler = new Vector3[] { // 0 = L transform.TransformDirection(Vector3.left), // 1 - FL transform.TransformDirection(Vector3.left + Vector3.forward), // 2 - F transform.TransformDirection(Vector3.forward), // 3 = FR transform.TransformDirection(Vector3.right + Vector3.forward), // 4 = R transform.TransformDirection(Vector3.right), }; // Use this to collect all feeler distances, then well pass them through our NN for an output inp = new float[feeler.Length]; // Loop through all feelers for (int i = 0; i < feeler.Length; i++) { // See what all feelers feel if (Physics.Raycast(transform.position, feeler[i], out hit)) { // If feelers feel something other than Forrest & nothing if (hit.collider != null && hit.collider != col) { // Set the input[i] to be the distance of feeler[i] inp[i] = hit.distance; } } // Draw the feelers in the Scene mode Debug.DrawRay(transform.position, feeler[i] * 10, Color.red); } // Add to our fitness every frame fitness += (ended) ? 0 : inp2fit(inp); // This sets the output text display to be the output of our NN if (!menu) { movement = ended ? 0 : ((C.intelli == ctrl.IntelMode.Human) ? Input.GetAxis("Horizontal") : nn.CalculateNN(inp)); } else { movement = ended ? 0 : (nn.CalculateNN(inp)); } // if (!menu && !ended && lap.x > lap.y) { Freeze(); CheckIfLast(); } }