Skip to content

Minigame

woctordho edited this page Apr 25, 2024 · 9 revisions

小游戏

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

PrefabLoader加载小游戏

  1. 把小游戏做成一个prefab,比如Assets/Resources/Prefabs/ExampleCube.prefabExampleMinigame.prefab
  2. 在Lua中用show(prefab_loader, prefab_name)显示prefab,hide(prefab_loader)隐藏prefab
    • 如果要把小游戏加载到3D场景中,则prefab_loader设为__Nova.prefabLoader,它在Hierarchy的最外面
    • 如果要把小游戏加载到UI中,则prefab_loader设为__Nova.uiPrefabLoader,它在Hierarchy的UI

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

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

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

  1. ExampleMinigameController中,用variables.Getvariables.Set读写变量,checkpointHelper.GetGlobalVariablecheckpointHelper.SetGlobalVariable读写全局变量
    • 变量名称之前要加v_/gv_
  2. 在小游戏前/后,在Lua中调用__Nova.coroutineHelper:StartInterrupt()/StopInterrupt(),就会让gameState把小游戏的结果记录在存档中
    • 如果一段脚本中使用了wait_fence()StartInterrupt()/StopInterrupt(),则需要将这段脚本的执行时间标记为before_checkpoint,具体语法请参考test_minigame.txt

用其他方式加载小游戏

  1. 在小游戏的controller class里写一个Show函数,用来显示小游戏的UI
  2. 按照Lua接口注册生成这个class的Lua接口
  3. 在Lua中调用__Nova.小游戏名字:Show(),就会显示小游戏的UI,代替show(prefab_loader, prefab_name)
  4. 你需要自己调用minigame函数中用到的其他东西