public void Update() { //Create a raycast and returns the distance between the origin and the collide point _ins[0] = MonoUtils.GetDistance(leftSensor.position, leftSensor.forward); _ins[1] = MonoUtils.GetDistance(rightSensor.position, rightSensor.forward); //Returns the percentage of the sensor between the minimalDistance and the maximalDistance, //if less than the minimal returns 0, it greater that the maximal returns 1, the idea is give //the neural net values between 0 and 1, is the only way it works _ins[0] = MathUtils.Range(0, 5, _ins[0]); _ins[1] = MathUtils.Range(0, 5, _ins[1]); //Check the neural net return value neuralNet.Calculate(_ins, out _outs); //Get the only value that in this case the neural net return //Check the MonoNeuralNet script in the gameobject IA in the //gameObject car and see where it specifies one float val = _outs[0]; //Turns base in the the direction that the neural net says if (val < 0.2f) { transform.Rotate(0, (1 - MathUtils.Range(0, 0.2f, val)) * -100 * Time.deltaTime, 0); } else if (val > 0.8f) { transform.Rotate(0, MathUtils.Range(0.8f, 1, val) * 100 * Time.deltaTime, 0); } /* USE THIS IF YOU WANT A NON SMOOTH TURN * * if (val < 0.2f) * transform.Rotate(0, -100 * Time.deltaTime, 0); * else if (val > 0.8f) * transform.Rotate(0, 100 * Time.deltaTime, 0); * */ //Constant move forward transform.Translate(0, 0, 0.2f); }
public void Update() { //Create a raycast and returns the distance between the origin and the collide point _ins[0] = MonoUtils.GetDistance(leftSensor.position, leftSensor.forward); _ins[1] = MonoUtils.GetDistance(rightSensor.position, rightSensor.forward); //Returns the percentage of the sensor between the minimalDistance and the maximalDistance, //if less than the minimal returns 0, it greater that the maximal returns _ins[0] = MathUtils.Range(minimalDistance, maximalDistance, _ins[0]); _ins[1] = MathUtils.Range(minimalDistance, maximalDistance, _ins[1]); //If the sensors reaches 0, that means that the neural net doesnt return the correct value, //so we need to train in every hit so the next time wont fail, also relocates to the initial //position and stops the current update to prevent undesired behaviours if (_ins[0] == 0) { for (int i = 0; i < trainLoops; i++) { neuralNet.Train(_ins, new float[] { 1f }); } transform.position = startPos; transform.rotation = startRot; return; } else if (_ins [1] == 0) { for (int i = 0; i < trainLoops; i++) { neuralNet.Train(_ins, new float[] { 0f }); } transform.position = startPos; transform.rotation = startRot; return; } //Check the neural net return value neuralNet.Calculate(_ins, out _outs); //Get the only value that in this case the neural net return //Check the MonoNeuralNet script in the gameobject IA in the //gameObject car and see where it specifies one float val = _outs[0]; //Turns base in the the direction that the neural net says if (val < 0.3f) { transform.Rotate(0, (1 - MathUtils.Range(0, 0.2f, val)) * -100 * Time.deltaTime, 0); } else if (val > 0.7f) { transform.Rotate(0, MathUtils.Range(0.8f, 1, val) * 100 * Time.deltaTime, 0); } /* USE THIS IF YOU WANT A NON SMOOTH TURN * * if (val < 0.2f) * transform.Rotate(0, -100 * Time.deltaTime, 0); * else if (val > 0.8f) * transform.Rotate(0, 100 * Time.deltaTime, 0); * */ //Constant move forward transform.Translate(0, 0, 0.2f); }