Recording Variable of Answers as CSV

Announcements, support questions, and discussion for the Dialogue System.
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Recording Variable of Answers as CSV

Post by jibjab910 »

I am using Pixel Crushers to run an experiment in which I am logging the participants' responses as a string. However, my process for doing so is not working. I wanted to lay it out step-by-step to see where my issue is.
1. I am recording my users' answers using the script field in dialogue they select. It usually looks like this:

Code: Select all

Variable["EarthquakeAnswers"] = Variable["EarthquakeAnswers"] .. "1a,";
2. I run my own code called WriteCSV.cs, which looks like the following:

Code: Select all

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using PixelCrushers.DialogueSystem;
using UnityEngine;

public class WriteCSV : MonoBehaviour {

    public void ExportAnswers ()
    {
        string strPath2 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory);
        strPath2 = strPath2 + "/earthquake.txt";
        FileStream fs2 = new FileStream(strPath2, FileMode.OpenOrCreate, FileAccess.Write);
        StreamWriter sw2 = new StreamWriter(fs2);
        sw2.BaseStream.Seek(0, SeekOrigin.End);

        string answers2 = DialogueLua.GetVariable("EarthquakeAnswers").AsString;

        sw2.WriteLine(answers2);
        sw2.Flush();
        sw2.Close();
    }
}
3. My file is found on the desktop, but is blank.
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Re: Recording Variable of Answers as CSV

Post by jibjab910 »

Some more information: I have the database loaded in the scene in which my code is called, but it is not the same scene in which the variables are created/modified. Additionally, my project requires that the dialogue manager be destroyed on each scene load due to some problems with the UI.
User avatar
Tony Li
Posts: 22059
Joined: Thu Jul 18, 2013 1:27 pm

Re: Recording Variable of Answers as CSV

Post by Tony Li »

Hi,

Is Variable["EarthquakeAnswers"] initialized? Make sure it's defined as a Text variable in your dialogue database.

As a debugging step, you might want to add this line temporarily:

Code: Select all

string answers2 = DialogueLua.GetVariable("EarthquakeAnswers").AsString;
Debug.Log(answers2);
This will tell you if the issue is with the "EarthquakeAnswers" variable or your file-writing code.

BTW, another way to do this (if you want to avoid setting the Script field for every response) is to use the OnConversationLine method. This is a special method that gets called on any script that's on the Dialogue Manager and the primary conversation participants. For example:

Code: Select all

void OnConversationLine(Subtitle subtitle) {
    if (subtitle.speakerInfo.IsPlayer) {
        Debug.Log("Player chose entry ID: " + subtitle.dialogueEntry.id);
    }
}
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Re: Recording Variable of Answers as CSV

Post by jibjab910 »

Tony,
The variable is instantiated in the database. The code you gave me outputs the following:

Code: Select all

UnityEngine.Debug:Log(Object)
WriteCSV:ExportAnswers() (at Assets/_Scenes/Databases and animators/WriteCSV.cs:23)
UnityEngine.Events.UnityEvent:Invoke()
SelectionSliderButton:OnBarFilled() (at Assets/Dialogue System Examples/VR UI Example/Scripts/SelectionSliderButton.cs:28)
VRStandardAssets.Utils.<FillBar>c__Iterator1:MoveNext() (at Assets/VRSampleScenes/Scripts/Utils/SelectionSlider.cs:133)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
Unfortunately, I'm not sure what this entails. The the 22nd and 23rd lines are the ones you gave me:

Code: Select all

        string answers3 = DialogueLua.GetVariable("EarthquakeAnswers").AsString;
        Debug.Log(answers3);
        
Thank you for all the help. I am not a coder, but have been placed with this project nonetheless. You've been a great help.
User avatar
Tony Li
Posts: 22059
Joined: Thu Jul 18, 2013 1:27 pm

Re: Recording Variable of Answers as CSV

Post by Tony Li »

As another debugging step, inspect a dialogue entry such as the one with this Script:

Code: Select all

Variable["EarthquakeAnswers"] = Variable["EarthquakeAnswers"] .. "1a,";
Add a "ShowAlert" command:

Code: Select all

Variable["EarthquakeAnswers"] = Variable["EarthquakeAnswers"] .. "1a,";
ShowAlert("Current: " .. Variable["EarthquakeAnswers"])
This will show the value of Variable["EarthquakeAnswers"] as an onscreen alert.

Then play.

If you don't see an onscreen alert when selecting this answer, this dialogue entry isn't the one being chosen. Maybe you have a duplicate conversation and you're editing the other one accidentally.

If you see "Current:" without any text behind it (i.e., not "Current: 1a,") then this means the EarthquakeAnswers variable isn't initialized. Double-check that the variable in the dialogue database exactly matches "EarthquakeAnswers", including capitalization.

If none of that helps, please feel free to send a copy of your project to tony (at) pixelcrushers.com. I'll be happy to take a look.
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Re: Recording Variable of Answers as CSV

Post by jibjab910 »

Dear Tony,
I see the alert with the exact value of the EarthquakeAnswers variable. I think the issue has to do with the way that my dialogue database is being re-loaded on every scene load. Is there some way I can write the current value of the answers variable to some global variable which can be accessed later? I'm checking that this is indeed the issue right now.
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Re: Recording Variable of Answers as CSV

Post by jibjab910 »

Dear Tony,
The variable's value is being reset on every scene load. It is not being reset during a scene (I checked and the alert showed that the variable was being built out properly towards the end of a scene).
User avatar
Tony Li
Posts: 22059
Joined: Thu Jul 18, 2013 1:27 pm

Re: Recording Variable of Answers as CSV

Post by Tony Li »

Hi,

Can you keep the same Dialogue Manager across scenes instead of reloading the database in every scene? To do this, tick the Dialogue Manager's Don't Destroy On Load and Allow Only One Instance checkboxes.

If not, then you can save the variable by adding this script to each scene:

SaveAndLoadAcrossScenes.cs

Code: Select all

using UnityEngine;
using PixelCrushers.DialogueSystem;

public class SaveAndLoadAcrossScenes: MonoBehaviour
{
    // Static variables exist globally:
    public static string saveData = string.Empty;
    
    // Before leaving a scene, store its save data.
    void OnDestroy()
    {
        saveData = PersistentDataManager.GetSaveData();
    }
    
    // After entering a scene, load the saved data.
    void Start()
    {
        if (!string.IsNullOrEmpty(saveData)) PersistentDataManager.ApplySaveData(saveData);
    }    
}
jibjab910
Posts: 18
Joined: Fri Mar 02, 2018 7:46 pm

Re: Recording Variable of Answers as CSV

Post by jibjab910 »

Dear Tony,
I cannot, as it is necessary that I untick those boxes in order to get the VR dialgoue UI to work. Should I add this script to a game object and then use the sequence field to call the ondestroy and onstart commands?
User avatar
Tony Li
Posts: 22059
Joined: Thu Jul 18, 2013 1:27 pm

Re: Recording Variable of Answers as CSV

Post by Tony Li »

Just add the script to a GameObject in the scene. You don't need to call Start or OnDestroy. (I had a typo in the script. Use "Start", not "OnStart".) Unity will automatically call those methods.

It would be possible to get the VR dialogue UI to work with those checkboxes ticked, but if things are working properly now, then I think you shouldn't change it. If it isn't broken, don't fix it. :-) If you do want to change it at some point, just let me know.
Post Reply