Разработка алгоритма для формирования поведения игрового агента

Анализ систем формирования поведения игрового агента и способов их применения. Описание систем Behavior Trees, Utility AI. Критерии сравнения жанров разработанных игр: форма, доступность, порог вхождения. Разработка алгоритмов поведения игрового агента.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 01.12.2019
Размер файла 2,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

4.2.2 Создание шаблонов игровых объектов

Для прочих игровых сущностей, которые так или иначе будут перемещаться - танков, снарядов и т.д. - необходимо создать нестатические объекты. В ходе работы были собраны такие объекты и сохранены в проекте как префабы. На примере префаба под названием Tank_Agent, изображённого на рис. 4.8, можно увидеть, что сам танк состоит из нескольких трёхмерных примитивов Unity, которые являются дочерними элементами танка. Это не значит, что компоненты родителя применяются также к эго детям, такое наследование отвечает лишь за относительное позиционирование дочерних элементов к родительскому. Для визуального различия префабу был задан материал, красящий танк в синий цвет.

Рисунок 4.8 Префаб Tank_Agent

У этого префаба есть несколько важных компонентов, первый из которых - кубический коллайдер, который обозначен рамкой. Для упрощения все прочие коллайдеры были удалены, а родительскому элементу был добавлен один общий. Из дочерних элементов будет важен shootPoint - точка в пространстве, откуда будет «вылетать» снаряд, поэтому она вынесена за пределы коллайдера, чтобы снаряд не столкнулся с ним сразу же. Также в выпадающем меню Layers был задан специальный слой Players для всех танков, присутствующих на сцене. В дальнейшем это поможет коллайдеру летящего снаряда определять конкретно танки на своём пути.

Следующий важный компонент - Rigidbody. отвечающий за применение к игрвому объекту возможностей встроенного физического движка Unity. Это значит, что на объект действует гравитация, а также к нему можно применять внешние силы, которые приведут его в движение, в данном случае, взрыв снаряда отбросит танк назад. В подменю Constraints можно задать ограничения по перемещению и вращению объекта в каких-либо осях. Учитывая, что танки будут перемещаться только вдоль плоскости, им не требуется подниматься или опускаться, поэтому ось Y была заблокирована.

На рисунке 4.9 указаны скрипты, подключённые к объекту Tank_Agent, среди которых компонент из Behavior Bricks - Behavior Executor, отвечающий за выполнение объектом заданного поведенческого дерева. В него включены необходимые параметры - цель, которую агент пытается поразить, и плоскость, по которой он перемещается. Второй скрипт очень простой и отвечает за имеющееся оборудование танка - тип снаряда и эффективную дальность ствола.

Рисунок 4.9 Скрипты Tank_Agent

Также был создан префаб для цели агента - танк такой же формы, но с материалом красного цвета, под названием Tank_Target. Он также обладает похожими компонентами, за исключением скриптов, поэтому в целях демонстрации у противника нет возможности двигаться и стрелять. Вместо этого у него есть собственный скрипт, как на рис. 4.10, отвечающий за вычисление здоровья танка в зависимости от полученного урона, а также выводящий его текущее состояние на интерфейс на экране в виде полосы здоровья.

Рисунок 4.10 Скрипты Tank_Target

Последний созданный префаб - Shell, снаряд танка, изображённый на рис. 4.11, созданный на основе простой капсулы с соответствующим его размерам коллайдером. У самого коллайдера активирован параметр isTrigger, который отключает физическое взаимодействие при столкновении с коллайдером. Это нужно для того, чтобы снаряд, сталкиваясь, не падал на землю, а взрывался и исчезал. Для реализации такого поведения скрипт, отвечающий за вход в триггер, подключён к префабу. В качестве материала - металлический золотистый, а также слабый источник желтого света. Как у физического движущегося объекта, к снаряду подключен компонент Rigidbody.

4.2.3 Построение модели поведения в Unity

