functionの働きが分からない

[ver-1.21.1、Skript-2.9.3] Structuresのfunctionの働きが全く分かりません。 どのような状況で使い、また便利なのか教えて下さい。
12 Replies
あたかも
あたかもOP3w ago
たびたび他の方が配布している作品でも見かけるのですが、コードを見てもどういう風に書くのかすらわからないです
Una_Nancy_Owen
例えば
function gunexplode(loc:location ,attacker:entity ,custom:nbt compound):
処理
function gunexplode(loc:location ,attacker:entity ,custom:nbt compound):
処理
って感じで始まるfunctionがあるとして 各部位について説明すると gunexplode → functionの名前 loc:location → function内でのローカル変数 locationの形式で{_loc}という変数で入ってくる attacker:entity → 同上 entity形式で{_attacker}という変数で入ってくる custom:nbt compound → 同上 nbt compound形式で{_custom}という変数で入ってくる その後の処理は {_loc}や{_attacker}を使用してparticleを出したり、モブを出したりする このfunctionを使用したい場合は
set {_location} to location of player
set {_PL} to player
set {_custom} to custom nbt of player's tool
gunexplode({_location},{_PL},{_custom})
set {_location} to location of player
set {_PL} to player
set {_custom} to custom nbt of player's tool
gunexplode({_location},{_PL},{_custom})
とかで使用できる どういう場面で使うのかというと、複数の処理を同時並行させたかったり、同じ処理を複数のコード内で使用したい時 例えば処理の中で2つのモブを召喚した際に、それぞれに一定時間で自動で死亡する処理を行いたいとする 同時に死亡させるとかならリスト変数を使って実行もできるけど、死亡時間にランダム性を持たせるのは難しい となると
loop 3 times:
set {_random} to random integer between 100 and 200
set {_random} to "%{_random}% ticks" parsed as a time span
spawn chicken at player
set {_mob} to last spawned entity
autodeath({_mob},{_random})
loop 3 times:
set {_random} to random integer between 100 and 200
set {_random} to "%{_random}% ticks" parsed as a time span
spawn chicken at player
set {_mob} to last spawned entity
autodeath({_mob},{_random})
みたいなfunctionの使い方をすることで、100tick~200tickで自動で死亡する鶏を3体召喚できる 同じ処理を複数のコード内で使用したい時は、GUIとかがわかりやすいかも 銀行のNPCをクリックしたときに開くGUIと、銀行のATMをクリックしたときに開くGUIが全く同じものでいいなら
function bankmenu(user:player):
処理
function bankmenu(user:player):
処理
ってのを作ると
on rightclick with villager:
name of event-entity contains "BANK"
bankmenu(player)

on rightclick with sign:
line 1 of block is "ATM"
bankmenu(player)
on rightclick with villager:
name of event-entity contains "BANK"
bankmenu(player)

on rightclick with sign:
line 1 of block is "ATM"
bankmenu(player)
みたいな感じに使えるから、数百行あるコードをイベント別で書かなくてもよくなったりする あとfunctionでreturnってのがあるんですけど、これは実例で紹介しますね
command /cmd <int>:
trigger:
set {_item} to player's tool
set {_item} to cmd({_item},arg)
give {_item} to player

function cmd(item:item ,num:integer) :: item:
set int tag "minecraft:custom_model_data" of nbt compound of {_item} to {_num}
return {_item}
command /cmd <int>:
trigger:
set {_item} to player's tool
set {_item} to cmd({_item},arg)
give {_item} to player

function cmd(item:item ,num:integer) :: item:
set int tag "minecraft:custom_model_data" of nbt compound of {_item} to {_num}
return {_item}
これで何が起こるかというと、/cmdを実行したときに手に持ってるアイテムを取得して、そのアイテムのcustom_model_dataを指定のargにしたものを渡します
set {_item} to cmd({_item},arg)

function cmd(item:item ,num:integer) :: item:

return {_item}
set {_item} to cmd({_item},arg)

