Давайте рассмотрим ситуацию, когда вам необходимо реализовать в своей игре простую миссию, в которой нужно принести какой-то предмет.
Допустим, на вашей сцене есть главный персонаж (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 {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; // при нажатии на которую, окно просто закроется; } } } } } }Видео:Задания в Unity 5 | Уроки по вашим заявкамСкачать
Сохраните скрипт. И повешайте его на персонажа с которым нужно поговорить (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); // и удаляем этот объект со сцены; } } } }Видео:Unity3D Урок 34 [Миссии, тип "Принеси"]Скачать
Вешаем этот скрипт на объект, который необходимо подобрать (Sphere) и меняем его тэг на sphere.
На этом создание квеста закончено, конечно же, можно создать, для примера, более сложную систему квестов, с несколькими окнами, с возможностью выбора квеста, с добавлением каких-то предметов за выполнение квеста или добавление опыта, но мы пока ограничимся этими функциями, которые описывают основные возможности, а остальное зависит от вашей фантазии.
Проверьте правильность выбора всех тэгов, ваш персонаж – тэг Player, предмет для подбора – тэг который мы указали sphere. Так же, проверьте поле missionTag в скрипте missionbot. Там должен быть указан тэг предмета, который нужно подобрать. Запустите игру и посмотрите как работает выполнение квеста.
Из возможных «багов», которые могут возникнуть, это проблемы с отображением курсора. Если у вас возникли другие проблемы или предложения, пишите в комментариях, мы обязательно ответим. Использовано Unity 5.3.2f1 (64-bit).
💡 Видео
Unity Rpg - Урок 9 - Опыт, Квест, LevelUpСкачать
Программирование 2 курс: разработка квеста на Unity3D!Скачать
Unity, квестовая система / quest systemСкачать
Квест в стиле нуар на UnityСкачать
Генератор квестов формата: Подай принеси. Квесты для D&D. (По Ту Сторону Страниц)Скачать
Создание миссии на UNITY 5Скачать
КвестПроект Урок1_Подготовка проектаСкачать
Система Заданий/Миссий - Unity3d - IndiReplayСкачать
Unity 3d Horror/RPG/Quest Alpha GameplayСкачать
Unity3D Урок 35 [Миссии, тип "Поговори"]Скачать
Я создал игру на unity 3d деревня квест!Скачать
Работаем над 1.0.9. Принципы создания системы заданий (системы квестов).Скачать
RPG MAKER MV●УРОК #2 СОЗДАНИЕ ПРОСТОГО КВЕСТАСкачать
|Делаю игру|: Квест и метроидвания, сразу две игры - Часть 001 - (Unreal Engine 5).Скачать
Тестовое задание unity C# на 4500$. Cмотрим и рефакторимСкачать
Уроки по Unity3d #1 - Интерфейс (перезалив)Скачать
Создаем игру Need for Speed на Unity. Урок 5. Игровые задания.Скачать
Unity3D RPG : Quest for Power #1Скачать
У вас не правильно после .GetComponent! Правильно: .GetComponent();
Будьте внимательны!
Как подкоючить Mission Player скрипт к другому скрипту