При создании модели поведения с помощью Behavior Bricks графический редактор позволил очень легко перенести спроектированное дерево в Unity с минимальными изменениями. Как видно на рис. 4.12, в общих чертах обе модели поведенческого дерева очень похожи за тем исключением, что в Behavior Bricks можно задать бесконечное повторение прохода с помощью декоратора повторения без ущерба функционалу модели.

Рисунок 4.11 Префаб Shell

Это связано с тем, что в заготовленных узлах предусмотрена эффективная обработка исключений, которая посылает сообщение о провале, если нужный объект не назначен в дереве. Таким образом, вместо проверки при каждом проходе, уничтожена ли цель, после её уничтожения агент просто не обнаружит ничего и продолжит патрулировать до тех пор, пока потенциально не найдёт новую цель.

Рисунок 4.12 Модель поведения ShotDefining в Behavior Bricks

Для удобства восприятия некоторые рассмотренные действия были «свёрнуты» в другие модели поведения, на которые ссылается основное дерево. Эти поведенческие деревья были смоделированы отдельно (см. рис. 4.13 и 4.14), и в дальнейшем Behavior Bricks позволил добавить их в качестве крайних узлов, как если бы это были обычные действия. Для наглядности демонстрации поведения игрового агента была добавлена временная задержка, как раз между переходом агента от состояния атаки и перемещения.

Рисунок 4.13 Модель поведения SearchEnemy в Behavior Bricks

Рисунок 4.14 Модель поведения Patrolling в Behavior Bricks

4.2.4 Генерация навигационного меша

Несмотря на то, что задача по разработке навигации не была выбрана, она была выполнена благодаря продвинутым программным средствам Unity. Движок имеет внедрённые алгоритмы навигации и обхода препятствий (Window AI -> Navigation), которые можно настроить, выбрав объект Plane, чтобы определить точность прохождения агента по геометрии сцены. Для более успешного обхода препятствий довольно большим танком радиус агента в настройках был увеличен (см. рис. 4.15). После нажатия на кнопку Bake поверх плоскости появляется область голубого цвета, по которой могут перемещаться агенты, у которых подключён специальный компонент навигации Nav Mesh Agent. Меш нужно генерировать заново при любых изменениях в сцене, например, при добавлении любых статических объектов (см. рис. 4.16), после чего они будут распознаны как препятствия.

Рисунок 4.15 Настройка навигационного меша

Рисунок 4.16 Навигационный меш с препятствием

4.2.5 Разработка скриптов

Используемые расширения и среда игрового движка Unity в целом, несмотря на удобство и простоту использования, не позволяют полностью отказаться от программирования определённого поведения по той причине, что оно не предусмотрено внутренними скриптами. Стрельба по целям - довольно специфичная задача, которую нужно решать с помощью собственных скриптов, подключённых к объектам, преимущественно к агенту. С исходным кодом скриптов на языке C# можно ознакомиться в Приложении.

Выводы по главе 4

В ходе работы в рамках главы была проведена разработка игрового проекта, которая начиналась с простой постановки необходимого к реализации алгоритма. Благодаря сведениям о текущих и актуальных потребностях заказчика удалось на основе обобщённой постановки составить ряд чётких требований, которые в дальнейшем соответствовали функционалу игрового агента. Подход, используемый при разработке на игровом движке Unity, который предлагает интуитивную работу в собственной среде практически без необходимости прямого программирования, позволил больше времени уделить этапу проектирования поведения игрового агента. В свою очередь, этот этап прошёл без затруднений в т.ч. благодаря выбору поведенческих деревьев (Behavior Trees), в качестве используемой парадигмы проектирования игрового искусственного интеллекта, которая показала свою гибкость при трансформации из иных нотаций моделирования или устаревших систем формирования поведения игрового агента, к примеру, конечного автомата. В целом, полный этап разработки позволил создать полностью рабочего игрового агента, который во время выполнения на постоянной основе корректно исполняет поставленные перед ним задачи, а также удовлетворяет всем поставленным функциональным и нефункциональным требованиям.

