Вход

Использование элементов искусственного интеллекта в игровом приложении

Рекомендуемая категория для самостоятельной подготовки:
Дипломная работа*
Код 259934
Дата создания 27 июля 2015
Страниц 68
Мы сможем обработать ваш заказ (!) 19 декабря в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
3 560руб.
КУПИТЬ

Описание

Целью этой дипломной роботы является разнообразие и усовершенствование игрового приложения в жанре «Стелс» с помощью использования методов и моделей искусственного интеллекта.
Игра была реализована в виде одного игрового уровня с в виде большого помещения (лаборатории), различных препятствий в виде камер наблюдения, двери и лазерных решеток, и стражей с искусственным интеллектом.
Наиболее актуальным моментом в приложении есть очень большая популярность, стремительное развитие и большое будущее игровой индустрии, влекущее за собой спрос на специалистов в этой области. Однако главной задачей было разнообразие игрового процесса с помощью искусственного интеллекта, что позволило бы сделать игру еще более интересной и сложной.
Приложение разработано на игровом движке «Unity» с использованием яз ...

Содержание

Введение 8
1 АНАЛИЗ предметной ОБЛАСТИ И ОБОСНОВАНИЕ СРЕДСТВ РЕАЛИЗАЦИИ ПРОГРАММНОГО ПРОДУКТА 9
1.1 Введение в искусственный интеллект (ИИ) 9
1.2 Игровой искусственный интеллект 13
1.3 Этапы интеграции элементов искусственного интеллекта в игровой приложении 15
1.3.1 Постановка задачи 15
1.3.2 Вибиз средств разработки 16
2 ПРОЕКТИРОВАНИЕ игровых приложений и выбор оптимального 2 ВАРИАНТ РЕАЛИЗАЦИИ ЭЛЕМЕНТОВ искусственного интеллекта в игровых приложениях 23
2.1 Блок схемы алгоритма скрипта EnemyAI 23
2.2 Выбор алгоритма поиска пути 24
2.2.1 «NavMesh» 25
3 РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА 26
3.1 Настройка «стражей» и размещения их на сцене 26
3.2 Создание «AnimationController» 31
3.2 Написание сценария «EnemySight», что выдповидае за поле зрения дежурного 35
3.4 Написание вспомогательного скрипта «EnemySetup» 39
3.5 Создание скрипта «EnemyAnimation» 40
3.6 Написание сценария «EnemyShooting», что э ответственным за ведение огня по игроку 41
3.7 Создание скрипта «EnemyAI», по помощь и которого стражи смогут принимать решения на данных о местоположении игрока 45
4 ОХРАНА ТРУДА 50
4.1 Общие требования для компьютерных помещений 52
4.2 Производственная физкультура и психологическая разгрузка для специалистов-компьютерщиков 55
4.3 Требования к персоналу по ремонту и техобслуживанию ЭВМ 58
4.4 Технические способы профилактики нарушений здоровья специалистов 61
ВЫВОДЫ 62
ПЕРЕЧЕНЬ ССЫЛОК 64
ПРИЛОЖЕНИЕ П # - код «EnemyShooting» 63
ПРИЛОЖЕНИЕ С # - код «EnemySight» 6

Введение

