Page 1 of 1

Calling Method with Lua

Posted: Mon Nov 14, 2022 12:25 pm
by 2538050250
Hi,

I'm trying to call a Method in a conversation to Open a Shop in another script :

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



public class ShopTrigger : MonoBehaviour
{
public ItemData[] itemsToSell;

public void TriggerShop()
{
ShopManager.instance.OpenShop(itemsToSell);
}

void OnEnable()
{

Lua.RegisterFunction("TriggerShop", this, SymbolExtensions.GetMethodInfo(() => TriggerShop()));
}

void OnDisable()
{

Lua.UnregisterFunction("TriggerShop");

}



As You can see, I use Item data to keep track of the items the NPC has to sell, and I wanted to trigger the shop a conversation. Using the tutorial on Youtube, that's what I came to, but in the console, as I run the game, I get this :

Dialogue System: Lua code ' ShopTrigger()' threw exception 'Tried to invoke a function call on a non-function value. If you're calling a function, is it registered with Lua?'

Can you tell me what I did wrong ?

Thank you very much,

Jean

Re: Calling Method with Lua

Posted: Mon Nov 14, 2022 1:37 pm
by Tony Li
Hi,

You've registered the function name "TriggerShop()", but your conversation's Script field is trying to call "ShopTrigger()".


Side note: You can only register one function under a given name. So you can't register separate functions both named "TriggerShop" for NPC1 and also for NPC2. Here are two solutions to get around that:

1. Add the NPC's name to the function. Example:

Code: Select all

Lua.RegisterFunction(name + "_TriggerShop", this, SymbolExtensions.GetMethodInfo(() => TriggerShop()));
If the script is on a GameObject named NPC1, the function will be NPC1_TriggerShop(). Set your conversation node's Script field to: NPC1_TriggerShop()


2. Or move the Lua function to a separate script that can work with any NPC. Put it on your ShopManager or Dialogue Manager GameObject.

Code: Select all

public class ShopLua : MonoBehaviour
{
    public void TriggerShop(string npcName)
    {
        var npc = GameObject.Find(npcName);
        if (npc != null)
        {
            var shop = GetComponent<Shop>();
            if (shop != null)
            {
                ShopManager.instance.OpenShop(shop.itemsToSell);
            }
        }
    }

    void Awake()
    {
        Lua.RegisterFunction("TriggerShop", this, SymbolExtensions.GetMethodInfo(() => TriggerShop("")));
    }
}
On the NPCs:

Code: Select all

public class Shop : MonoBehaviour
{
    public ItemData[] itemsToSell;
}

Re: Calling Method with Lua

Posted: Tue Nov 15, 2022 12:41 pm
by 2538050250
Hi,
Thanks for your quick reply,, I, indeed didn't notice I was using the wrong command. It works fine now.
Thank you for warning me about the potential registering issue, I'll keep that in mind in the future.
Thanks again for your help,
Have a nice day,

Jean

Re: Calling Method with Lua

Posted: Tue Nov 15, 2022 1:27 pm
by Tony Li
Glad to help!