I have implemented a DialogueBox class which can be static, singleton, service locator, etc. I have written it as a singleton pattern and implemented it in Unity3d engine. It is a part of a game. I have ShowDialogueBox method with many parameters. How can I handle it? The parameters are message, ok button label, cancel button label, has the cancel button or not, actions to be invoked when users click on ok or cancel button.
Is it more suitable to apply Builder pattern for it?
Because the method is not sometimes flexible and I have to provide all parameters.
In addition, my messages are not static and sometimes I need to display a message with parameters like cost value, etc. Therefore, I should add another parameter like params to the method or create the message with params before calling the method? Also, It is appropriate to pull out Localizer from DialogueBox class?
//DialogueBox.GetInstance().ShowDialogueBox("BuyMessage",()=>{},
// ()=>{}, "Buy", "Cancel",true)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DialogueBox : MonoBehaviour
{
[SerializeField] private Text _cancelButtonText;
[SerializeField] private Text _okButtonText;
[SerializeField] private GameObject _cancelButtonObj;
[SerializeField] private GameObject _okButtonObj;
[SerializeField] private Text _messageText;
[SerializeField] private GameObject _dialogueBoxObj; //DialogueBox GameObject(Panel)
private static DialogueBox _instance;
private Action OKButtonPressedAction = delegate { };
private Action CancelButtonPressedAction = delegate { };
public static DialogueBox GetInstance()
{
return _instance;
}
private void Awake()
{
if (_instance == null)
{
_instance = this;
}
else
{
Destroy(gameObject);
}
}
public void ShowDialogueBox(string messageKey, Action okButtonPressed,
Action cancelButtonPressed = null, string okKey = "OK", string cancelKey = "Cancel",
bool hasCancelButton = true)
{
//Localizer manages languages with key/message pair for example:
//Localizer.GetInstance().Dictionary[key]---> returns message for the current language
_messageText.text = Localizer.GetInstance().Dictionary[messageKey];
_okButtonText.text = Localizer.GetInstance().Dictionary[okKey];
if (hasCancelButton)
{
_cancelButtonObj.SetActive(true); //Show the cancel button
_cancelButtonText.text = Localizer.GetInstance().Dictionary[cancelKey];
}
else
_cancelButtonObj.SetActive(false);
OKButtonPressedAction = okButtonPressed;
CancelButtonPressedAction = cancelButtonPressed;
}
public void OnOKButtonPressed() //It is called when a user clicks on OK button
{
_dialogueBoxObj.SetActive(false);
if( OKButtonPressedAction!=null)
OKButtonPressedAction();
}
public void OnCancelButtonPressed() //It is called when a user clicks on OK button
{
_dialogueBoxObj.SetActive(false);
if(CancelButtonPressedAction!=null)
CancelButtonPressedAction();
}
}
gameObject
coming from and where isDestroy()
coming from? \$\endgroup\$DialogueBox
anywhere... \$\endgroup\$