Разработка видеоигры (англ. Video game development) - это процесс создания видео игры, которым занимается разработчик видеоигр (англ. Video game developer), который может быть как одним человеком так и компанией с сотнями сотрудников. Игра может разрабатываться как силами нескольких людей с ограниченным бюджетом, так и опираясь на финансирование от издателя (англ. Video game publisher). Продолжительность и стоимость разработки зависит от сложности проекта.
Коммерческая разработка видеоигр началась в 70-е годы 20 века, вместе с появлением первых аркадных автоматов и домашних игровых приставок. Из-за незначительной мощность первого компьютерного оборудования, игры были простыми и не требовали значительных затрат и времени на разработку, которой мог заниматься и успешно завершать один програм мист. С ростом вычислительных мощностей и требований игроков, выросла и сложность проектов, которые стали требовать работы целых команд профессионалов.
Разработка игры проходит в несколько этапов. В начале создается общий проект будущей игры, пишется дизайн-документ с описанием вселенной, игрового процесса и сюжета, создаются графические концепты уровней и персонажей, которые будут определять стилистику игры и которые будут служить ориентиром для художников. Дизайн-документ и рисунки также используются для привлечения внимания издателей. Если отсутствуют проблемы с финансированием, начинается полноценная работа над игрой, которая включает разработку и настройки под нужды игры игрового движка, создание графического, трехмерного и аудио наполнение игры, внедрение и тестирование игровых механик (игровой дизайн). К своей окончательной версии игра идет через альфа и бета версии, которые тщательно проверяют и тестируют, иногда проводя открытые тестирования с участием игроков (открытии альфа / бета-тесты). Через некоторое время после последних проверок и тестирования, игра «выходит на золото»

Фрагмент работы для ознакомления

