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]
p
p
(詳細を追加するために編集)
さらにテストした結果、 @ luther がおそらく正しいように見えますが、によって返される値のメタテーブルで何か奇妙なことが起こっていますpositionToLocal
。この関数によって返される値は、Unity のタイプVector
の拡張であると思われる Tabletop Simulator によって定義されています。Vector3
重要な詳細は、この型を使用すると、インデックスx,y,z
と1,2,3
交換可能に参照できることです。
p[1]
そのため、 andp[3]
割り当てをp.x
andに置き換え、エラーp.z
を修正しました。これは、によって返された がインデックスを明示的に定義せず、代わりにメタメソッドを使用してそれらのインデックスを にリンクしていることを暗示しているようです。そして、どういうわけか、そのメタメソッドはループ反復子を台無しにしています...しかし、正直なところ、それはまだ私の心を揺さぶっています.Vector
positionToLocal
1,2,3
x,y,z
GUIDs.Nations
pairs()
は、反復子を生成するために使用される関数に渡されるテーブルであり、基本的には定数です。静的 GUID が含まれているため、どの関数でも追加または更新することはありません。とはもちろん関係ありませんp
。
詳細
これは間違いなく、Tabletop Simulator の Vector 実装に関連しているようです: https://forums.tabletopsimulator.com/showthread.php?8344-For-loop
上記の例では、単純な数値の for ループを使用し1,2,3
て Vector 値のインデックスを更新し、Vector にインデックスを付けるために使用する割り当てステートメントは、割り当てられた値と同じ値にi
の値を変更することになります。i
これが言語でどのように可能であるかはまだ理解できません...