В результате этапа реализации была разработана система, в которой игровой агент следует поведения, заданному поведенческим деревом. При выполнении агент движется по геометрии сцены в поисках цели, и после её обнаружения приступает к атаке. Игровой агент способен определить вероятность попадания на основе дистанции между ним и целью и эффективной дальностью агента. Агент способен делать выводы до совершения выстрела о том, что нужно сначала приблизиться к цели. При потере цели из виду (например, при её уничтожении) выйдет из агрессивного режима и продолжит патрулировать по игровой карте.

Заключение

В ходе исследовательской работы была выполнена поставленная цель, заключающаяся в использовании системы формирования поведения игрового агента при реализации алгоритма поведения. В процессе исследовательской работы и разработки были выполнены следующие задачи:

1. Были изучены исследовательские работы, описывающие широко используемые системы формирования поведения игровых агентов - Behavior Trees и Utility AI. Были сделаны выводы о возможностях и границах их применения, какие проблемы вызвали потребность в их появлении и их развитие с момента создания.

2. Были изучены работы разработчиков игр, описывающих в деталях процесс разработки, в т.ч. их обоснование выбора той или иной системы формирования поведения игрового агента, что позволило в общих чертах выделить сильные стороны этих систем.

3. На основе прошлых исследований были выделены критерии сравнения, а также проведён сравнительный анализ. Результатом сравнения оказалась система формирования поведения игрового агента Behavior Trees, выбранная с намерением реализовать с её помощью один из алгоритмов.

4. Рассмотрены широко используемые инструменты разработки с помощью систем формирования поведения игрового агента на популярных игровых движках. Подобран один из предложенных заказчиком для реализации алгоритмов поведения.

5. На основе постановки алгоритма были проведении этапы проектирования и реализации алгоритма определения шанса попадания в цель из огнестрельного оружия.

В ходе исследовательской работы была создана система с игровым агентом, который следует заданным командам в поведенческом дереве и выполняет все поставленные требования. Планируется расширение функционала агента, например, с применением ранее не рассмотренных прецедентов, которые может выполнять игрок в Tanki X. Вполне вероятно, что проделанная работа заинтересует заказчиков из Alternativa Games, и система с полностью функционирующим игровым агентом сможет быть внедрена в основную игру после тестирования.

Библиографический список

1. Kehoe D. Designing Artificial Intelligence for Games (Part 1) [Электронный ресурс] // Intel® Hardware and Software Developer Zone: [сайт]. [2015].

2. Rasmussen J. Are Behavior Trees a Thing of the Past? [Электронный ресурс] // Gamasutra - The Art & Business of Making Games [сайт]. [2016].

3. Champandard A.J., Dunstan P. The Behavior Tree Starter Kit [Электронный ресурс] // Game AI Pro [сайт].

4. Graham D. An Introduction to Utility Theory [Электронный ресурс] // Game AI Pro [сайт].

5. Shead M. State Machines - Basics of Computer Science [Электронный ресурс] // Mark Shead - From Mark's Head [сайт]. [2011].

6. Colledanchise M., Marzinotto A., Цgren P. Performance Analysis of Stochastic BTs // Robotics and Automation (ICRA), 2014.

7. Marzinotto A., Colledanchise M., Smith C., Цgre P. Towards a Unified BTs Framework for Robot Control // Robotics and Automation (ICRA), 2014.

8. Sizer B. The Total Beginner's Guide to Game AI [Электронный ресурс] // GameDev.net - Your Game Development Community [сайт]. [2018]

9. Simpson C. Behavior trees for AI: How they work [Электронный ресурс] // Gamasutra - The Art & Business of Making Games [сайт]. [2014].

10. Anguelov B., Weber B., Vehkala M. AI Arborist: Proper Cultivation and Care for Your Behavior Trees [Электронный ресурс] // GDC Vault [сайт]. [2017].

