石橋を叩いて壊すブログ

エフェクトの出し方について調べてみた

WorldクラスのplayEffectメソッドは、その世界にエフェクト、つまり音や光をもたらすことができる。

前回作ったボスモンスタープラグインでは、ボスの周囲に炎を出すのに使用している。
これだけでボスの禍々しさがかなり違う。
そういう意味で、エフェクトは無くても問題ないが、あれば画期的な効果を生み出すことができる。


火のエフェクトがあるせいで禍々しい。これがなかったらただのスケルトンだ。

炎のエフェクトを出すには、以下のようにすればいい。

boss.getWorld().playEffect(
	boss.getLocation(),
	Effect.MOBSPAWNER_FLAMES,
	0);

ここで、変数bossは上記画像のボスであるスケルトンの、Skeleton(インターフェースを実装した)オブジェクトである。
getWorld()やgetLocation()は、ボスがいるワールドや位置を返す。
playEffectメソッドの1番目の引数は、エフェクトの発生源となる座標である。

playEffectメソッドの2番目の引数はEffect列挙子である。
定数のMOBSPAWNER_FLAMESが、その名のとおりモブスポーナー・フレイム(スポーンブロックの炎)エフェクトを示しており、
playEffectメソッドにこれらの位置情報とエフェクト種別を渡すことで、即座に指定した場所にエフェクトが発生するようになっている。

playEffectメソッドの第3引数にはゼロを指定しているが、これはエフェクトのオプションを指定できる。
エフェクトによって引数の解釈が異なるので、詳しくは以下の一覧を見て欲しい。

エフェクトには、音だけのエフェクト・見た目だけのエフェクト・音と見た目のエフェクトの3種類がある。
それぞれ以下が定義されている。

音だけのエフェクト

音だけのエフェクトについては、このブログではお伝えできないので、実際に聞いてみて試して欲しい。
録画してニコニコ動画にでも上げようかと思ったけど、面倒くさかった。

表の「デフォルト効果半径」は、これより遠くに行くと音が聞こえなくなるという概ねの距離である。
基本的にはエフェクト発生源に近いほど音は大きく、デフォルト効果半径に近づくほど音は小さくなっていく。
ただし、ガスト系エフェクト(GHAST_SHRIEKなど)を代表例として、一部のサウンドはフェードアウトがほとんど起こらず、
効果半径を出た瞬間音が突然聞こえなくなる。

基本的に、RECORD_PLAYを除いて第3引数は無視される。

列挙子名 擬音 これ何の音? デフォルトの
効果半径
第3引数の
影響
ポイント
CLICK1 カチッ ディスペンサーの弾切れ 15m なし CLICK2よりも高い音
CLICK2 カチッ ディスペンサーの弾切れ 15m なし CLICK1よりも低い音
BOW_FIRE ビュッ 弓の発射音 15m なし
DOOR_TOGGLE ガチャ、キィ ドアの開閉音 15m なし ランダムに、「ガチャ」と「キィ」の2種類の音が鳴る
EXTINGUISH シュウ 火が消える音 15m なし
RECORD_PLAY 音楽 レコードの音楽を再生 50m レコードのアイテムID 第3引数にレコードのアイテムIDを指定すると、指定したレコードが再生されるようになっている。
例えば2257を指定すると、これは音楽レコード「Cat」のアイテムIDなので、「Cat」の音楽が再生される。
レコードのアイテムIDについては、Minecraft WikiのData valuesのページが詳しいので、このページの「アイテムID」の表を見て欲しい。
表の一番うしろ、アイテムID「2256」より下がレコードである。レコード以外のアイテムIDを指定すると音は再生されない。
GHAST_SHRIEK ギュィィ ガストの威嚇音 63m なし ランダムに、高い「キュィィィ」と低い「ギュィィィ」の2種類の音が鳴る
GHAST_SHOOT ボッ ガストの爆弾発射音 63m なし BLAZE_SHOOTと同じ音に聞こえる
BLAZE_SHOOT ボッ ブレイズの火の玉発射音 30m なし GHAST_SHOOTと同じ音に聞こえる
ZOMBIE_CHEW_WOODEN_DOOR ドンッ ゾンビによる木のドアの打撃音 30m なし 音の高さがランダム
ZOMBIE_CHEW_IRON_DOOR ガンッ ゾンビによる鉄のドアの打撃音 30m なし 音の高さがランダム
ZOMBIE_DESTROY_DOOR バリッ ゾンビによるドアの破壊音 30m なし

見た目だけのエフェクト

