・ボールに入れたオブジェクトの数を自動で数える。
・オブジェクトについた名前で価値を換算し、1点や5点など
それぞれ数えて合算できる
※ワークショップにあるのでそれを導入すると良い
※平たいオブジェクトを入れるとくっつくので、ボウルはLで固定しておいたほうがいい
※ボウルに山盛りにしても正確に測れるが、
ボウルの下の隙間に入れてもカウントはされるので注意
(ボウルを中心に丸型の範囲で取得してる?)
※複数コピーして使う場合は、コピーした瞬間はselfで情報を取得ためか
エラーが起きるが、一度セーブしてから再度読み込むとちゃんと機能する?
■カウントボールをテーブルに埋める方法
・Lで固定する
・左のメニューからqizmo-move(3色移動させる線のアイコン)で、
ボウルを選択して、Y軸(緑)で移動させる
・固定しないでやっても浮き上がるので注意
--Counting Bowl by MrStump
--ボウルに入れたアイテムの数を数えることができます
--各エントリーには2つの意味があります
--名前(そのオブジェクトの名前フィールドにあるもの)
--(オブジェクトを右クリックしてNameのところに記入します)
--価値(どれくらいの価値があるか。=の右側の値)
--項目説明の番号は、この表の番号項目を上書きします。
validCountItemList = {
["Currency"] = 1,
--["5"] = 5,
--["10"] = 10,
--["20"] = 20,
--["50"] = 50,
--["100"] = 100,
--["200"] = 200,
--Currency以外に5円の数を数えたいときなどは
「--」を消して項目を追加していきます。
}
--END OF CODE TO EDIT
function onLoad()
--ボウルの下のカウント用の数字=ボタン機能の無いボタンを作成
self.createButton({
label="", click_function="none", function_owner=self,
position={0,0.04,-2.5}, rotation={0,180,0}, height=00, width=0,
font_color={1,1,1}, font_size=500
})
--繰り返されるタイマーを作成。「delay(遅延)」で設定した秒分毎に
判定されるようになる
Timer.create({
identifier=self.getGUID().."_timer",
function_name="countItems", function_owner=self,
repetitions=0, delay=1
})
end
--毎秒ごとにボウル内のアイテムをカウントする機能
function countItems()
local totalValue = 0
local itemsInBowl = findItemsInSphere()
--Go through all items found by the cast
for _, entry in ipairs(itemsInBowl) do
--ボウル自体はカウントしないようにします。
if entry.hit_object ~= self then
local tableEntry =
validCountItemList[entry.hit_object.getName()]
--上のカウントリストに無いアイテムをカウントしないようにします。
if tableEntry ~= nil then
local descValue =
tonumber(entry.hit_object.getDescription())
local stackMult = math.abs(entry.hit_object.getQuantity())
--Use value in description if available
if descValue ~= nil then
totalValue = totalValue + descValue * stackMult
else
--上記で除いていった条件以外=カウントするものとして
カウントリストで設定したオブジェクトをカウントします。
totalValue = totalValue + tableEntry * stackMult
end
end
end
end
--カウント数の表示を更新します。
self.editButton({index=0, label=totalValue})
end
--ここで設定した範囲内=ボウルの内側に入れた範囲にオブジェクトが入ったら
オブジェクトをカウントする
function findItemsInSphere()
--ボウル自体のサイズを獲得する
local scale = self.getScale()
--ボウル自体の位置を獲得する
local pos = self.getPosition()
pos.y=pos.y+1.25
--Ray trace to get all objects
return Physics.cast({
origin=pos, direction={0,1,0}, type=2, max_distance=0,
size={3.4*scale.x,3.4*scale.y,3.4*scale.z}, --debug=true
})
end