Разработка алгоритма для формирования поведения игрового агента
Анализ систем формирования поведения игрового агента и способов их применения. Описание систем 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