[VRChat, Udonsharp] 剰余が無いので自力でやるしか無いお話 (ワールド経過時間の取得に関する)

上記は、「ワールドの累計経過時間を秒で求める」処理

Udonsharp の面倒な制約1:ノードを分散できない

ノード同士は必ず1:1の関係でなければならない
例えば、上記の「vticks」は結局「DateTime Get Ticks」の値だが、
「DateTime Get Ticks」から2分岐できないため、わざわざ変数を介している

Udonsharp の面倒な制約2:イベントも分散できない

処理順の都合だろうか
イベント「FixedUpdate」は常に動作するイベントとなる
何らかの常時更新が必要な処理がある場合はこのイベントを用いる

複数のノードに同じタイミングを仕掛けたい場合、分散させるのではなく、連結することになる
上記例では「FixedUpdate」のタイミングを「SetProgramVariable」と「Log」に仕掛けている

Udonsharp の面倒な制約3:トリガーされていないノードは一切動作しない

当たり前といえば当たり前
しかしこうなると 変数の更新である「SetProgramVariable」などに
イベントの線を全て伸ばさなければならない

上記はまだきれいな形を保っているが、これが凝っていくと・・・

Udonsharp でできないこと:剰余

要は余りを求める算出
演算にModが無い

従って、mod演算子を使わず余りを求める必要がある、わざわざ

  1. 整数型 値1 と 整数型 値2 に同じ値を入れる
  2. 値1を割る
  3. 値1を割った値で 掛ける
  4. 値2から値1 を引く

実際の値にしてみよう

  1. 整数型 値1 = 整数型 値2 = 127
  2. 値1 = 値1 / 100 = 1
  3. 値1 = 値1 * 100 = 100
  4. 結果 = 値2(127) – 値1(100) = 27

2で値1が「1.27」とならないのは、値1が整数型であるため
ここで値1が float(浮動小数型) だと、2で1.27となり、3で127に戻ってしまって、結果は 0 になる

情報処理の基礎を思い出させてくれる良い機会ではあるが、不便

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Share via
Copy link