Улучшенная система читов

Улучшенная система читерства в игре, что может быть лучше? Итак, самое главное улучшение, это удобство использования, в первую очередь для разработчика. Система по побольше части представляет из себя некий конструктор. Есть отдельные модули для взаимодействия с полем ввода и текстовым элементом. Список чит-код и вспомогательного списка, создаются отдельно. И всё это работает на одном ядре, так сказать. Добавлена возможность вписать чит из трех слов, например, «get item Sword» ключи запроса здесь «get item» а «Sword» запрашиваемый предмет. Каждое слово должно писаться через пробел. Возможные типы команд; одно, два или три слова.

Для начала создадим enum, с помощью которого будем фильтровать какие функции выполнить:

public enum CheatsSystemEnum
{
	LoadMap,
	GiveMoney,
	GODMode,
	Help
}

Это список для данного урока, в дальнейшем каждый изменит его под свои нужды.

Класс для UI Text, на него будут приходит ответы, после ввода запроса:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

[RequireComponent(typeof(Text))]

public class CheatsSystemAnswer : MonoBehaviour {

	private static Text _text;

	void Awake()
	{
		_text = GetComponent<Text>();
	}

	public static void Answer(string value)
	{
		_text.text = value;
	}
}

Просто цепляем на текстовый элемент и забыли.

Теперь взаимодействие с UI InputField, где игрок будет вбивать текст:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

[RequireComponent(typeof(InputField))]

public class CheatsSystemInput : MonoBehaviour {

	private InputField _input;

	void Awake()
	{
		_input = GetComponent<InputField>();
		_input.onEndEdit.AddListener(delegate{ToSystem(_input.text);});
	}

	void ToSystem(string value)
	{
		CheatsSystem.Cheat(value.Trim());
		_input.text = string.Empty;
	}
}

Отправка текста происходит после нажатия клавиши "Enter".

Теперь основной класс:

using UnityEngine;
using System.Collections;
using System.Text.RegularExpressions;
using UnityEngine.SceneManagement;

public class CheatsSystem : MonoBehaviour {

	[SerializeField] private Key[] keys;
	private static CheatsSystem _internal;
	private string pattern, result;
	private CheatsSystemEnum code;
	private int count;

	void Awake()
	{
		_internal = this;
	}

	public static void Cheat(string value)
	{
		_internal.Decoder(value);
	}

	void Decoder(string value)
	{
		string[] tmp = value.Split(new char[]{' '});

		if(tmp.Length == 3)
		{
			pattern = tmp[0] + " " + tmp[1];
			result = tmp[2];
		}
		else if(tmp.Length == 2)
		{
			pattern = tmp[0];
			result = tmp[1];
		}
		else if(tmp.Length == 1)
		{
			pattern = tmp[0];
			result = tmp[0];
		}
		else
		{
			CheatsSystemAnswer.Answer("Ошибка.");
			return;
		}
		
		if(!IsCheck(pattern))
		{
			CheatsSystemAnswer.Answer("Неизвестная команда.");
			return;
		}

		FinalMethod(result, code);
	}

	bool IsCheck(string value)
	{
		Regex regex = new Regex('^' + value, RegexOptions.IgnoreCase);

		foreach(Key str in keys)
		{
			if(regex.IsMatch(str.cheat))
			{
				code = str.code;
				return true;
			}
		}

		return false;
	}

	int intParse(string val)
	{
		int value;
		if(int.TryParse(val, out value)) return value;
		return -1;
	}

	[System.Serializable] struct Key
	{
		public string cheat;
		public CheatsSystemEnum code;
	}

	void FinalMethod(string cheat, CheatsSystemEnum type)
	{
		switch(type)
		{
		case CheatsSystemEnum.LoadMap:
			
			if(Application.CanStreamedLevelBeLoaded(cheat))
			{
				CheatsSystemAnswer.Answer("Загрузка сцены: " + cheat);
				SceneManager.LoadScene(cheat);
			}
			else
			{
				CheatsSystemAnswer.Answer("Такой карты нет или она указанна неверно.");
			}

			break;

		case CheatsSystemEnum.GiveMoney:

			count = intParse(cheat);

			if(count > -1)
			{
				CheatsSystemAnswer.Answer("Добавлено: " + cheat);
				// Player.AddMoney(count);
			}
			else
			{
				CheatsSystemAnswer.Answer("Недопустимые символы.");
			}

			break;

		case CheatsSystemEnum.GODMode:

			count = intParse(cheat);

			if(count == 1)
			{
				CheatsSystemAnswer.Answer("Режим бога: включен.");
				// Player.god = true;
			}
			else if(count == 0)
			{
				CheatsSystemAnswer.Answer("Режим бога: выключен.");
				// Player.god = false;
			}

			break;

		case CheatsSystemEnum.Help:

			if(string.Compare(cheat, "Help", true) == 0)
			{
				CheatsSystemAnswer.Answer("Запрос помощи по читам.");
			}

			break;
		}
	}
}

В скрипте представлено четыре примера по использованию системы и как можно видеть, пользоваться ей достаточно просто. На текущий момент можно создать чит-ключи из одного, двух, трех слов. Но при желании можно расширить и до четырех. Допустим "get item sword Excalibur" получится чит-ключ "get item sword" ну а "Excalibur" уже тип меча.

Скачать демо:

У вас нет доступа!
Тестировалось на: Unity 5.4.2
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Дешевый хостинг
  • Яндекс.Метрика