Тема: Допоможіть розібрати лайнокід
Привітик.
Писав я тут штуку одну, котра симулює роботу чату. І от замовник каже - при повторному заході в гру, потрібно також відображати останні N повідомлень, типу міні-історія.
Ну і я тут подумав - це ж легко. Потрібно просто створити колекцію, і при надходженні повідомлень додавати їх в цю колекцію, також необхідно обмежити кількість повідомлень в колекції, і після виходу користувача з гри потрібно зберігати цю колекцію, а при наступному входженні в гру просто витягнути всі повідомлення і додати в чатик.
Дані, та код, корий додає повідомлення з цими даними в чатик, знаходяться в одному класі, тому я вирішив, що до кожного такого класу додам два методи, перший буде додавати повідомлення в список (історію), а другий буде додавати повідомлення в чатик в якості історії.
Але в кожному такому класі вже є метод, котрий додає повідомлення в чатик, а код, котрий додавав би це повідомлення в якості історії, має бути майже таким, за винятком деяких там штук, наприклад, перед доданням повідомлення нам не потрібно чекати деякий час, що симулювало б набір цього повідомлення користувачем на тому кінці.
Ну ви зрозуміли.
Так от. Як мені оформити додавання повідомлення саме в якості історії?
Зараз в мене лише одна думка - в старий метод, котрий додає повідомлення в чат впродовж гри (не історія), передавати булеву змінну, і перед усіма строками коду, котрі не мають працювати при додаванні повідомлення в якості історії ставити if. Але таких строк коду може бути багацько, і якось це все костильно виглядає. До того ж, десь потрібно взагалі переписувати код, котрий додає повідомлення в чат. Що думаєте?
А от вам приклад.
public class MessageItem : MessageBase, ISaveToHistory // інтерфейс містить два метода, для збереження та додавання повідомлення в якості історичного повідомлення
{
[XmlAttribute("id")]
public int id;
[XmlAttribute("action")]
public int action;
protected override IEnumerator DrawCoroutine(bool fast=false) // головний метод, що додає повідомлення в чат
{
Item item = chatController.app.model.items.Find((i) => { return i.id == id; });
if (action > 0)
{
if (!fast)
chatController.StartLoader(); // вмикаємо анімацію завантаження повідомлення
var go = GetGo(); // створюємо об'єкт повідомлення
var mc = go.GetComponent<MessageController>();
string name = item.name;
mc.Text = "+ " + name; // змінюємо дані, котрі відображаються в повідомленні
if (!fast)
yield return new WaitForSeconds(2f); // затримка перед додаванням повідомлення в чат
go.transform.SetParent(chatController.content.transform); //додаємо повідомлення в чат
RefreshTrans(go.transform);
if (!fast)
{
chatController.app.model.AddItem(item); // додаємо предмет в інвентар
chatController.StopLoader(); // вимикаємо анімацію завантаження повідомлення
yield return new WaitForSeconds(1.5f); // затримка перед надходженням наступного повідомлення
}
}
else
{
if(!fast)
chatController.app.model.RemoveItem(item); // видаляємо предмет з інвентаря
}
}
protected override GameObject GetGo()
{
return GameObject.Instantiate(chatController.systemItemAdd, Vector2.zero, Quaternion.identity) as GameObject;
}
public void Save()
{
chatController.app.model.AddToHistory(this); // додаємо повідомлення в історію
}
public void Load(ChatController chatController)
{
//тут маємо додавати повідомлення в чат в якості історії
}
}
Коли це повідомлення з'являється впродовж гри, то в чаті з'являється повідомлення про те, що користувач знайшов деякий предмет, і цей предмет додається в інвентар. Змінна action вказує на дію та кількість предметів одночасно, якщо вона більше нуля, то в інвентар додається action предметів цього типу, а якщо меньше нуля, або нуль, то видаляється.
При додаванні повідомлення в якості історії нам НЕ потрібно додавати предмет в інвентар або видаляти його, до того ж нам непотрібно зупиняти анімацію завантаження повідомлення, і потрібно ігнорувати всі затримки.
З if'ами метод виглядав би якось так
protected override IEnumerator DrawCoroutine(bool fast=false) // головний метод, що додає повідомлення в чат
{
Item item = chatController.app.model.items.Find((i) => { return i.id == id; });
if (action > 0)
{
if (!fast)
chatController.StartLoader(); // вмикаємо анімацію завантаження повідомлення
var go = GetGo(); // створюємо об'єкт повідомлення
var mc = go.GetComponent<MessageController>();
string name = item.name;
mc.Text = "+ " + name; // змінюємо дані, котрі відображаються в повідомленні
if (!fast)
yield return new WaitForSeconds(2f); // затримка перед додаванням повідомлення в чат
go.transform.SetParent(chatController.content.transform); //додаємо повідомлення в чат
RefreshTrans(go.transform);
if (!fast)
{
chatController.app.model.AddItem(item); // додаємо предмет в інвентар
chatController.StopLoader(); // вимикаємо анімацію завантаження повідомлення
yield return new WaitForSeconds(1.5f); // затримка перед надходженням наступного повідомлення
}
}
else
{
if(!fast)
chatController.app.model.RemoveItem(item); // видаляємо предмет з інвентаря
}
}
Фігня повна, правда ж?