UnityNovelProj Unity で VisualNovel を作成する

url: https://github.com/ganyariya/gnovel/pull/32
title: "21-6: 条件文を導入する by ganyariya · Pull Request #32 · ganyariya/gnovel"
description: "if expression を評価できるようにするif のサンプルチュートリアルを用意するConditions クラスの UnitTest を追加するSummary by CodeRabbit新機能対話スクリプトでif/elseの条件分岐をサポート。真偽値・整数/小数・文字列の比較およびAND/ORに対応し、変数や選択結果に基づいて適切なブロックを実行。学習用サンプルを追..."
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/c5d295c89c1bad8283d36d6ccd039f870ece5c70a23a7623013f37a345059ca2/ganyariya/gnovel/pull/32
url: https://www.youtube.com/playlist?list=PLGSox0FgA5B58Ki4t4VqAPDycEpmkBd0i
title: "Make A Visual Novel in Unity 2023"
description: "作成した動画を友だち、家族、世界中の人たちと共有"
host: www.youtube.com
favicon: https://www.youtube.com/s/desktop/589d7fcc/img/favicon_32x32.png
image: https://i.ytimg.com/vi/cO6NzrvTrkY/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBDRaue_g8d_MtAx30B62nLpMezdw&days_since_epoch=20375

Logical Line Condition

Logical Line の仕組みを利用して、 if(){} else {} をダイアログファイルで導入できるようにします。

choice "Do you like cat?"
{
  -Yes
    $catliked = true
  -No
    $catliked = false
}

if ($catliked)
{
  ganyariya "Oh, you like cat!"
}
else
{
  ganyariya "Oh, you don't like cat."
}

$x = 50

if ($x > 40)
{
  ganyariya "x is greater than 40, $x = 50 > 40"
}

if ($any) if という keyword かつ条件文を表す () があった場合は LL_Condition という Logical Line として扱います。 そして、 () の中を式 Expression として評価し true か false かを計算します。

true/false だけでなく、 if ($catLiked) のように変数が利用されます。 また、 10 > 50 のように単項演算子のみであれば扱えます。

これらのことから、

  • 変数については TagManager の InjectVariables でリテラル値 (int, float, string, bool) に変換する

を事前に行ってから、式の中を計算し true/false を得ます。

改善点

$catLiked && (10 > 5) といった複雑な条件式は評価できません。 これらのことからやはり lua などのスクリプト言語を利用し Unity と連携させることによって、自前の構文解析を取りやめる、というのが大事だなとおもいました。