Давайте рассмотрим ситуацию, когда вам необходимо реализовать в своей игре простую миссию, в которой нужно принести какой-то предмет.
Допустим, на вашей сцене есть главный персонаж (FPSController ), персонаж с которым необходимо поговорить (Сube) и объект (Sphere), который необходимо принести этому персонажу.

Создадим три C# скрипта и назовем их missionplayer , missionbot и missionobject. В первом скрипте мы будем реализовывать вывод наименования квеста на экран, определение тэга объекта из другого скрипта и определять взят квест или нет. Во втором, взаимодействие персонажа с другим персонажем, вывод диалогового окна на экран, добавление денег за выполнение квеста. В третьем, взаимодействие персонажа с объектом и подбор предмета.
Скрипт missionplayer
using UnityEngine;
using System.Collections;
public class MissionPlayer : MonoBehaviour {
public bool quest; // отображает название квеста на экране;
public string MissionText; // название квеста;
public string ObjectTag; // тэг объекта;
public bool MissionObjects; //отображает собран предмет или нет;
public int Money; // количество денег;
void OnGUI () {
if(quest) {
GUI.Label(new Rect(20, 80, 300, 30), " " + MissionText); // значение названия квеста будет браться из скрипта Misson Bot;
if(MissionObjects) { // если предмет собран;
GUI.Label(new Rect(150, 80, 200, 30), "[Предмет собран]"); // выводит надпись;
}
}
GUI.Label(new Rect(20, 100, 100, 30), "Деньги: " +Money); // отображает количество денег на экране;
}
}
Поместите этот скрипт на вашего персонажа и измените его тэг на Player.

Скрипт missionbot
UnityEngine;
using System.Collections;
public class MissionBot : MonoBehaviour
{
Видео:Unity3D Урок 34 [Миссии, тип "Принеси"]Скачать
public bool quest; //переменная, которая обозначает взят квест или нет;
public bool vis; // переменная, которая будет отображать диалог между персонажами;
public string missionText; // Текст который будет отображать наименование квеста;
public string missionTag; //Тэг объекта, который необходимо принести;
private MissionPlayer MP; // подключаем скрипт MissionPlayer;
void Start()
{
MP = GameObject.FindGameObjectWithTag("Player").GetComponent<MissionPlayer>(); // определяем что скрипт MissionPlayer будет находится на персонаже с тэгом player;
}
void Update()
{
GameObject MissionTagScanner = GameObject.FindGameObjectWithTag("Player"); // персонаж у которого берем квест будет взаимодействовать только с тем объектом у которого тэг Player;
if (Input.GetKeyDown(KeyCode.E) & Vector3.Distance(transform.position, MissionTagScanner.transform.position) < 2) // При нажатии на клавишу Е и при дистанции между персонажами меньше чем 2;
{
vis = true; // переменная vis принимает значение true;
}
}
void OnGUI()
{
if (vis) // если переменная равна true;
{
if (!quest) // и если квест еще не взят;
{
GUI.Box(new Rect((Screen.width - 300) / 2, (Screen.height - 300) / 2, 300, 300), "Квест"); // то на экране отображается окно с названием Квест;
GUI.Label(new Rect((Screen.width - 300) / 2 + 5, (Screen.height - 300) / 2 + 15, 290, 250), "Принеси мне сферу"); // и текстом который описывает квест;
if (GUI.Button(new Rect((Screen.width - 100) / 2, (Screen.height - 300) / 2 + 250, 100, 40), "Ок")) // при нажатии на кнопку Ok;
{
quest = true; // квест взят;
MP.quest = true; // отображает название квеста на экране;
MP.MissionText = "Принести сферу"; // текст квеста;
MP.ObjectTag = missionTag; // тэг объекта который необходимо принести;
vis = false; // все диалоговые окна закрываются;
}
} else { // если же квест уже взят;
GUI.Box(new Rect((Screen.width - 300) / 2, (Screen.height - 300) / 2, 300, 300), "Квест");
GUI.Label(new Rect((Screen.width - 300) / 2 + 5, (Screen.height - 300) / 2 + 15, 290, 250), "Принес?"); //то описание квеста меняется на другой текст;
if (MP.MissionObjects) // если вы уже подобрали объект;
{
if (GUI.Button(new Rect((Screen.width - 100) / 2, (Screen.height - 300) / 2 + 250, 100, 40), "Да")) // то появится кнопка да, при нажатии на которую;
{
quest = false; // переменная квест принимает значение false, т.е. не взят ;
MP.quest = false; // название квеста не будет отображаться на экране ;
MP.MissionText = ""; // убирается название квеста;
MP.ObjectTag = ""; // обнуляется тэг объекта;
MP.MissionObjects = false; // объект считается не подобранным;
MP.Money = MP.Money + 100; //добавление денег за выполнение квеста;
vis = false; // диалоговое окно закрывается;
}
} else { // если вы еще не подобрали объект;
if (GUI.Button(new Rect((Screen.width - 100) / 2, (Screen.height - 300) / 2 + 250, 100, 40), "Нет")) // то вместо кнопки да, будет кнопка нет;
{
vis = false; // при нажатии на которую, окно просто закроется;
}
}
}
}
}
}
Сохраните скрипт. И повешайте его на персонажа с которым нужно поговорить (Cube). В поле missionTag укажите тэг sphere, который необходимо добавить.