11. Dill K., Mark D. Improving AI Decision Modeling Through Utility Theory [Электронный ресурс] // GDC Vault [сайт]. [2010]

12. Dill K., Mark D. Embracing the Dark Art of Mathematical Modeling in AI [Электронный ресурс] // GDC Vault [сайт]. [2012].

13. Evans R. Modeling Individual Personalities in The Sims 3 [Электронный ресурс] // GDC Vault [сайт]. [2010].

14. Lim C., Baumgarten R., Colton S. Evolving Behaviour Trees for the Commercial Game DEFCON // Applications of Evolutionary Computation, pp. 100-110. Springer Berlin Heidelberg, 2010.

15. Behavior Bricks [Электронный ресурс]

16. Barrera R., Kyaw A.S., Swe T.N. Unity 2017 Game AI programming. 3rd Edition. Packt, 2018. 250 p. (дата обращения 14.04.2019).

Приложение

Исходный код скриптов

TankEquipment.cs

using UnityEngine;

public class TankEquipment : MonoBehaviour

{

[Range(0f, 200f)]

public float effectiveRange = 40f;

public GameObject shell;

// Start is called before the first frame update

void Start()

{

if(shell == null)

{

shell = Resources.Load("Prefabs/Shell") as GameObject;

}

}

// Update is called once per frame

void Update()

{

}

}

TankHealth.cs

using UnityEngine;

using UnityEngine.UI;

public class TankHealth : MonoBehaviour

{

public float m_StartingHealth = 100f; // The amount of health each tank

starts with.

public Slider m_Slider; // The slider to represent how much health the tank

currently has.

public Text m_TargetText; // The text with the name of the target.

public Text m_HealthText; // The text with the current health in digits.

public Image m_FillImage; // The image component of the slider.

public Color m_FullHealthColor = Color.green; // The color the health bar

will be when on full health.

public Color m_ZeroHealthColor = Color.red; // The color the health bar

will be when on no health.

public GameObject m_ExplosionPrefab; // A prefab that will be instantiated

in Awake, then used whenever the tank dies.

private ParticleSystem m_ExplosionParticles; // The particle system the will

play when the tank is destroyed.

private float m_CurrentHealth; // How much health the tank currently has.

private bool m_Dead; // Has the tank been reduced beyond zero health yet?

private void Awake()

{

// Instantiate the explosion prefab and get a reference to the particle system

on it.

m_ExplosionParticles =

Instantiate(m_ExplosionPrefab).GetComponent<ParticleSystem>();

// Disable the prefab so it can be activated when it's required.

m_ExplosionParticles.gameObject.SetActive(false);

}

private void OnEnable()

{

m_TargetText.text = gameObject.name;

// When the tank is enabled, reset the tank's health and whether or not it's

dead.

m_CurrentHealth = m_StartingHealth;

m_Dead = false;

// Update the health slider's value and color.

SetHealthUI();

}

public void TakeDamage(float amount)

{

// Reduce current health by the amount of damage done.

m_CurrentHealth -= amount;

// Change the UI elements appropriately.

SetHealthUI();

// If the current health is at or below zero and it has not yet been registered,

call OnDeath.

if (m_CurrentHealth <= 0f && !m_Dead)

{

OnDeath();

}

}

private void SetHealthUI()

{

// Set the slider's value appropriately.

m_Slider.value = m_CurrentHealth;

m_HealthText.text = Mathf.Max(0, (int)m_CurrentHealth).ToString();

// Interpolate the color of the bar between the choosen colours based on the

current percentage of the starting health.

m_FillImage.color = Color.Lerp(m_ZeroHealthColor, m_FullHealthColor,

m_CurrentHealth / m_StartingHealth);

}

private void OnDeath()

{

// Set the flag so that this function is only called once.

m_Dead = true;

// Move the instantiated explosion prefab to the tank's position and turn it on.

m_ExplosionParticles.transform.position = transform.position;

m_ExplosionParticles.gameObject.SetActive(true);

// Play the particle system of the tank exploding.

m_ExplosionParticles.Play();

Destroy(m_ExplosionParticles.gameObject, m_ExplosionParticles.duration);

// Turn the tank off.

gameObject.SetActive(false);

}

}