тоді зробити пресонально позицію глобальною
personalLastSighting = lastPlayerSighting.position;
тоді зробити попердній погляд данним поглядом
previousSighting = lastPlayerSighting.position;
Якщо гравець живий, то
if(playerHealth.health > 0f)
задати параметр анімації для цього випадку
anim.SetBool(hash.playerInSightBool, playerInSight);
else
інакше поставити цей параметр як false
anim.SetBool(hash.playerInSightBool, false);
4) Наступне це написання функції OnTriggerStay, тобто функції яка відповідає за спроцьоування сферичного колайдера. Для його спрацьоування повинно виконуватися 3 умови: гравець навпроти вартового, ніщо не стоїть на перешкоді, щоб його побачити і гравець знаходиться у сферичному колайдері. Для цього нам потрібно поставити, в зоні колайдера, але інші 2 умови не спрацьовують то він по стандарту буде як false. Далі створимо вектор від вартового до гравця і будемо зберігати в ньому кут між гравцем і і поглядом вперед і якщо кут між прямим поглядом і гравцем меньше ніж половина кута бачення, то гравець знаходиться у полі зору. Продемонструю це на рис. 15 та рис. 16:
Рисунок 15 – Гравець попадае у поле зору вартового
Рисунок 16 – Визначення чи попав гравець у поле зору за кутом погляду прямо і кутом між гравцем
5) Наступне завдання це реалізація слуху вартових, з урахуванням того що звук не проходить крізь закриті приміщення і звук має дистанцію пощирення і ще дистанцію яку проходить звук є ламаную і якщо вона перевищую радіус слуху вартового то він не має її чути, як це наведенно на рис. 17. Для цього на доведеться рахувати маршрути, створивши ламаний шлях з усіма точками від гравця до вартового як наведенно на рис. 17 і рис. 18:
Рисунок 17 – Шлях до гравця є ламаним
Рисунок 18 – Розділення шляху на відрізки
6) Розрахунок шляху показаний на рис. 19 і повний скрипт буде приведений у додатку до диплому:
Рисунок 19 – Розрахунок довжини шляху
7) Написання допоміжного скрипту «EnemySetup»
Для того, щоб скрипт який буде відповідати за зміну анімацій не був захаращений нам знадобиться допоміжний скрипт «EnemySetup» у якому будуть описані значення швидкості виконання анімацій для уникнення спотвореня руху вартових. Код скрипту приведений нижче:
using UnityEngine;
using System.Collections;
public class AnimatorSetup
{
public float speedDampTime = 0.1f;
//Час дампінгу для Speed parameter.
public float angularSpeedDampTime = 0.7f;
//Час дампінгу для AngularSpeed parameter
public float angleResponseTime = 0.6f;
//Час дампінгу для повороту агента angularSpeed.
private Animator anim;
//Оголошення animator component.
private HashIDs hash;
//Оголошення HashIDs скрипту
//Конструктор
public AnimatorSetup(Animator animator, HashIDs hashIDs)
{
anim = animator;
hash = hashIDs;
}
public void Setup(float speed, float angle)
{
// Angular speed is the number of degrees per second.
float angularSpeed = angle / angleResponseTime;
// Set the mecanim parameters and apply the appropriate damping to them.
anim.SetFloat(hash.speedFloat, speed, speedDampTime, Time.deltaTime);
anim.SetFloat(hash.angularSpeedFloat, angularSpeed, angularSpeedDampTime, Time.deltaTime);
}
}
3.5. Створення скрипту «EnemyAnimation»
1) Тут буде створено скрипт який буде кирувати аніматором, який в свою чергу будет рухати модель-вартового, буручи рухи з анімаційного клипу зо ми разробили раніше. Параметри аніматора контролюють які анімації аніматор попинен програвати, а ті в свою чергу рухи які вони повинні виконувати.
2) При використанні NavMesh система надає вартовому бажану швилкість і він рухаеться як наведенно на рис. 20; черною стрылкою показана швидкість руху, а зеленою показана бажана швидкість. Лістинг коду буде представлений у додатку.
Рисунок 20 – Маршрут вартового
3.6. Написання скрипту «EnemyShooting», що э відповідальним за ведення вогню по гравцю
1) Для початку перенесемо на сцену бластер вартового, якого буде вестись вогонь і розташуему за вказаними на рис. 21 позиціями:
Рисунок 21 – Координати розміщення бластеру
2) Тепер потрібно додати ефект пострілу до балстера. Перенесемо об’єкт fx_lasershot на наш бластер зробивши його дочірнім об’єктом бластера і додамо до нього LightRenderer з такими параметрами, як на рис. 22:
Рисунок 22 - Додання Light Renderer до бластера
3) Створимо скрипт під назвою EnemyShoting код якого буде прикладений у додатку. В ньому ми опишемо і реалізуемо кількість шкоди в одиницях яку наносить вартовий при пострілі, максимальну і мінімальну кількість шкоди яка градуеться в залежності від відстані між гравцем та вартовим. Визначимо інтенсивність спалаху світла при пострілі. Визначимо коли повинен відкриватися вогонь і коли припинятися. Додамо аудіокліп зі звуками пострілу, який ми прикріпимо до бластера.
Лістинг скрипту EnemyShooting:
using UnityEngine;
using System.Collections;
public class EnemyShooting : MonoBehaviour
{
public float maximumDamage = 120f;
// The maximum potential damage per shot.
Public float minimumDamage = 45f;
// The minimum potential damage per shot.
Public AudioClip shotClip;
// An audio clip to play when a shot happens.
Public float flashIntensity = 3f;
// The intensity of the light when the shot happens.
Public float fadeSpeed = 10f;
// How fast the light will fade after the shot.
Private Animator anim;
// Reference to the animator.
Private HashIDs hash;
// Reference to the HashIDs script.
Private LineRenderer laserShotLine;
// Reference to the laser shot line renderer.
Private Light laserShotLight;
// Reference to the laser shot light.
Private SphereCollider col;
// Reference to the sphere collider.
Private Transform player;
// Reference to the player’s transform.
Private PlayerHealth playerHealth;
// Reference to the player’s health.
Private bool shooting;
// A bool to say whether or not the enemy is currently shooting.
Private float scaledDamage;
// Amount of damage that is scaled by the distance from the player.
Void Awake ()
{
// Setting up the references.
Anim = GetComponent<Animator>();
laserShotLine = GetComponentInChildren<LineRenderer>();
laserShotLight = laserShotLine.gameObject.light;
col = GetComponent<SphereCollider>();
player = GameObject.FindGameObjectWithTag(Tags.player).transform;
playerHealth = player.gameObject.GetComponent<PlayerHealth>();
hash = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<HashIDs>();
// The line renderer and light are off to start.
laserShotLine.enabled = false;
laserShotLight.intensity = 0f;
// The scaledDamage is the difference between the maximum and the minimum damage.
scaledDamage = maximumDamage – minimumDamage;
}
void Update ()
{
// Cache the current value of the shot curve.
Float shot = anim.GetFloat(hash.shotFloat);
// If the shot curve is peaking and the enemy is not currently shooting…
if(shot > 0.5f && !shooting)
// … shoot
Shoot();
// If the shot curve is no longer peaking…
if(shot < 0.5f)
{
// … the enemy is no longer shooting and disable the line renderer.
Shooting = false;
laserShotLine.enabled = false;
}
// Fade the light out.
laserShotLight.intensity = Mathf.Lerp(laserShotLight.intensity, 0f, fadeSpeed * Time.deltaTime);
}
void OnAnimatorIK (int layerIndex)
{
// Cache the current value of the AimWeight curve.
Float aimWeight = anim.GetFloat(hash.aimWeightFloat);
// Set the IK position of the right hand to the player’s centre.
Anim.SetIKPosition(AvatarIKGoal.RightHand, player.position + Vector3.up);
// Set the weight of the IK compared to animation to that of the curve.
Anim.SetIKPositionWeight(AvatarIKGoal.RightHand, aimWeight);
}
void Shoot ()
{
// The enemy is shooting.
Shooting = true;
// The fractional distance from the player, 1 is next to the player, 0 is the player is at the extent of the sphere collider.
Float fractionalDistance = (col.radius – Vector3.Distance(transform.position, player.position)) / col.radius;
// The damage is the scaled damage, scaled by the fractional distance, plus the minimum damage.
Float damage = scaledDamage * fractionalDistance + minimumDamage;
// The player takes damage.
playerHealth.TakeDamage(damage);
// Display the shot effects.
ShotEffects();
}
void ShotEffects ()
{
// Set the initial position of the line renderer to the position of the muzzle.
laserShotLine.SetPosition(0, laserShotLine.transform.position);
// Set the end position of the player’s centre of mass.
laserShotLine.SetPosition(1, player.position + Vector3.up * 1.5f);
// Turn on the line renderer.
laserShotLine.enabled = true;
// Make the light flash.
laserShotLight.intensity = flashIntensity;
// Play the gun shot clip at the position of the muzzle flare.
AudioSource.PlayClipAtPoint(shotClip, laserShotLight.transform.position);
}
}
3.7 Створення скрипту «EnemyAI», за допомогую якого вартові зможуть приймати рішення базовоні на даннах про місцезнаходження гравця
1) Скрипт буде приймати рішення на основі даннич отриманних від інших скриптів. Створимо скрипт EnemyAI і почнемо редагування.
2) Наш вартовий має три стани: патруль, стрільба і переслідування та ще дві змінні такі як: зупинка після зміни стану, та масив маршрутів кожного з вартових:
Оголосимо ці змінні:
public float patrolSpeed = 2f;
// The nav mesh agent's speed when patrolling.
public float chaseSpeed = 5f;
// The nav mesh agent's speed when chasing.
public float chaseWaitTime = 5f;
// The amount of time to wait when the last sighting is reached.
public float patrolWaitTime = 1f;
// The amount of time to wait when the patrol way point is reached.
public Transform[] patrolWayPoints;
// An array of transforms for the patrol route.
3) Оголосимо ще декілька приватних змінних:
private EnemySight enemySight;
private NavMeshAgent nav;
private Transform player;
private PlayerHealth playerHealth;
private LastPlayerSighting lastPlayerSighting;
private float chaseTimer;
private float patrolTimer;
private int wayPointIndex;
4) Створимо функцію Awake(), в якій встановимо нащі посилаяя
void Awake ()
{
// Setting up the references.
enemySight = GetComponent<EnemySight>();
nav = GetComponent<NavMeshAgent>();
player = GameObject.FindGameObjectWithTag(Tags.player).transform;
playerHealth = player.GetComponent<PlayerHealth>();
lastPlayerSighting = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<LastPlayerSighting>();
}
5) Написання функцій стану вартового Patrolling(), Chasing(), Shoting() і функцію Update(), реалізуемо в функції Update() ієрархію пріорітетів стану вартового:
void Update ()
{
// If the player is in sight and is alive...
if(enemySight.playerInSight && playerHealth.health > 0f)
// ... shoot.
Shooting();
// If the player has been sighted and isn't dead...
else if(enemySight.personalLastSighting != lastPlayerSighting.resetPosition && playerHealth.health > 0f)
// ... chase.
Chasing();
// Otherwise...
else
// ... patrol.
Patrolling();
}
6) Дописуємо функції станів:
void Update ()
{
// If the player is in sight and is alive...
if(enemySight.playerInSight && playerHealth.health > 0f)
// ... shoot.
Shooting();
// If the player has been sighted and isn't dead...
else if(enemySight.personalLastSighting != lastPlayerSighting.resetPosition && playerHealth.health > 0f)
// ... chase.
Chasing();
// Otherwise...
else
// ... patrol.
Patrolling();
}
void Shooting ()
{
// Stop the enemy where it is.
nav.Stop();
}
void Chasing ()
{
// Create a vector from the enemy to the last sighting of the player.
Vector3 sightingDeltaPos = enemySight.personalLastSighting - transform.position;
// If the the last personal sighting of the player is not close...
if(sightingDeltaPos.sqrMagnitude > 4f)
// ... set the destination for the NavMeshAgent to the last personal sighting of the player.
nav.destination = enemySight.personalLastSighting;
// Set the appropriate speed for the NavMeshAgent.
nav.speed = chaseSpeed;
// If near the last personal sighting...
if(nav.remainingDistance < nav.stoppingDistance)
{
// ... increment the timer.
chaseTimer += Time.deltaTime;
// If the timer exceeds the wait time...
if(chaseTimer >= chaseWaitTime)
{
// ... reset last global sighting, the last personal sighting and the timer.
lastPlayerSighting.position = lastPlayerSighting.resetPosition;
enemySight.personalLastSighting = lastPlayerSighting.resetPosition;
chaseTimer = 0f;
}
}
else
// If not near the last sighting personal sighting of the player, reset the timer.
chaseTimer = 0f;
}
void Patrolling ()
{
// Set an appropriate speed for the NavMeshAgent.
nav.speed = patrolSpeed;
// If near the next waypoint or there is no destination...
if(nav.destination == lastPlayerSighting.resetPosition || nav.remainingDistance < nav.stoppingDistance)

Список литературы

1. AIChallangeFAQ. Google ai challenge faq // Справочник Google. – Режим доступа: http://ai-contest.com/faq.php. – 17.09.2009
2. Turing A. Computing machinery and intelligence / A. Turing. – Mind, 1950. – 59 р.
3. Buckland M.. Programming game AI by example / M. Buckland. - «Wordware», 2005. – 460 p.
4. Cormen T.H. Introduction to algorithms / T.H. Cormen. – The MIT press, 2001. – 527 p.
5. Playing to lose: Ai and “civilization” // Видео-хостинг YouTube. – Режим доступа: http://www.youtube.com/watch?v=IJcuQQ1eWWI. – 23.08.2010
6. McCulloch W.S. A logical calculus of the ideas immanent in neural nets. Bulletin of Mathematical Biophysics / W.S. McCulloch, W. Pitts. – The MIT press, 1943. – 137 p.
7. Millington I. Artificial intelligence for games. / J. Funge, Kaufmann M. – «Wordware», 2009. – 245 p.
8. H. Moravec. When will computer hardware match the human brain.// Journal of Evolution and Technology. – 1998. – № 14. – 17 p.
9. Рамбиди Н. Г Био-молекулярные нейросетевые устройства. Радиотехника / Е. П. Гребенников, А. И. Адамацкий, А. Г. Девятков, Д. В. Яковенчук. – ИКФ «Каталог», 2002. – 98 с.
Очень похожие работы
Найти ещё больше
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00466
© Рефератбанк, 2002 - 2024