The steer behaviours AI is integrated with MonkeyBrains so before start coding be sure that you have checked the monkey brains documentation
Be sure to create a reference to MonkeyBrains from your project.
Finally, do not forget to import the com.jme3.ai.agents.behaviours.npc.steering
package.
Avaliable behaviours:
All the behaviours extend from the AbstractSteeringBehavior
class.
Create instances from the steer behaviour classes, They are located in the com.jme3.ai.agents.behaviours.npc.steering
package.
If we want to add more than one steer behaviour, we need to create a container:
SimpleMainBehaviour
it will cause problems in the rotation of the agents.
Container | Purpose |
---|---|
CompoundSteeringBehaviour | Contains and merges several AbstractSteeringBehaviour instances |
BalancedCompoundSteeringBehaviour | Each force generated inside this container is reduced in relation with a proportion factor: "Partial Force" / "Total container force" |
Once we know which container fits better for our agent, We create a new instance and add all the behaviours that we need:
SimpleMainBehaviour mainBehaviour = new SimpleMainBehaviour(myAgent); CompoundSteeringBehaviour steer = new CompoundSteeringBehaviour(myAgent); //BalancedCompoundSteeringBehaviour steer = new BalancedCompoundSteeringBehaviour(myAgent); steer.addSteerBehaviour(steerBehaviour1); steer.addSteerBehaviour(steerBehaviour2); mainBehaviour.addBehaviour(steer); myAgent.setMainBehaviour(mainBehaviour);
SimpleMainBehaviour mainBehaviour = new SimpleMainBehaviour(myAgent); CompoundSteeringBehaviour steer = new CompoundSteeringBehaviour(myAgent); BalancedCompoundSteeringBehaviour nestedSteer = new BalancedCompoundSteeringBehaviour(myAgent); nestedSteer.addSteerBehaviour(steerBehaviour1); steer.addSteerBehaviour(nestedSteer); steer.addSteerBehaviour(steerBehaviour2); mainBehaviour.addBehaviour(steer); myAgent.setMainBehaviour(mainBehaviour);
You can assign priority layers: The steering controller first checks the
higher layer to see if all the behaviours returns a value higher than minLengthToInvalidSteer
, if so it uses that layer. Otherwise, it moves on to the second layer, and so on.
To assign priority layers add behaviours with the following function:
addSteerBehaviour (AbstractSteeringBehaviour behaviour, int priority, float minLengthToInvalidSteer)
If a behaviour extends from the AbstractStrengthSteeringBehaviour
class, you can manage how the produced forces will work.
Use setupStrengthControl(float scalar)
to increase/decrease the steer force produced by a behaviour or setupStrengthControl(Plane plane)
If you want to work with 2D behaviours.
Example:
Plane horizontalPlane = new Plane(new Vector3f(0,1,0), 0); steerBehaviour1.setupStrengthControl(0.5f); //Force reduced a 50% steerBehaviour2.setupStrengthControl(horizontalPlane); //Force contained in the XZ plane steerContainer.setupStrengthControl(horizontalPlane, 2f); //Contained in the XZ plane and increased a 100%
To benefit from all the features, you have to create a new class that extends from AbstractStrengthSteeringBehaviour
.
The responsible for the agent's acceleration is the vector returned in the calculateFullSteering()
method:
@Override protected Vector3f calculateFullSteering() { Vector3f steerForce = Vector3f.ZERO; //calculations return steerForce; }
In addition, you can change a brake factor which will reduce the resultant velocity for the agent:
@Override protected Vector3f calculateFullSteering() { this.setBrakingFactor(0.5f); //The agent's velocity will be reduced a 50% return Vector3f.ZERO; }
To ensure that the behaviour will work as you had planned it to work It's recommended to create your own IllegalArgumentException class. To do this, extend from com.jme3.ai.agents.behaviours.IllegalBehaviour
. Furthermore, It will help users to recognise better which is the origin of any problem.
Example:
/** @see IllegalBehaviour */ public static class customRuntimeException extends IllegalBehaviour { private customRuntimeException(String msg) { super(msg); } } public steerBehaviourConstructor(Agent agent, int value, Spatial spatial) { super(agent, spatial); if(value > 5) throw new customRuntimeException ("Value must be lower than 5"); this.value = value; }
Copyright (c) 2014, Jesús Martín Berlanga. All rights reserved.
Licensed under a Creative Commons Attribution 3.0 Unported License.