ShellExplodeControlle.cs

using UnityEngine;

public class ShellExplodeController : MonoBehaviour

{

public LayerMask m_TankMask; // Used to filter what the explosion affects,

this should be set to "Players".

public ParticleSystem m_ExplosionParticles; // Reference to the particles

that will play on explosion.

public float m_MaxDamage = 100f; // The amount of damage done if the

explosion is centred on a tank.

public float m_ExplosionForce = 1000f; // The amount of force added to a

tank at the centre of the explosion.

public float m_MaxLifeTime = 2f; // The time in seconds before the shell is

removed.

public float m_ExplosionRadius = 5f; // The maximum distance away from

the explosion tanks can be and are still affected.

private GameObject proximityArea; // The proximity area

private void Start()

{

// If it isn't destroyed by then, destroy the shell after it's lifetime.

Destroy(gameObject, m_MaxLifeTime);

// Load the shell prefab.

if (proximityArea == null)

{

proximityArea = Resources.Load("Prefabs/Proximity_Area") as

GameObject;

}

}

private void OnTriggerEnter(Collider other)

{

// Collect all the colliders in a sphere from the shell's current position to a

radius of the explosion radius.

Collider[] colliders = Physics.OverlapSphere(transform.position,

m_ExplosionRadius, m_TankMask);

// Go through all the colliders...

for (int i = 0; i < colliders.Length; i++)

{

// ... and find their rigidbody.

Rigidbody targetRigidbody = colliders[i].GetComponent<Rigidbody>();

// If they don't have a rigidbody, go on to the next collider.

if (!targetRigidbody)

continue;

// Add an explosion force.

targetRigidbody.AddExplosionForce(m_ExplosionForce, transform.position,

m_ExplosionRadius);

// Find the TankHealth script associated with the rigidbody.

TankHealth targetHealth = targetRigidbody.GetComponent<TankHealth>();

// If there is no TankHealth script attached to the gameobject, go on to the

next collider.

if (!targetHealth)

continue;

// Calculate the amount of damage the target should take based on it's

distance from the shell.

float damage = CalculateDamage(targetRigidbody.position);

// Deal this damage to the tank.

targetHealth.TakeDamage(damage);

}

// Instantiate the proximity area at the point of an explosion.

proximityArea = GameObject.Instantiate(

proximityArea,

gameObject.transform.position,

Quaternion.identity);

// Unparent the particles from the shell.

m_ExplosionParticles.transform.parent = null;

// Play the particle system.

m_ExplosionParticles.Play();

// Once the particles have finished, destroy the gameobject they are on.

Destroy(m_ExplosionParticles.gameObject, m_ExplosionParticles.duration);

// Destroy the shell.

Destroy(gameObject);

}

private float CalculateDamage(Vector3 targetPosition)

{

// Create a vector from the shell to the target.

Vector3 explosionToTarget = targetPosition - transform.position;

// Calculate the distance from the shell to the target.

float explosionDistance = explosionToTarget.magnitude;

// Calculate the proportion of the maximum distance (the explosionRadius)

the target is away.

float relativeDistance = (m_ExplosionRadius - explosionDistance) /

m_ExplosionRadius;

// Calculate damage as this proportion of the maximum possible damage.

float damage = relativeDistance * m_MaxDamage;

// Make sure that the minimum damage is always 0.

damage = Mathf.Max(0f, damage);

return damage;

}

}

RotateTower.cs

using UnityEngine;

using Pada1.BBCore; // Code attributes

using Pada1.BBCore.Tasks; // TaskStatus

using BBUnity.Actions; // Actions

[Action("MyActions/RotateTower")]

[Help(".")]