function cmd(item:item ,num:integer) :: item:

return {_item}
説明するのはこの3行です
set {_item} to cmd({_item},arg)
set {_item} to cmd({_item},arg)
についてですが、これは{_item}にfunctionを挿入しているように見えて、分かりにくいかもしれませんが、このfunction自体がitemとしての形式を持ってるので、この書き方が使えます
function cmd(item:item ,num:integer) :: item:
function cmd(item:item ,num:integer) :: item:
についてですが、
function cmd(item:item ,num:integer)
function cmd(item:item ,num:integer)
ここまでは何も変わりません
:: item:
:: item:
という部分でitem形式でfunctionの内容を返すということをしています 一つ上の「このfunction自体がitemとしての形式を持ってる」というのはこのことなんですね
return {_item}
return {_item}
については、この{_item}という変数の中に入っている内容物を外に出すという感じです ここにitemが入っているので、外で取り出すことができるんですね ---------------------------------- 割とややこしいかもしれませんが、functionは書いてるうちに多用することになるので、ぜひ覚えていって下さいね 多分私が説明できるものは全部書いてると思います 質問とかあれば、気が向いたときに答えます
Una_Nancy_Owen
ちなみにこのfunctionは、爆撃やグレネード、クラスター爆弾で召喚されるアイテムのcustom_model_dataを書き換えるために実際に使用しています https://www.youtube.com/watch?v=MHtZpbiG8F4
Una_Nancy_Owen
YouTube
【Minecraft】CustomGuns Airstrikes - [Skript]
半ブロックや植物で爆弾の爆発が阻止されない塔メリットがある一方 遠方からだと爆弾がよく見えないというデメリットもあり
あたかも
あたかもOP3w ago
ここで紹介されているコードの一番下って何をしているんですか?
Una_Nancy_Owen
set {_location} to location of player
set {_PL} to player
set {_custom} to custom nbt of player's tool
gunexplode({_location},{_PL},{_custom})
set {_location} to location of player
set {_PL} to player
set {_custom} to custom nbt of player's tool
gunexplode({_location},{_PL},{_custom})
のことですかね? 上の動画の爆発処理で使用してる奴です {_location}にプレイヤーの座標入れて、{_PL}にプレイヤーを入れて、{_custom}にnbt compound(1.20.5~)を入れて、gunexplodeというfunctionにこの3要素を用いた処理を行わせています
あたかも
あたかもOP3w ago
あ、なるほど すみません、間違ってたら恥ずかしいんですが functionは ・function内のローカル変数やfunctionそのものの、形式を決めることが出来る ・「ファンクション名({ファンクション内で使う関数の要素},・・・)」とそのまま入力するとファンクション内の処理を行う ・関数としても使用できる ということですか?
Una_Nancy_Owen
関数としても使用できるというか「function=関数」ではあるんですけど、その認識で問題ないと思います ちなみに{ファンクション内で使う関数の要素}の位置についてなんですが、nanikanofunction(player ,arg-2 ,2 )みたいな感じに、変数じゃないものも普通に入れられるので、ここは場合によって使い分けてください
あたかも
あたかもOP3w ago
そうでした、functionですもんねw あ、変数じゃなくてもいいんですね
Una_Nancy_Owen
はい、そのコード内で使用する数値が変動しないなら直接記述しちゃって大丈夫です 逆に変数は座標であったり、HPであったりと数値が変動する場合によく使いますね
月猫ch
月猫ch3w ago
-# (functionは、同じ処理を数字だけ変えて使いまわしたい!みたいなときに便利やで。処理をまとめて一つの道具として扱えるんや)
あたかも
あたかもOP3w ago
はじめはよく分かりませんでしたが理解するとfunctionって思ったより万能ですね... もう遅いので寝ますが、こんな時間まで質問に付き合ってくれてありがとうございました! function、使いこなせるように頑張ります
Kurumi1011
Kurumi10113w ago
便利すぎて僕のコードの中身は9割functionです
Want results from more Discord servers?
Add your server