Skip to content

Minigame

woctordho edited this page Mar 11, 2022 · 10 revisions

在Nova中插入小游戏

minigame.lua中的minigame函数封装了调用小游戏的整个流程。具体的例子可以参考Assets/Resources/Scenarios/test_minigame.txt

PrefabLoader加载小游戏

  1. 把小游戏做成一个prefab(可以在3D场景中,也可以在UI中),比如Assets/Resources/Prefabs/ExampleCube.prefabExampleMinigame.prefab
  2. 在Lua中用show(prefab_loader, prefab_name)显示prefab,hide(prefab_loader)隐藏prefab

在小游戏中禁止玩家操作Nova本体

  1. DialogueEntry.WrapCoroutine会把脚本中的每个代码块包装在__Nova.coroutineHelper:AcquireActionPause()/ReleaseActionPause()中。当Gamestate.actionPauseLock被acquire时,Nova本体不会推进对话
  2. 在小游戏前/后,在Lua中调用input_off()/input_on(),就会禁用/启用鼠标菜单和快捷键
    • 其实是调用GameController.DisableInput/EnableInput
    • 如果玩家点窗口的叉退出游戏,会出现“要退出游戏吗”的警告框,这时玩家仍然能点击警告框
    • 如果不禁用鼠标菜单和快捷键,允许玩家在小游戏中存档/读档,理论上也是可以的,但是存档中只能保存小游戏开始前的状态,而不能保存小游戏进行到一半的状态
  3. 在Lua中调用wait_fence(),就会让Nova本体等待小游戏结束。在ExampleMinigameController中调用gameState.SignalFence(true),就会让小游戏结束,Nova本体继续运行

在小游戏与Nova本体之间传递变量

  1. ExampleMinigameController中,用variables.Getvariables.Set读写变量,checkpointHelper.GetGlobalVariablecheckpointHelper.SetGlobalVariable读写全局变量
    • 在Lua中读写Nova的变量/全局变量时,变量名称之前要加v_/gv_,而在C#中不用加
  2. 在小游戏前/后,在Lua中调用__Nova.coroutineHelper:StartInterrupt()/StopInterrupt(),就会让gameState把小游戏的结果记录在nodeHistory
    • 调用StopInterrupt之后,不能再在同一条对话中根据小游戏结果来修改变量。建议把所有结果的结算放到小游戏的controller中

用其他方式加载小游戏

  1. 在小游戏的controller class里写一个Show函数,用来显示小游戏的UI
  2. 在class上面加上[ExportCustomType] attribute,用来导出Lua接口
  3. 在class文件里加上using LuaInterface;,在Awake函数里加上LuaRuntime.Instance.BindObject("小游戏名字", this);,就会把小游戏的C# object instance绑定到Lua的__Nova这个全局table里的小游戏名字这个key
    • 如果小游戏有好几个instance,可以把小游戏名字改成一个变量
  4. 在Unity Editor的上面的菜单中点击Lua -> Clear Wrap Files,就会生成这个class的Lua接口
  5. 在Lua中调用__Nova.小游戏名字:Show(),就会显示小游戏的UI,代替show(prefab_loader, prefab_name)
  6. 你需要自己调用minigame函数中用到的其他东西
Clone this wiki locally