public class RotateTower : GOAction

{

private Transform tankTower;

private float rotateAngle;

private float minimal_angle = 0f;

private float maximal_angle = 360f;

public override void OnStart()

{

if (tankTower == null)

{

tankTower = gameObject.transform.Find("Tank_Tower");

if (tankTower == null)

{

Debug.LogWarning(gameObject.name + " has no tank tower");

}

}

base.OnStart();

}

// Main class method, invoked by the execution engine.

public override TaskStatus OnUpdate()

{

if (tankTower == null)

{

return TaskStatus.FAILED;

}

rotateAngle = Random.Range(minimal_angle, maximal_angle) *

Time.deltaTime;

tankTower.RotateAround(tankTower.position, tankTower.up, rotateAngle);

// The action is completed. We must inform the execution engine.

return TaskStatus.COMPLETED;

} // OnUpdate

} // class RotateTower

IsHitChanceHigh.cs

using UnityEngine;

using UnityEngine.UI;

using Pada1.BBCore;

using BBUnity.Conditions;

[Condition("MyConditions/IsHitChanceHigh")]

[Help("")]

public class IsHitChanceHigh : GOCondition

{

[InParam("target", DefaultBlackboardEntry = "target")]

[Help("")]

public GameObject target;

[InParam("chanceThreshold", DefaultValue = 100f)]

[Help("")]

public float chanceThreshold;

private Text chanceText; // The text on UI where the chance is displayed.

private float hitChance; // The chance of successful hit.

private bool isAttacking; // This determines if agent should fire or not.

public static float actualDistance; // The distance between agent and target.

public override bool Check()

{

// Assess the hit chance with the set of values.

CalculateHitChance();

// Check how the hit chance is compared to set threshold.

if (hitChance < chanceThreshold)

{

isAttacking = false;

}

else

{

isAttacking = true;

}

// Change the UI elements appropriately.

SetChanceUI();

return isAttacking;

}

private void CalculateHitChance()

{

actualDistance = Vector3.Distance(gameObject.transform.position,

target.transform.position);

TankEquipment equipment =

gameObject.GetComponent<TankEquipment>();

if (2 * actualDistance > equipment.effectiveRange +

equipment.shell.GetComponent<ShellExplodeController>().m_ExplosionRa

dius)

{

hitChance = 0f;

}

else

{

hitChance = 100f;

}

}

private void SetChanceUI()

{

chanceText = GameObject.Find("Chance_Text").GetComponent<Text>();

if(chanceText == null)

{

Debug.LogWarning("No UI assigned to" + target.name);

}

else

{

chanceText.text = "Hit chance: " + hitChance + "%. ";

if (isAttacking == true)

{

chanceText.text += "Commencing the shot.";

}

else

{

chanceText.text += "Not doing it, sorry.";

}

}

}

}

ShootTarget.cs

using UnityEngine;

using Pada1.BBCore; // Code attributes

using Pada1.BBCore.Tasks; // TaskStatus

using BBUnity.Actions; // GOAction

/// <summary>

/// ShootTarget is a action inherited from GOAction and Clone a 'shell' and

shoots

/// it throught the Forward axis with the specified velocity.

/// </summary>

[Action("MyActions/ShootTarget")]

[Help("Clone a 'bullet' and shoots it throught the Forward axis with the " +

"specified velocity.")]

public class ShootTarget : GOAction

