Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Управление поведением(Steer Behaviors)

Управление поведением(Steer Behaviors)

Опубликованно: 07.07.2017, 11:25
Последняя редакция, Andry: 07.07.2017 15:36

Управление поведением позволяет вам контролировать передвижение «персонажей», это может значительно сократить время, необходимое для разработки игры, потому что практически для каждой игры нам необходимо задавать, как «персонажи» будут перемещаться по сцене.

YouTube
Управление поведением в действии

hqdefault

Обязательно попробуйте демонстрационные версии: их можно скачать здесь: jmesteer.bdevel.org

Шаг первый

Управление поведением ИИ интегрировано с MonkeyBrains, поэтому перед началом написания своего кода убедитесь, что вы ознакомились с документацией по MonkeyBrains.

Обязательно создайте отсылку на MonkeyBrains из вашего проекта.

Наконец, не забудьте импортировать пакет com.jme3.ai.agents.behaviors.npc.steering.

Обзор

Доступное поведение:

  • Move(Движение)
  • Seek(Поиск)
  • Arrive(Придти)
  • Flee(Бежать)
  • Pursuit(Преследовать)
  • Leader follow(Следовать за лидером)
  • Evade(Уклонятся)
  • Cohesion(Единство)
  • Alignment(Встроится)
  • Obstacle Avoidance(Избегание препятствий)
  • Unaligned obstacle avoidance(Избегание помех)
  • Hide(Прятаться)
  • Slow(Замедлится)
  • Queuing(Очереди)
  • Containment(Сдерживание)
  • Path follow(Путь следовать)
  • Wall approach(Проход в стене)
  • Wander Area(Бродить по площади)
  • Simple Wander(Просто бродить)
  • Relative wander(Бродить около чего то)
  • Sphere wander(Бродить по кругу)
  • Box explore(Изучить место)
  • Separation(Разделение)

Все действия наследуются от класса AbstractSteeringBehavior.

Добавление управление поведением(steer behavior)

Создайте экземпляры из классов управления поведением, они находятся в пакете com.jme3.ai.agents.behaviors.npc.steering.

Если мы хотим добавить несколько управлений поведением, нам нужно создать контейнер:

Если вы добавите более одного управлений поведением SimpleMainBehavior, это будет причиной проблемы при поворотах агентов.
Контейнер  Назначение
CompoundSteeringBehavior  Содержит и объединяет несколько экземпляров AbstractSteeringBehavior
BalancedCompoundSteeringBehavior  Каждая сила, генерируемая внутри этого контейнера, уменьшается в зависимости от коэффициента пропорциональности: «Частичная сила» / «Полная сила контейнера»

Как только мы узнаем, какой контейнер лучше подходит для нашего агента, мы создаем новый экземпляр и добавляем все необходимые нам варианты поведения:

SimpleMainBehaviour mainBehavior = new SimpleMainBehavior(myAgent);
    CompoundSteeringBehavior steer = new CompoundSteeringBehavior(myAgent);
    //BalancedCompoundSteeringBehavior steer = new BalancedCompoundSteeringBehavior(myAgent);
    steer.addSteerBehavior(steerBehavior1);
    steer.addSteerBehavior(steerBehavior2);
mainBehaviour.addBehavior(steer);
myAgent.setMainBehavior(mainBehavior);
Обратите внимание, что вы можете иметь вложенные контейнеры, как показано в следующем примере:
SimpleMainBehaviour mainBehavior = new SimpleMainBehavior(myAgent);
    CompoundSteeringBehavior steer = new CompoundSteeringBehavior(myAgent);
        BalancedCompoundSteeringBehavior nestedSteer = new BalancedCompoundSteeringBehavior(myAgent);
        nestedSteer.addSteerBehavior(steerBehavior1);
    steer.addSteerBehavior(nestedSteer);
    steer.addSteerBehavior(steerBehavior2);
mainBehavior.addBehavior(steer);
myAgent.setMainBehavior(mainBehavior);

Приоритизация поведения

Вы можете назначить приоритетные слои: контроллер управления сначала проверяет более высокий уровень, чтобы увидеть, вернут ли все поведения значение выше minLengthToInvalidSteer, если они использует этот уровень. В противном случае он переходит к второму слою и так далее.

Чтобы назначить приоритетные слои, добавьте поведению со следующую функцию:

  addSteerBehavior (AbstractSteeringBehavior behavior, int priority, float minLengthToInvalidSteer)
Чтобы оптимизировать скорость процесса, сначала добавляйте поведение с наименьшим приоритетом.
Слой и минимальная длина, чтобы считать поведение недопустимым, равны 0 по умолчанию.

Настройка сил

Если поведение наследуется от класса AbstractStrengthSteeringBehavior, вы можете управлять тем, как будут работать произведенные силы.

Используйте setupStrengthControl(float scalar), чтобы увеличить/уменьшить силу управления, создаваемую поведением или setupStrengthControl(Plane plane). Если вы хотите работать с 2D-поведением.

Пример:

    Plane horizontalPlane = new Plane(new Vector3f(0,1,0), 0);

    steerBehavior1.setupStrengthControl(0.5f); //Сила уменьшилась на 50%
    steerBehavior2.setupStrengthControl(horizontalPlane); //Сила, содержащаяся в плоскости XZ
    steerContainer.setupStrengthControl(horizontalPlane, 2f); //Содержится в плоскости XZ и увеличивается на 100%

Внедрение собственного упровляемого поведения

Чтобы воспользоваться всеми функциями, вам необходимо создать новый класс, который наследуется от AbstractStrengthSteeringBehavior.

Ответственным за ускорение агента является вектор, возвращаемый методом calculateRawSteering():

    @Override
    protected Vector3f calculateRawSteering() {
        Vector3f steerForce = Vector3f.ZERO;

        //расчеты

        return steerForce;
    }

Кроме того, вы можете изменить коэффициент торможения, который уменьшит результирующую скорость для агента:

    @Override
    protected Vector3f calculateRawSteering(){
        this.setBrakingFactor(0.5f); //Скорость агента будет уменьшена на 50%
        return Vector3f.ZERO;
    }
Тормозной силой должно быть float, содержащийся в интервале [0,1]
0 означает максимальное тормозное усилие и 1 Отсутствует тормозное усилие

Строгие аргументы

Чтобы убедиться, что поведение будет работать так, как вы планировали его работу, рекомендуется создать собственный класс IllegalArgumentException. Для этого создайте свой собственный контейнерный класс, наследуемый от com.jme3.ai.agents.behaviors.npc.steering.SteeringExceptions; Каждое исключение внутри класса контейнера наследуется от SteeringBehaviorException. Кроме того, это поможет пользователям лучше узнать, что является источником любой проблемы.

Пример:

    public class CustomSteeringExceptions extends SteeringExceptions  {

        public static class CustomRuntimeException extends SteeringBehaviorException {
            public CustomRuntimeException(String msg) { super(msg); }
        }

        // ... другие исключения ...
    }
    public SteerBehaviorConstructor(Agent agent, int value, Spatial spatial) {
        super(agent, spatial);
        if(value > 5) throw new CustomSteeringExceptions.customRuntimeException ("Value must be lower than 5");
        this.value = value;
    }

Полезные ссылки

Java проект управления поведением: jmesteer.bdevel.org


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.