Reward System

Announcements, support questions, and discussion for the Dialogue System.
BPPP1999
Posts: 6
Joined: Fri Jul 24, 2020 6:24 am

Reward System

Post by BPPP1999 »

Hi,

I have setup a quest line following one of the YouTube tutorials but I would like the player to receive some coins at the end (about 20 coins). I already had two scripts "coin script & gamehandler" and with these scripts I am able to walk around collecting coins but I would also like to receive these as a quest reward. I am new to unity and dialogue system so I am not sure how I would go about doing this, I can post my scripts if that would help? Thank you
User avatar
Tony Li
Posts: 22054
Joined: Thu Jul 18, 2013 1:27 pm

Re: Reward System

Post by Tony Li »

Hi,

I'll assume that your script has a method to give coins to the player.

The Dialogue System supports a simple scripting system called Lua that you can use in dialogue entries' Conditions and Script fields. You can tie your script method into Lua. Then in the dialogue entry's Script field call the method to give coins to the player.

More info: (the last link -- a video tutorial -- is probably the most immediately helpful)
BPPP1999
Posts: 6
Joined: Fri Jul 24, 2020 6:24 am

Re: Reward System

Post by BPPP1999 »

Hi Tony,

Thank you for your help I really appreciate it.

I think I have most of it working, when completing the quest I now get the coins shown in the public int which is attached to the player. For example I get 20 coins for completing this quest and shows in the inspector for the player but how would I update this to the canvas as I already have a certain amount of coins collected but i'd like this to add to the other amount collected from the quest. Sorry for the stupid question
User avatar
Tony Li
Posts: 22054
Joined: Thu Jul 18, 2013 1:27 pm

Re: Reward System

Post by Tony Li »

Hi,

It sounds like you should put that in your script, separate from any specific Dialogue System activity. For example, if your C# method is this:

Code: Select all

public Text coinsText; // The UI Text element for coins amount
public int coins; // The number of coins the player has

public void AddCoins(int amount)
{
    coins += amount;
    coinsText.text = coins.ToString();
}
A better way may be to use a property:

Code: Select all

public Text coinsText; // The UI Text element for coins amount

private int _coins; // The number of coins the player has (this is called a private backing variable)
public int coins
{
    get { return _coins; }
    set { _coins = value; if (coinsText != null) coinsText.text = _coins.ToString(); }
}

public void AddCoins(int amount)
{
    coins += amount;
}
BPPP1999
Posts: 6
Joined: Fri Jul 24, 2020 6:24 am

Re: Reward System

Post by BPPP1999 »

Hi,

It's just not updating the UI, would you like me to post the scripts I currently have?
User avatar
Tony Li
Posts: 22054
Joined: Thu Jul 18, 2013 1:27 pm

Re: Reward System

Post by Tony Li »

Sure. I'll take a look and help if I can. You might also try adding Debug.Log() statements to make sure that the code is actually being called.
BPPP1999
Posts: 6
Joined: Fri Jul 24, 2020 6:24 am

Re: Reward System

Post by BPPP1999 »

Sorry about this, I have 3 scripts as shown below;

Code: Select all

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class GameHandler : MonoBehaviour
{
    public TextMeshProUGUI AcornText;
    public int Acorns = 0;



    public void AddCoins(int amount)
    {
        AcornText.text = "Acorns Collected : 0 " + Acorns;
        Acorns += amount;
        AcornText.text = Acorns.ToString();
    }
}

Code: Select all

public class CoinScript : MonoBehaviour
{
    public GameHandler GH;
    public AudioClip acornSound;
    public int AcornValue = 20;
    // Start is called before the first frame update
    void Start()
    {
        GH = GameObject.Find("Canvas").GetComponent<GameHandler>();
    }

   
    private void OnTriggerEnter(Collider other)
    {
        GH.Acorns += AcornValue;
        AudioSource.PlayClipAtPoint(acornSound, transform.position);
        Destroy(gameObject);
    }

   
}

Code: Select all

using PixelCrushers.DialogueSystem;

public class PlayerAcorn : MonoBehaviour
{
    public int Acorns;
    public GameHandler GH;

    

    public void GiveAcorns(double amount)
    {
       GH.Acorns += (int)amount;
    }

    #region Register with Lue
    private void OnEnable()
    {
        Lua.RegisterFunction("GiveAcorns", this, SymbolExtensions.GetMethodInfo(() => GiveAcorns((double)0)));
    }

    private void OnDisable()
    {
        Lua.UnregisterFunction("GiveAcorns");
    }

    #endregion

}
They seem to work in the inspector but I'm just having issue transferring that to the UI
User avatar
Tony Li
Posts: 22054
Joined: Thu Jul 18, 2013 1:27 pm

Re: Reward System

Post by Tony Li »

In GameHandler.cs, change the order:

Code: Select all

public void AddCoins(int amount)
{
    Acorns += amount;
    AcornText.text = "Acorns Collected : " + Acorns;
}
In CoinsScript.cs, you can make it more robust by using FindObjectOfType so it doesn't depend on a GameObject named exactly "Canvas":

Code: Select all

void Start()
{
    GH = FindObjectOfType<GameHandler>();
}
In PlayerAcorn.cs, make sure to find the GameHandler before using GH. Also, use GameHandler.AddCoins(), which updates the UI Text in addition to incrementing the variable:

Code: Select all

private void OnEnable()
{
    GH = FindObjectOfType<GameHandler>();
    Lua.RegisterFunction("GiveAcorns", this, SymbolExtensions.GetMethodInfo(() => GiveAcorns((double)0)));
}

public void GiveAcorns(double amount)
{
   GH.AddCoins((int)amount);
}
BPPP1999
Posts: 6
Joined: Fri Jul 24, 2020 6:24 am

Re: Reward System

Post by BPPP1999 »

Thank you for your reply, it was really helpful and it works once the quest is completed but the issue now is that the Acorns in the open world do not count towards the score, it only seems to be the Acorns for the quest completion
User avatar
Tony Li
Posts: 22054
Joined: Thu Jul 18, 2013 1:27 pm

Re: Reward System

Post by Tony Li »

You need to call AddCoins in that script, too:

Code: Select all

private void OnTriggerEnter(Collider other)
{
    GH.AddCoins(AcornValue);
Post Reply