{

private Transform shootPoint; // A point in front of a tank from which a shell

will appear.

private TankEquipment equipment; // An equipment of the tank.

public GameObject shell;

public float velocity; // Initial speed of a fired shell.

/// <summary>Initialization method of DoneShootOnce.</summary>

/// <remarks>If the shootPoint is not established, we look for the shooting

point.</remarks>

// Initialization method. If not established, we look for the shooting point.

public override void OnStart()

{

if (shootPoint == null)

{

shootPoint =

gameObject.transform.Find("Tank_Tower").Find("shootPoint");

if (shootPoint == null)

{

Debug.LogWarning("Shoot point not specified. ShootOnce will not work " +

"for " + gameObject.name);

}

}

equipment = gameObject.GetComponent<TankEquipment>();

shell = equipment.shell;

velocity = equipment.effectiveRange;

} // OnStart

/// <summary>Update method of DoneShootOnce.</summary>

/// <remarks>Instantiate the bullet prefab, Search the RigitBody component

in bullet instance. We add a rigitBody to bullet

/// if doesnґt exist, and then we give it a velocity.</remarks>

/// <returns>Return FAILED if the shootPoint is null, and COMPLETE

otherwise.</returns>

// Main class method, invoked by the execution engine.

public override TaskStatus OnUpdate()

{

if (shootPoint == null)

{

return TaskStatus.FAILED;

}

// Instantiate the bullet prefab.

GameObject newBullet = GameObject.Instantiate(

shell, shootPoint.position,

shootPoint.rotation * shell.transform.rotation

) as GameObject;

// Give it a velocity

if (newBullet.GetComponent<Rigidbody>() == null)

// Safeguard test, altough the rigid body should be provided by the

// prefab to set its weight.

newBullet.AddComponent<Rigidbody>();

newBullet.GetComponent<Rigidbody>().velocity = velocity *

shootPoint.forward;

// The action is completed. We must inform the execution engine.

return TaskStatus.COMPLETED;

} // OnUpdate

} // class ShootTarget

ApproachTarget.cs

using UnityEngine;

using Pada1.BBCore; // Code attributes

using Pada1.BBCore.Tasks; // TaskStatus

using BBUnity.Actions; // GOAction

[Action("MyActions/ApproachTarget")]

[Help(".")]

public class ApproachTarget : GOAction

{

public override void OnStart()

{

base.OnStart();

} // OnStart

public override TaskStatus OnUpdate()

{

TankEquipment equipment =

gameObject.GetComponent<TankEquipment>();

gameObject.transform.position += (IsHitChanceHigh.actualDistance -

equipment.GetComponent<TankEquipment>().effectiveRange / 2) *

gameObject.transform.forward;

return TaskStatus.COMPLETED;

} // OnUpdate

} // class ApproachTarget

Размещено на allbest.ru

...

