てれるんぶろぐ

楽しく、簡単に、やりたいことを実現。

【改】Bukkit・Spigotプラグインを作る方法<スケジューラ編>

f:id:tererun:20210628100747p:plain

プラグインを作る上で、「何秒後に実行する」だったり「何秒毎に実行する」だったり「ずっと監視しておく」という仕組みを組む必要がある時、貴方ならどう実装しますか?

そんな時に便利な物があります。今回はそんなお話。

 

 

 

 

スケジューラって何?

まずはスケジューラの解説をする前に、「スケジューラとは何か」を押さえておきましょう。

スケジューラは、「〇秒後に処理を実行する」や「〇秒毎に処理を実行する」という仕組みを実装するためのモノです。

タイマーを作ったり常時実行する処理を書くために使ったりします。

 

実際に書いてみよう

今回はチュートリアルとして、10秒カウントダウンタイマーを作ってみます。

スケジューラを実装するには、「BukkitRunnable」というクラスを継承することから始まります。

そのために、まずはスケジューラを実装するためのクラスを作りましょう。今回は「ExampleScheduler」という名前でクラスを作成します。作成したらBukkitRunnableを継承しましょう。

 継承後はrunメソッドをOverrideしてあげましょう。IntelliJとかだと「メソッド実装しろ!!」って言ってくれたりするのでそこからやっていただいても構いません。

このrunメソッド内の処理が、スケジューラで実行した時に実行される仕組みになっています。感覚としてはrunメソッドが呼び出されている感じですね。

コンストラクタでフィールドの初期化をして、runメソッド側でnowTimeの値を1ずつ減らして行く、そんな処理になってます。

基本的に引数を渡したいときは、コンストラクタに引数を追加してフィールドに入れるのがいいと思います。

runメソッド内を見ると、「cancel」というメソッドがありますが、これはスケジューラをキャンセルするのに用います。他にもメソッドはあるので、Javadocなどを参考にしてみてください。

hub.spigotmc.org

書き終わった~と思ったのですが、まだ書いていないものが一つあります。

そうです、呼び出しです。

呼び出すには呼び出したい所でBukkitRunnableを実装したクラスのインスタンスからメソッドを呼び出しましょう。今回はプレイヤーが入ってきたときにしてみます。イベントで実装する場合は、イベント *1 の登録をお忘れなく。

メソッドを呼び出す際に、幾つか種類があったかと思います。

runTask、runTaskLater、runTaskTimerと、それぞれに応じたAsynchronouslyです。

runTaskは次のTick時に実行、runTaskLaterは経ったTick後に実行、runTaskTimerは経ったTick後に一定のTickで繰り返して実行、Asynchronouslyがついているメソッドはそれぞれの非同期 *2 版です。

第一引数にPluginインスタンスが必要ですが、今回はメインクラスにstatic変数とGetterで実装してしまっています。こんな感じ。 

これで完成です。

 

 

最後に

BukkitRunnableは処理を書くのにかなりよく使います。覚えておいて損はないと思います。

わざわざクラス作るの面倒だよ~って方は、無名クラスでも実装はできますので用途によって使い分けてください。

今回はここまで!何かあったらコメントやTwitterのDM、Discordまでよろしくお願いします!

それでは~てれるんでした!ちゃお~

 

 

*1:イベントがわからない人はここで解説してます。よかったらみてね。

tererun.hatenablog.com

*2:非同期って何ぞや?っていう方もいるかと思いますので、少しだけ。

非同期処理はサーバーの処理において実行されている順序に関係なく、「別の場所で処理を実行する」みたいなものです。

つまり、実行されているサーバー側には何も影響がないみたいな感じですかね。

重い処理を書いていると、同期処理内だとどうしてもTickPerSecondsが下がってしまうのですが、非同期処理だとそれが起きない、みたいな感じです。その代わり、一部Bukkit APIのメソッドが呼び出せないという欠点はありますが。

プライバシーポリシー お問い合わせ