Мультиплеер я сделал, чат тоже сделал, теперь хочу добавить команды, и тут есть загвоздка: как определить первый символ в переменной string я знаю, но без понятия как выделить слово. Допустим, человек вводит в чат сообщение "/kill nub123", в таком случае с игроком "nub123" происходит определенное действие. Для этого необходимо выделить первое слово после "/", и если оно равно "kill", то необходимо выделить следующее слово, найти игрока с этим ником, и применить к нему описанные в скрипте меры. Может кто нибудь подсказать, как это реализовать?
Добавлено (20 Фев 2015, 21:06) --------------------------------------------- Разобрался в этом быстрее, чем думал. Скоро сам напишу, как это сделать.
static string B; // объявляем переменную типа string
public static void scanComand (string comand) { string A; //объявляем локульную переменную A = comand.Remove (0, 1); //отсекаем первый символ A = A.Remove (A.IndexOf (" ")); // отсекаем то, что идет после пробела if (A=="kill") //проверяем слово, которое получилось, и если оно совпадает с тем, которое требуется, выполняем следующее: { B = comand.Substring (comand.IndexOf(" ")+1); //отсекаем все, что идет до слова B = B.Remove (B.IndexOf(">")); //отсекаем все, что идет до закрывающего символа kill (B); //вызываем функцию, и указываем получившееся слово как никнейм } }
в данном случае, если мы пишем в чат "<kill nub123>", то в лог выведется сообщение "You wanna kill nub123", можно конечно же написать более злое событие.
P.S. первый символ должен указываться в скрипте чата, при проверке того самого первого символа сообщения (имяПермененной[0]==System.Convert.ToChar("ваш символ"), если кто не знал, и да, к тому скрипту нужно подключить IO (using System.IO;)), в нашем случае это символ "<". Кстати, [0] означает первый символ. P.S. если кому надо, можете использовать мой скрипт. Просто создайте у себя C# скрипт, назовите его "ChatCommands", закиньте туда этот код, и пусть он просто лежит в проекте, а если надо изменить команды- то просто измените "kill" на нужное слово.
Я надеюсь вы поняли, ведь я старался описать все, что нужно XD
VVVVVв самом низу описан способ гораздо проще и понятнееVVVVV
Сообщение отредактировал TheAppleJack - Вс, 22 Фев 2015, 10:10
Я, конечно, не эксперт, но всё же. Если у нас известно количество параметров, все они перечисляются через определенный символ (пробел, в нашем случае), то можно использовать Split(" "); Если человек вас обманул - он мошенник, если он вас обманул дважды - вы дурак.
Возможно я и вправду сильно намудрил. Я только сейчас узнал про Split. Этой функцией можно разделить команду на отдельные слова, и поместить их в массив. Потом проверять длину массива (количество слов, но можно и не проверять), проверять первое слово, и по нему уже ссылаться на определенную функцию. В ней так же можно использовать данные из этого массива.
Спасибо за подсказку!
Добавлено (22 Фев 2015, 10:05) --------------------------------------------- Вот, как можно это сделать гораздо проще:
Код
public void scanComand (string comand) { string rawComand; //объявляем локальную переменную rawComand = comand.Substring (1, comand.Length-2); // извлекаем текст из команды, за исключением первого и последнего символа, и помещаем его в нашу переменную string[] words = rawComand.Split(' '); //разделяем "очищенную" переменную на слова, и помещаем их в массив if (words[0]=="kill") //проверяем первое слово { //выполняем действие Debug.Log ("You wanna kill "+words[1]); //выводим в лог сообщение вместе со вторым словом } }
Таким образом мы пишем в чат команду <kill player001>, и в лог выводится "You wanna kill player001".
Сообщение отредактировал TheAppleJack - Вс, 22 Фев 2015, 10:09
Когда количество команд разрастется до сотен - и case не спасет. Тогда нужно будет мудрить что-нибудь похлеще. Типа:
Код
public class MyAction { //словарь, в котором запоминаем ключ - команду (строка) и действие по этой команде public Dictionary<string, Action<object>> slovar = new Dictionary<string, Action<object>>();
public void Invoke(string command, object arg) { if (slovar.ContainsKey(command)) slovar[command](arg); } }
Так мы можем в словарь добавлять сколько угодно команд практически не меняя код. Можно даже динамически менять поведение - меняя вызываемые Action
//словарь, в котором запоминаем ключ - команду (строка) и действие по этой команде public Dictionary<string, Action<object>> slovar = new Dictionary<string, Action<object>>();
А надо подсоединять дополнительные библиотеки? У меня выдает ошибку "The type or namespace name `Dictionary`2' could not be found. Are you missing a using directive or an assembly reference?"
Добавлено (22 Фев 2015, 14:58) --------------------------------------------- Понял, нужно подсоединить System.Collections.Generic и System
Сообщение отредактировал TheAppleJack - Вс, 22 Фев 2015, 15:18