見た目だけのエフェクトは、音が発生しない。現在、3種類だけ定義されている。
デフォルト効果半径を超えると、エフェクトは見えなくなる。
エフェクトは数秒ですぐ消えてしまうので、継続的に表示したい場合はBukkitRunnableなどを使い、継続的にエフェクトを出し続ける必要がある。

定数名 解説 画像 デフォルトの
効果半径
第3引数の
影響
MOBSPAWNER_FLAMES スポーンブロックの炎 15m なし
SMOKE 黒い煙 15m

煙が噴き出す向きを指定できる。0で北西、1で真北というように、9方向が定められている。詳しくは以下の表を参照。
9以上の値を指定すると、9で割った余りが実際の効果になる。

数値と煙の向き
0北西 1 2北東
3西 4 5
6南西 7 8南東
ENDER_SIGNAL エンダークリスタルが破壊される瞬間 15m なし

音と見た目のエフェクト

音と見た目のエフェクトを使いこなすには、第3引数が重要になってくる。

定数名 解説 画像 デフォルトの
効果半径
第3引数の
影響
STEP_SOUND ブロックの破壊音 15m STEP SOUNDと書いてあるので足音かと思ったが、実際はどうも違う。
第3引数がブロックのIDに連動しており、例えば1を指定すると石ブロックを破壊したときの音と石片が飛び散る。
(ただし、51(炎ブロック)など必ずしも当てはまらないこともある。)
不適切なIDやゼロ(空気ブロック)を指定した場合は何も起こらない。
ブロックのIDについては、Minecraft WikiのData valuesのブロックIDの部分を参照。
POTION_BREAK ポーションのガラスが割れる音 15m ポーションの色が変わる。
ポーションのダメージ値の下4ビット(0~15)と連動しており、例えば1を指定すると、再生のポーションのピンク色のエフェクトが出る。
ポーションのIDについては、何度もしつこいがMinecraft WikiのData valuesの「ポーション効果」ビットの部分を参照。

エフェクトの発生場所について

playEffectでは、エフェクトの発生場所として第1引数にLocationを指定するが、実際には座標は整数化されてしまう。
このため、少数点以下まで指定した精密なエフェクトを表現することはできない。

POTION_BREAKのエフェクトでは、ビンが割れる位置は整数化された座標が忠実に再現される。
たとえば、座標として[x0,y10,z0]を指定すると、0,10,0の座標にあるブロックの北西の下の頂点でビンが割れるエフェクトが起こる。

一方POTION_BREAK以外のエフェクトでは、発生源はブロックの中心である。
たとえば、座標として[x0,y10,z0]を指定すると、0,10,0の座標にあるブロックの中心、つまり0.5,10.5,0.5でエフェクトが起こる。



同時に多数のエフェクトを発生させて、それを真上から見た状態。
POTION_BREAKだけ、中心がずれているのが分かる。

第4引数「radius」で、効果半径を指定できる

playEffectの4番目の引数radiusには、エフェクトが視聴できる「効果半径」が指定できる。
例えばradiusに10を指定した場合、10m以内の場所にいるプレイヤーにはエフェクトの音が聞こえ、エフェクトのグラフィックが表示されるが、
11m以上の場所にいるプレイヤーには、音もグラフィックも起こらなくなる。

ただし困ったことに、現状のマインクラフトの実装では、音のフェードアウトがデフォルトの効果半径に基づいて計算されてしまっている。
このため、radiusをデフォルトの効果半径より小さく指定すると、フェードアウトがほとんど働かず、効果範囲を出た直後に突然音が聞こえないようになってしまう。
さらに困ったことに、radiusをデフォルトより大きく指定しても、遠くまで音が聞こえるようにはならず、デフォルトの効果範囲より遠くでは音が聞こえなくなる。

今後の実装で修正されるかもしれないが、当面はradiusは慎重に使用したほうがいいだろう。

音の再生・爆発・雷のエフェクトは、別のメソッドがある

上記したエフェクトの一覧には、爆発のエフェクトや、雷のエフェクトが定義されていない。
ただし、これらには別のメソッドが用意されているので、それを使えばエフェクトを表現することができる。

雷を落とすには、WorldクラスにあるstrikeLightningEffectメソッドと、strikeLightningメソッドを使えばいい。
前者が当たってもダメージがなく火災も起きない、音と見た目だけの雷。後者は当たると痛いほうの雷である。
どちらもLocationを引数にとり、指定した場所に雷が落ちる。洞窟内や屋内など屋根がある場所、果ては水中でも問答無用で雷が追ってくる。


