Команды в чате - Форум Игроделов
Пт, 19 Апр 2024, 03:29 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Команды в чате (определение слова в string)
Команды в чате
TheAppleJackДата: Пт, 20 Фев 2015, 21:28 | Сообщение # 1
Нет аватара
 
Сообщений: 10
Награды: 0
Репутация: 15
Статус: Offline
Мультиплеер я сделал, чат тоже сделал, теперь хочу добавить команды, и тут есть загвоздка: как определить первый символ в переменной string я знаю, но без понятия как выделить слово. Допустим, человек вводит в чат сообщение "/kill nub123", в таком случае с игроком "nub123" происходит определенное действие. Для этого необходимо выделить первое слово после "/", и если оно равно "kill", то необходимо выделить следующее слово, найти игрока с этим ником, и применить к нему описанные в скрипте меры. Может кто нибудь подсказать, как это реализовать?

Добавлено (20 Фев 2015, 21:06)
---------------------------------------------
Разобрался в этом быстрее, чем думал. Скоро сам напишу, как это сделать.

Добавлено (20 Фев 2015, 21:28)
---------------------------------------------
Код

using UnityEngine;
using System.Collections;

public class ChatCommands : MonoBehaviour
{

      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); //вызываем функцию, и указываем получившееся слово как никнейм
       }
      }

      static void kill (string nickname)
      {
       Debug.Log ("You wanna kill "+nickname); //выводим в лог "You wanna kill <тот злосчастный никнейм>"
      }
}

в данном случае, если мы пишем в чат "<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
 
СообщениеМультиплеер я сделал, чат тоже сделал, теперь хочу добавить команды, и тут есть загвоздка: как определить первый символ в переменной string я знаю, но без понятия как выделить слово. Допустим, человек вводит в чат сообщение "/kill nub123", в таком случае с игроком "nub123" происходит определенное действие. Для этого необходимо выделить первое слово после "/", и если оно равно "kill", то необходимо выделить следующее слово, найти игрока с этим ником, и применить к нему описанные в скрипте меры. Может кто нибудь подсказать, как это реализовать?

Добавлено (20 Фев 2015, 21:06)
---------------------------------------------
Разобрался в этом быстрее, чем думал. Скоро сам напишу, как это сделать.

Добавлено (20 Фев 2015, 21:28)
---------------------------------------------
Код

using UnityEngine;
using System.Collections;

public class ChatCommands : MonoBehaviour
{

      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); //вызываем функцию, и указываем получившееся слово как никнейм
       }
      }

      static void kill (string nickname)
      {
       Debug.Log ("You wanna kill "+nickname); //выводим в лог "You wanna kill <тот злосчастный никнейм>"
      }
}

в данном случае, если мы пишем в чат "<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
Дата добавления - 20 Фев 2015 в 21:28
QNicolyaДата: Сб, 21 Фев 2015, 20:47 | Сообщение # 2
God gave Rock'N'Roll to you
 
Сообщений: 3369
Награды: 3
Репутация: 352
Статус: Offline
Я, конечно, не эксперт, но всё же.
Если у нас известно количество параметров, все они перечисляются через определенный символ (пробел, в нашем случае), то можно использовать Split(" ");


Если человек вас обманул - он мошенник, если он вас обманул дважды - вы дурак.
 
СообщениеЯ, конечно, не эксперт, но всё же.
Если у нас известно количество параметров, все они перечисляются через определенный символ (пробел, в нашем случае), то можно использовать Split(" ");

Автор - QNicolya
Дата добавления - 21 Фев 2015 в 20:47
TheAppleJackДата: Вс, 22 Фев 2015, 10:05 | Сообщение # 3
Нет аватара
 
Сообщений: 10
Награды: 0
Репутация: 15
Статус: Offline
Возможно я и вправду сильно намудрил. Я только сейчас узнал про Split. Этой функцией можно разделить команду на отдельные слова, и поместить их в массив. Потом проверять длину массива (количество слов, но можно и не проверять), проверять первое слово, и по нему уже ссылаться на определенную функцию. В ней так же можно использовать данные из этого массива.

Спасибо за подсказку! smile

Добавлено (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
 
СообщениеВозможно я и вправду сильно намудрил. Я только сейчас узнал про Split. Этой функцией можно разделить команду на отдельные слова, и поместить их в массив. Потом проверять длину массива (количество слов, но можно и не проверять), проверять первое слово, и по нему уже ссылаться на определенную функцию. В ней так же можно использовать данные из этого массива.

Спасибо за подсказку! smile

Добавлено (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:05
QNicolyaДата: Вс, 22 Фев 2015, 11:47 | Сообщение # 4
God gave Rock'N'Roll to you
 
Сообщений: 3369
Награды: 3
Репутация: 352
Статус: Offline
Цитата TheAppleJack ()
if (words[0]=="kill") //проверяем первое слово
 

А когда количество возможных команд разрастется до десятков или сотен, тебя назовут говнокодером smile
Код
switch(words[0])
{
case "kill":
Debug.Log("You wanna kill " + words[1]);
break;
default:
Debug.Log("Command not found");
break;
}


В итоге, добавляешь перед default код такого вида:
Код

case "команда":
действия;
break;


Если человек вас обманул - он мошенник, если он вас обманул дважды - вы дурак.
 
Сообщение
Цитата TheAppleJack ()
if (words[0]=="kill") //проверяем первое слово
 

А когда количество возможных команд разрастется до десятков или сотен, тебя назовут говнокодером smile
Код
switch(words[0])
{
case "kill":
Debug.Log("You wanna kill " + words[1]);
break;
default:
Debug.Log("Command not found");
break;
}


В итоге, добавляешь перед default код такого вида:
Код

case "команда":
действия;
break;

Автор - QNicolya
Дата добавления - 22 Фев 2015 в 11:47
seamanДата: Вс, 22 Фев 2015, 14:07 | Сообщение # 5
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Когда количество команд разрастется до сотен - и 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
 
СообщениеКогда количество команд разрастется до сотен - и 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

Автор - seaman
Дата добавления - 22 Фев 2015 в 14:07
TheAppleJackДата: Вс, 22 Фев 2015, 14:58 | Сообщение # 6
Нет аватара
 
Сообщений: 10
Награды: 0
Репутация: 15
Статус: Offline
Цитата

//словарь, в котором запоминаем ключ - команду (строка) и действие по этой команде
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
 
Сообщение
Цитата

//словарь, в котором запоминаем ключ - команду (строка) и действие по этой команде
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 в 14:58
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Команды в чате (определение слова в string)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024