Создание квеста типа «Принеси» в Unity 5

Создание квеста типа «Принеси» в Unity 5

Как сделать квест типа «Принеси» в Unity 5

Давайте рассмотрим ситуацию, когда вам необходимо реализовать в своей игре простую миссию, в которой нужно принести какой-то предмет.

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

Сцена в Unity 5

Создадим три 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.

Выбор тэга 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; // при нажатии на которую, окно просто закроется;
               }
             }
           }
         }
       }
     }

Сохраните скрипт. И повешайте его на персонажа с которым нужно поговорить (Cube). В поле missionTag укажите тэг sphere, который необходимо добавить.

Скрипт missionbot на втором персонаже

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

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

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

Скрипт 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); // и удаляем этот объект со сцены; 
              } 
            } 
          } 
        }

Вешаем этот скрипт на объект, который необходимо подобрать (Sphere) и меняем его тэг на sphere.

Выбор тэга на сфере

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

Проверьте правильность выбора всех тэгов, ваш персонаж – тэг Player, предмет для подбора – тэг который мы указали sphere. Так же, проверьте поле missionTag в скрипте missionbot. Там должен быть указан тэг предмета, который нужно подобрать.  Запустите игру и посмотрите как работает выполнение квеста.

Из возможных «багов», которые могут возникнуть, это проблемы с отображением курсора. Если у вас возникли другие проблемы  или предложения, пишите в комментариях, мы обязательно ответим. Использовано Unity 5.3.2f1 (64-bit).

Предыдущий урок         На главную        Следующий урок

Обсудить на форуме


Оставить Комментарий