剣を振ると雷が落ちてくるライトニングブレード。
剣を持つと嵐になり、剣を振ると雷が落ち、プレイヤーを殴るとBANになり、剣をはずすと晴天に戻る…
なんてプラグイン実際に作ったけど、管理者じゃないんで使いどころが無い。

爆発については、同じくWorldクラスにcreateExplosion(Location loc, float power, boolean setFire)というメソッドが用意されている。
引数のpowerが爆発の破壊力、setFireが爆発による火災発生のOn/Offである。
powerにゼロ、setFireにfalseを指定することで、破壊力ゼロで火災の起きない、音と見た目だけの爆発を起こすことができる。


戦隊モノの登場シーンとかに使える。


ちなみにpowerに1000を指定したらこうなった。

音の再生については、WorldクラスのplaySoundメソッドが使える。
ここでは炎が燃えるパチパチといった環境音から、ダメージ音「ウヴォァ!」などを含むたくさんの音を操ることができる。
これについては、後日別の記事に書きたい。

この記事を評価

74 17

コメント

  1. 【ゲスト】 どうやってエフェクトを表示させるのでしょうか?
    Snowballを投げてSnowballがあたった地点にスポーンブロックのエフェクトを(bukkitプラグイン作成の練習)として作ってみようと思ったのですが... [2015/1/29 00:33]
  2. 【石橋】 プラグイン起動時にイベントリスナを設定→イベントが飛んできたら処理、という感じ。

    package jp.jias.bukkit;

    import org.bukkit.Effect;
    import org.bukkit.entity.Snowball;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.plugin.java.JavaPlugin;

    public class TestPlugin extends JavaPlugin implements Listener{

    /**
    * プラグインが有効化されるとき呼び出される
    */
    public void onEnable(){
    // イベントリスナーの登録
    getServer().getPluginManager().registerEvents(this,this);
    }

    /**
    * 投射物が当たったときに呼び出される
    *
    * @param e
    * イベントオブジェクト
    */
    @EventHandler
    public void onProjectileHitEvent(ProjectileHitEvent e){

    // 投げられたものは雪玉か
    if(e.getEntity() instanceof Snowball){

    // 雪玉の座標でスポーンブロックエフェクトを実行
    e.getEntity().getWorld().playEffect(
    e.getEntity().getLocation(),
    Effect.MOBSPAWNER_FLAMES,
    0);
    }
    }
    }

    ビルドの仕方は
    http://bukkitwiki.jp/Developer/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB [2015/1/29 20:14]
  3. 【ゲスト】 1枚目のSSに紫の円がありますが、これはどのように表示させたのでしょうか? [2016/1/23 22:08]
  4. 【石橋】 1枚目の円ってゴルゴの胸のところにある赤っぽい3/4円のことかな?これは単に、ゴルゴにポーション効果をかけたせいでそのエフェクトが出てるだけだよ。 [2016/1/23 22:14]
  5. 【ゲスト】 すみません、ゴルゴを見落としていました。attach.php?id=486 のことです。 [2016/1/23 22:18]
  6. 【石橋】 ああ、それはプラグインからエンダーパールを投げたときのエフェクトの表示です。普通にゲーム内から投げたときとはちょっと違うエフェクトになるみたい(今やってみたら違ってた)。 [2016/1/24 00:34]
  7. 【ゲスト】 特定のブロックを壊すとボスにダメージが入るコマンド教えて下さい。また、PEでできるものをお願いします。 [2017/8/4 18:15]

【この記事にコメント】
お名前:
コメント:

295,352

記事カテゴリー

最近の記事

  1. FF14を翻訳したら国によって結構特色が違った[12/11]
  2. ゼロから始めるFactorioの回路構築(実践例編)[7/24]
  3. ゼロから始めるFactorioの回路構築(条件回路・論理演算編)[7/24]
  4. ゼロから始めるFactorioの回路構築(定数回路・算術回路編)[7/24]
  5. ゼロから始めるFactorioの回路構築(入力・出力・混合編)[7/24]

RSS1.0 RSS2.0

最近のコメント

  1. おー、お役に立てたようでなによりです。再起…[9/11]
  2. この記事が非常の役立ちました。おかげさまで…[9/9]
  3. 1.14.2のAPIで試しましたが、MapInitializeEv…[9/9]
  4. 天晴れ!押したらポーションのモヤモヤでまし…[5/26]
  5. 習うより慣れろって感じで。この記事は記事冒…[4/7]

記事を検索


管理人

石橋

絵画センスは皆無