Привет! Помогите определится, как можно сделать выбор событий. Например, у меня есть 3 персонажа. После убийства одного из них игрок получает фидбек(поседствие его выбора). Разумеется, после разных выборов идут разные последствия.Эти последствия думаю делать в виде текстовых сообщений(добавить image через UI) через setactive(true). Это нормально? Ну и все же главный вопрос, как можно сделать систему выбора и последствий? Сейчас планирую делать через PlaerPrefs, но понимаю, что это сума сойти можно будет. Может есть какие-то более нормальные аналоги? Подскажите где копать
Сообщение отредактировал dreenline - Вторник, 10 Мая 2016, 16:10
Про систему: Если говорить про текстовые квесты, то вся игра по сути граф с переменными. От переменных зависит переход по графу: какой выбор можно сделать из возможных (есть бластер? в выборе - выстрелить из бластера) или повлиять на сюжет неявно (при одном и том же выборе, но учитывая предыдущие). Обычно проблем нет и переменных не много, так проще проработать каждую ветку и так проще запомнить игроку.
Про реализацию: Для работы с графом решений лучше иметь редактор, представляющий граф как блок схемы с переходами, чем указывать всё в коде. Конечно если у тебя не текстовый квест и всего несколько переменных влияющих на мир, то почему бы просто не обращаться к ним напрямую в коде.
1. Про нормально ли выводить текст через Image, не знаю, зависит от ситуации. 2. Для простых переменных PlayerPrefs сойдёт и не понимаю почему тебе это не подходит, возможно ты собираешься добавлять очень много влияющих переменных, что само по себе странно. Здесь вообще вопрос про хранение данных в постоянной памяти, я не эксперт, но свой ответ про сериализацию данных делал http://gcup.ru/forum/59-69742-1. PlayerPrefs это по сути хранилище ключ-значение, которое также реализуемо через сериализацию и которое удобнее, чем создание класса со всеми переменными, хранящими каждый выбор. Кроме этого есть дополнения для хранения переменных в постоянной памяти, иногда даже без написания кода https://www.assetstore.unity3d.com/en....ory:113.
Lertmind, Я приведу пример, что я хочу получить) Игрок находится в доме, в этом доме он может подойти к столу, на котором маленький мир, что-то типо 3д карты, как в скайриме(между мирами можно перемещаться, я хочу сделать это через setActive. То есть, если игрок выбирает 1 мир, он становится true, если после этого он выбирает другой мир, данный мир становится false, а новый мир - true). В этом мире ходят люди. Некоторые люди просят игрока о помощи. Например: крестьянин говорит, что на его дом нападают волки. Даны 3 варианта ответа(расставить капканы, спрятаться в доме или уехать в другое место. Или игрок может найти в доме книгу и почитать, что лучше сделать в такой стиуации. В зависимости от выбора игрока, ему через некоторое время приходит фидбек, что произошло с крестьянином. Если игрок все сделал правильно, у него повышается мораль, если же из-за него крестьянин погиб, то мораль уменьшается. Кажется понял, что пока надо курить диалоговую и event систему
Сообщение отредактировал dreenline - Вторник, 10 Мая 2016, 21:01
Кажется понял, что пока надо курить диалоговую и event систему
Да. Примерно это и хотел сказать. Глобально у тебя влияет только мораль (я бы это назвал репутацией в данном примере), которая является результатом квеста от NPC. Сам квест - это система диалогов, которую я называл выше графом выбора.
Lertmind, Я кажется понял, как я смогу сделать. Я добавлю скрипт, что бы при нажатии на персонажа высвечивался текст(через ui-> image и setActive). Соответственно в этом image создам кнопки с выбором, при нажатии на которые будет высвечиваться еще один image с фидбеком, и за нажатие на кнопку получу соответственную репутацию. Просто придется создать много image`в со всеми последствиями, и включать их попеременно. Вроде звучит не сложно Потом погуглю еще диалоговую систему и event систему, хотя мне кажется так как написал я будет по проще. Хотя, как всегда и бывает, как только начну делать, так сразу всплывет куча проблем. Как думаешь, это нормальный способ?
Если выбора будет не много, то возможно и подойдёт, попробуй. Систем диалогов достаточно найдётся. Вообще, я немного смутно представил твоё описание и не понял что ты имеешь в виду под "event система".
Lertmind, Под event системой я имел ввиду, что после выбора одного из вариантов что-то происходит
Добавлено (12 мая 2016, 19:29) --------------------------------------------- Сразу же столкнулся с проблемой :( Сделал 2 скрипта 1) проверяет через RayCast, смотрит ли игрок на книгу, и выводит надпись (нажмите Е для взаимодействия)
Код
using UnityEngine; using System.Collections;
public class RayCastScript : MonoBehaviour {
// Use this for initialization
public GameObject TextCanvas; public bool readyToRead;
void Start () {
}
// Update is called once per frame void Update () { Ray ray = GetComponent<Camera> ().ViewportPointToRay (new Vector3 (0.5F, 0.5F, 0)); RaycastHit hit; if (Physics.Raycast (ray, out hit, 1f)) { if (hit.collider.tag == "Book") { TextCanvas.SetActive (true); readyToRead = true; } } else { TextCanvas.SetActive (false); readyToRead = false; } }
}
2й Если игрок нажимает на Е и смотрит на объект, то открывается картинка с текстом
Код
using UnityEngine; using System.Collections;
public class Books : MonoBehaviour {
private RayCastScript playerLooksAnObject; public GameObject BookTextCanvas;
// Update is called once per frame void Update () {
if (Input.GetKeyDown (KeyCode.E)) { if ((playerLooksAnObject.readyToRead)) { BookTextCanvas.SetActive (true); } } } }
В результате этого появляется ошибка "Object reference not set to an instance of an object". Но я не понимаю, почему. Все тексты и картинки(gameObject`ы) прикреплены к объектам.
Добавлено (13 мая 2016, 18:56) --------------------------------------------- Ап! Помогите, пожалуйста! Никак не могу разобраться в чем ошибка(
Добавлено (13 мая 2016, 22:00) --------------------------------------------- Ура! Я наконец-то решил проблему! Если кому-то понадобится, проблема заключалась в том, что скрипт не мог найти объект с камерой. Пришлось воспользоваться FindObjectWithTag("MainCamera") и после этого все заработало) Вот скрипт который у меня получился в итоге
Код
using UnityEngine; using System.Collections;
public class Books : MonoBehaviour {
public GameObject BookTextCanvas; public GameObject Camera;
// Use this for initialization
void Awake(){ Camera = GameObject.FindGameObjectWithTag("MainCamera"); } void Start () {
}
// Update is called once per frame void Update () {
if ((Camera.GetComponent<RayCastScript>().readyToRead) && Input.GetKeyDown (KeyCode.E)) {