2
\$\begingroup\$

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();
    }
}
\$\endgroup\$
11
  • \$\begingroup\$ Where is gameObject coming from and where is Destroy() coming from? \$\endgroup\$
    – Heslacher
    Commented Dec 31, 2018 at 21:25
  • \$\begingroup\$ MonoBehaviour. It is a built in field referred to the game object owning the script. It is related to Unity game engine. \$\endgroup\$
    – Mahdi
    Commented Dec 31, 2018 at 22:01
  • 1
    \$\begingroup\$ This code looks incomplete. You are not creating the DialogueBox anywhere... \$\endgroup\$
    – t3chb0t
    Commented Jan 1, 2019 at 19:25
  • 1
    \$\begingroup\$ @ t3chb0t. I said, it is related to unity3d. Have you ever worked with unity3d? In unity, you do not call constructors when objects inherit from monobehaviour. You can create it in the editor(like my way) or in the script(Instantiate). The code is complete and clear. I do not know where it is unclear. I have different parameters for Show method that can be default or not. I finally used builder design pattern to handle it. Why -1?! I selected unity3d tag. \$\endgroup\$
    – Mahdi
    Commented Jan 1, 2019 at 21:38
  • 1
    \$\begingroup\$ I see that all ask about monobehaviours. Like that I ask about where TcpClient is. If you are a unity developer, you know about monobeaviour, destroy and other parts of it. \$\endgroup\$
    – Mahdi
    Commented Jan 1, 2019 at 21:46

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.