Подобные документы

  • Сбор и анализ сведений по предметной области по дисциплине "Астрономия" с целью разработки обучающего игрового приложения. Исследование алгоритмов и характеристик существующих программных систем аналогов. Разработка архитектуры программной системы.

    курсовая работа [4,1 M], добавлен 27.11.2014

  • Анализ и виды интеллектуальных агентов в системе дистанционного обучения и их характеристики. Построение интеллектуального агента глоссария на платформе Jadex с помощью XML формата. Среда разработки и описание интеллектуального агента с помощью BDI.

    курсовая работа [113,6 K], добавлен 10.02.2011

  • Изучение существующих подходов к использованию компьютерных игр в образовательном процессе. Разработка и реализация проекта игрового обучающего приложения на мобильной платформе. Выбор платформы и средств реализации игрового обучающего приложения.

    дипломная работа [3,4 M], добавлен 12.08.2017

  • Обзор системного и прикладного программного обеспечения используемого в ООО "Игровые системы". Описание компьютерной сети предприятия. Разработка игрового продукта для планшетов Apple iPad. Реализация визуального интерфейса и алгоритма работы модуля.

    отчет по практике [1,4 M], добавлен 18.01.2015

  • Разработка игрового проекта на игровом движке Unity 3D в среде программирования MS Visual Studio 2017. Блок-схема алгоритма работы приема сообщений с сервера на клиенте с упрощенным описанием выполняемых команд. Реализация пользовательского интерфейса.

    курсовая работа [1,5 M], добавлен 10.07.2017

  • Подбор игрового движка и описание его основных характеристик. Разработка структуры, алгоритма и интерфейса программы. Проектирование иерархии классов. Выделение типового приема визуализации. Тестирование правильности работы программного обеспечения.

    курсовая работа [3,1 M], добавлен 19.01.2017

  • Разработка программного продукта, предназначенного для имитации физического взаимодействия между объектами на основе игрового симулятора. Проектирование программы "LonelySpaceRanger", код которой представлен на языке VisualС++. Разработка интерфейса.

    дипломная работа [3,2 M], добавлен 30.11.2011

  • Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.

    дипломная работа [4,5 M], добавлен 19.01.2017

  • Разработка компьютерных игр как зрелищная и наиболее сложная отрасль программирования. Рассмотрение основных особенностей конструирования классов CGame и Players, а также алгоритмов вычисления траектории полета снаряда. Анализ алгоритма PassivePlayer.

    курсовая работа [5,1 M], добавлен 22.02.2013

  • Технология программных агентов. Форматы метаданных, использующиеся для описания электронных ресурсов. Разработка интеллектуальных агентов. Среда разработки Jadex для построения интеллектуальных агентов. BDI модель интеллектуального агента ресурсов.

    курсовая работа [279,8 K], добавлен 20.02.2011

  • Базовые характеристики агента, требования к программированию. Особенности архитектуры, организуемой в виде нескольких уровней, представляющих разные функциональные характеристики. Проблемы многоагентных систем при реализации идеи коллективного поведения.

    презентация [255,2 K], добавлен 25.06.2013

  • Преимущества операционной системы Android. Проектирование интерфейса приложений. Визуальные редакторы и средства кроссплатформенной разработки. Оптимизация игрового процесса, выбор фреймворка и библиотек. Классификация и характеристика игр по жанрам.

    дипломная работа [2,6 M], добавлен 10.07.2017

  • Анализ игровых жанров для мобильных устройств и целевой аудитории. Разработка концепции игрового приложения, основной механики, меню и интерфейса игры. Описание переменных скриптов. Реализация выбора цели и стрельбы. Настройка работоспособности игры.

    дипломная работа [1,4 M], добавлен 19.01.2017

  • Изучение существующих подходов к использованию компьютерных игр в образовательном процессе. Особенности использования мобильного обучения. Методика и этапы закрепления полученных ранее знаний с использованием игрового приложения на мобильной платформе.

    дипломная работа [813,0 K], добавлен 27.10.2017

  • Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.

    дипломная работа [1,5 M], добавлен 09.11.2016

  • Написание игры "Lines" на языке Object Pascal в среде Delphi. Алгоритм работы программы. Описание метода генерации поля. Используемые константы и переменные. Форма приложения после старта игрового процесса. Основные элементы формы и обработки событий.

    курсовая работа [225,0 K], добавлен 12.04.2012

  • Разработка инструментального средства для обнаружения уязвимостей веб-приложений на основе контроля поведения с функцией автоматического построения профилей нормального поведения. Основные методы обнаружения аномалий, анализ возможности их применения.

    курсовая работа [865,8 K], добавлен 02.02.2015

  • Знакомство с особенностями и этапами разработки приложения для платформы Android. Рассмотрение функций персонажа: бег, прыжок, взаимодействие с объектами. Анализ блок-схемы алгоритма генерации платформ. Способы настройки функционала рабочей области.

    дипломная работа [3,4 M], добавлен 19.01.2017

  • История создания компьютерных игр. Обзор современных игровых жанров. Выбор используемых инструментов. Руководство пользователя. Разработка игры в жанре 3D шутера от первого лица. Конструктор игр Game Maker. Создание уровня с несколькими регионами.

    курсовая работа [961,8 K], добавлен 22.06.2015

  • Анализ деятельности группы компаний "Инрэко ЛАН". Общая характеристика, основы проектирования и разработка операционной системы Android. Этапы разработки программного игрового приложения с использованием физики. Скриншоты, отображающие игровой процесс.

    отчет по практике [2,7 M], добавлен 19.07.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.