0

Tabletop Simulator でいくつかの Lua スクリプトを書いていますattempt to call a number value near for..inが、完全に当惑するエラーが表示されます。エラーの原因となっている for ループを含むコード スニペットを次に示します。

function resetTurnOrder()
    local map = getObjectFromGUID(GUIDs.Map)
    local shift, center, points = map.getPosition(), map.getTable('MapData').center, map.getSnapPoints()
    local i, p = 0
    for nation, guids in pairs(GUIDs.Nations) do
        print('Resetting turn order for ' .. nation)
        if checkScenario(nation) then
            i = i + 1
            p = map.positionToLocal(shift - points[i].position)
            p[1] = p[1] * 0.75 + center[1] * 0.25
            p[3] = p[3] * 0.75 + center[3] * 0.25
            getObjectFromGUID(guids.turn_token).setPositionSmooth(map.positionToWorld(p), false, false)
            getObjectFromGUID(guids.turn_token).setRotationSmooth({0, points[i].rotation[2], 0}, false, false)
            print('Done resetting turn order for ' .. nation)
        else
            print(nation .. ' not in this scenario')
        end
    end
end

さて、まず最初に、 andに直接割り当てられている 2 行をコメントアウトすることでエラーが解消され、それらの行を同等のステートメントに置き換えたときに、p[1]p[3]

p = {p[1] * 0.75 + center[1] * 0.25, p[2], p[3] * 0.75 + center[3] * 0.25}

その後、すべてが完全に機能しました。ただし、これでエラーが修正される理由については、完全に唖然としています。私はこの正確な for ループ定義を半ダースほどの場所で使用して、プレーヤーとそのコンポーネント ( global に格納されていますGUIDs) を反復処理しましたが、他の場所では問題なく動作しました。

もう少し詳細を追加すると、古いコードを使用しても、ループの最初の反復は完全に機能します。最初のターン トークンが適切な位置に移動され、両方のメッセージが出力されますが、エラーによりそれ以上の反復が妨げられます。ループ反復子をインクリメントするときにエラーが明らかに発生していますが、に直接割り当てる方法が理解できず、これに干渉する可能性がありますが、割り当てp[1]は問題ありません。もう 1 つ詳細:事前に for ループの外側ではなく内側で宣言しても役に立ちませんでした。p[3]pp

(詳細を追加するために編集)

さらにテストした結果、 @ luther がおそらく正しいように見えますが、によって返される値のメタテーブルで何か奇妙なことが起こっていますpositionToLocal。この関数によって返される値は、Unity のタイプVectorの拡張であると思われる Tabletop Simulator によって定義されています。Vector3重要な詳細は、この型を使用すると、インデックスx,y,z1,2,3交換可能に参照できることです。

p[1]そのため、 andp[3]割り当てをp.xandに置き換え、エラーp.zを修正しました。これは、によって返された がインデックスを明示的に定義せず、代わりにメタメソッドを使用してそれらのインデックスを にリンクしていることを暗示しているようです。そして、どういうわけか、そのメタメソッドはループ反復子を台無しにしています...しかし、正直なところ、それはまだ私の心を揺さぶっています.VectorpositionToLocal1,2,3x,y,z

GUIDs.Nationspairs()は、反復子を生成するために使用される関数に渡されるテーブルであり、基本的には定数です。静的 GUID が含まれているため、どの関数でも追加または更新することはありません。とはもちろん関係ありませんp

詳細

これは間違いなく、Tabletop Simulator の Vector 実装に関連しているようです: https://forums.tabletopsimulator.com/showthread.php?8344-For-loop

上記の例では、単純な数値の for ループを使用し1,2,3て Vector 値のインデックスを更新し、Vector にインデックスを付けるために使用する割り当てステートメントは、割り当てられた値と同じ値にiの値を変更することになります。i

これが言語でどのように可能であるかはまだ理解できません...

4

1 に答える 1