Добавление тэга.


Скрипт MissionObject
using UnityEngine; using System.Collections; public class MissionObject : MonoBehaviour{ private MissionPlayer MP; // опять подключаем скрипт MissionPlayer; void Start() { MP = GameObject.FindGameObjectWithTag("Player").GetComponent<MissionPlayer>(); } // определяем что скрипт MissionPlayer будет находится на персонаже с тэгом player; void OnMouseUp() { if (Input.GetMouseButtonUp(0)) // если при нажатии на правую кнопку мыши; { if (MP.ObjectTag == gameObject.tag) // и при том что тэг объекта равен тому значению которое написано в ObjectTag; { MP.MissionObjects = true; // то переменная принимает значение true, т.е. считается что предмет собран; Destroy(gameObject); // и удаляем этот объект со сцены; } } } }Видео:Unity Rpg - Урок 9 - Опыт, Квест, LevelUpСкачать
Вешаем этот скрипт на объект, который необходимо подобрать (Sphere) и меняем его тэг на sphere.

На этом создание квеста закончено, конечно же, можно создать, для примера, более сложную систему квестов, с несколькими окнами, с возможностью выбора квеста, с добавлением каких-то предметов за выполнение квеста или добавление опыта, но мы пока ограничимся этими функциями, которые описывают основные возможности, а остальное зависит от вашей фантазии.
Проверьте правильность выбора всех тэгов, ваш персонаж – тэг Player, предмет для подбора – тэг который мы указали sphere. Так же, проверьте поле missionTag в скрипте missionbot. Там должен быть указан тэг предмета, который нужно подобрать. Запустите игру и посмотрите как работает выполнение квеста.
Из возможных «багов», которые могут возникнуть, это проблемы с отображением курсора. Если у вас возникли другие проблемы или предложения, пишите в комментариях, мы обязательно ответим. Использовано Unity 5.3.2f1 (64-bit).
🎬 Видео
Задания в Unity 5 | Уроки по вашим заявкамСкачать

Генератор квестов формата: Подай принеси. Квесты для D&D. (По Ту Сторону Страниц)Скачать

Создание миссии на UNITY 5Скачать

Квест в стиле нуар на UnityСкачать

Программирование 2 курс: разработка квеста на Unity3D!Скачать

Unity, квестовая система / quest systemСкачать

Я создал игру на unity 3d деревня квест!Скачать

Система Заданий/Миссий - Unity3d - IndiReplayСкачать

Unity 3d Horror/RPG/Quest Alpha GameplayСкачать

КвестПроект Урок1_Подготовка проектаСкачать

Unity3D Урок 35 [Миссии, тип "Поговори"]Скачать
![Unity3D Урок 35 [Миссии, тип "Поговори"]](https://i.ytimg.com/vi/-OgNVG77JJ4/0.jpg)
RPG MAKER MV●УРОК #2 СОЗДАНИЕ ПРОСТОГО КВЕСТАСкачать

Работаем над 1.0.9. Принципы создания системы заданий (системы квестов).Скачать

Уроки по Unity3d #1 - Интерфейс (перезалив)Скачать

|Делаю игру|: Квест и метроидвания, сразу две игры - Часть 001 - (Unreal Engine 5).Скачать

Тестовое задание unity C# на 4500$. Cмотрим и рефакторимСкачать

Unity3D RPG : Quest for Power #1Скачать

Создаем игру Need for Speed на Unity. Урок 5. Игровые задания.Скачать


![Unity3D Урок 34 [Миссии, тип "Принеси"]](https://i.ytimg.com/vi/6AnwFTK_ujU/0.jpg)









У вас не правильно после .GetComponent! Правильно: .GetComponent();
Будьте внимательны!
Как подкоючить Mission Player скрипт к другому скрипту