石橋を叩いて壊すページ

エフェクトの出し方について調べてみた(エンティティ編)

先日エフェクトについて調べたが、その後調べたところどうもエンティティに対して専用のエフェクトがあるようだ。
ついでに調べてみた。

エフェクトを起こすには、以下のようにする。
ここで変数wolfは、オオカミを表すWolfオブジェクトとする。

wolf.playEffect(EntityEffect.WOLF_SHAKE);

これを実行すると、オオカミが濡れた体から水を払うためぷるぷると胴を振る。かわいい。
同様にWOLF_SHAKEの部分をWOLF_HEARTSと変えれば、オオカミを飼いならしたときのようにハートマークが出る。


かわいい

ただし、あくまでもこれはエフェクト(見た目)であり、実際にそうなったという意味ではない。
例えば定数にDEATHを指定して実行すればオオカミは死んだように表示されるが、実際には生きている。

エフェクトはすべてのエンティティに効果を及ぼすのではなく、特定のエンティティタイプのエンティティにしか効果を及ぼさない。
たとえばDEATHエフェクトは、オオカミやニワトリのような「死ぬ」概念があるエンティティでは死亡エフェクトが表示されるが、
そもそも「死ぬ」概念が無いトロッコや矢といったエンティティには効果を及ぼさず、Exceptionも起こらない。

もうひとつ、ややこしいことがある。
エフェクトの定数には例えばWOLF_HEARTSのように、一見してオオカミ(Wolf)にしか影響を及ぼさないと想像できるような名前が散見されるが、
実際のところウマやヤマネコなど他のエンティティでも有効で、きちんとハートのエフェクトが出たりする。
極端な話をすれば、ヒツジが草を食べるSHEEP_EATでTNT付きトロッコが着火したりする。
このため、定数名は正直あんまり参考にしないほうがいいだろう。というか、そのうち定数名は変更されるだろう。

それぞれの定数とその詳細、そのエフェクトが有効な対象は、以下の表に書いたとおりである。
下の画像にガストやエンダードラゴンなど大型モンスターがいないのは、単に写真写りが悪いからで、別途検証したところ問題なく作用した。
投射物系やその他のエンティティもざっと調べたが、効果はないようだ。

EntityEffectクラスの定数と解説
定数名 これ何? 画像 有効な対象 ポイント
DEATH 死亡 全ての生き物 死亡したエンティティは不可視になる。クライアントの再接続で再表示されるようになる。
実際に死亡した場合と異なり、ジャンプしながらや歩きながらでも死亡エフェクトが表示されるなど若干不自然。
このため、目的によってはエフェクトを出すよりDamageable.setHealth(0);で実際に死亡させたほうが自然。
FIREWORK_EXPLODE 花火の爆発 飛翔中の花火 花火が爆発したエフェクトが実行される。花火は飛翔し続ける。
表示される花火は、エフェクト実行対象の花火に依存する。
たとえば黄色の花火に対してエフェクトを実行すれば黄色の花火のエフェクトが見える。
左の画像は黄色の花火を打ち上げ、飛翔中に複数回FIREWORK_EXPLODEを実行したもの。
HURT ダメージ表現 全ての生き物
IRON_GOLEM_ROSE バラを手に持つ アイアンゴーレム このエフェクトは数十秒続く。
SHEEP_EAT 草を食べる仕草 ヒツジ
TNT付きトロッコ
TNT付きトロッコに対してこのエフェクトを使用すると、なぜか爆発のカウントダウンアニメーションが実行される。
導火線から煙が出て白く点滅し、数秒後に膨らんで今にも爆発…という状況にはなるのだが、その後爆発せず膨らんだままになる。
VILLAGER_ANGRY 怒る 村人
VILLAGER_HAPPY 幸せ(緑に光る星) 村人
VILLAGER_HEART 幸せ(ハート) 村人
WITCH_MAGIC 魔法を使う ウィッチ 頭から紫色の煙が立ち上る
WOLF_HEARTS 飼いならし成功 オオカミ・ウマ・ヤマネコ
WOLF_SHAKE 体を振って水を落とす オオカミ 泳いでいるオオカミではエフェクトが実行されない。
WOLF_SMOKE 飼いならし失敗 オオカミ・ウマ・ヤマネコ 煙が立ち上る
ZOMBIE_TRANSFORM 治療 ゾンビ 村人ゾンビが治療されて村人に戻るときの音がする。
村人ゾンビが治療されたときは本来ならブルブル震えるのだが、エフェクトを使用しても見た目の変化は何も起こらない。

FIREWORK_EXPLODEとZOMBIE_TRANSFORMを除き、全てのエフェクトは無音で実行される。
必要に応じて効果音を併用するとよいだろう。

短時間でエフェクトを繰り返し実行すると、アニメーションは最初から実行される。
例えばSHEEP_EATでTNT付きトロッコが爆発しそうになっているとき、再度SHEEP_EATを実行すると、
一瞬にして爆発前の状態に戻り、再度カウントダウンが始まる。
こちらも必要に応じて数秒おきに繰り返せばエフェクト状態を維持することができる。

プレイヤーに対して有効なエフェクトはHURTとDEATHだけである。
HURTはダメージ表現で、実行すると画面が揺れ、HPバーが揺れ、ダメージ音が出て大変にリアルである。
しかしリアルすぎて本当にダメージを負ったと勘違いしやすいので、多用は禁物である。

一方プレイヤーに対してDEATHを実行すると、こちらもダメージ音がしてプレイヤーキャラクターが赤くなって倒れて消滅し、
クライアントには「死んでしまった!」とリスポーンボタンが表示される。大変にリアルである。
ただし、このときリスポーンボタンを押してもリスポーンできず、クライアントの再接続が必須になる
(おそらく、生きているのでリスポーンできないのだろう。)
再接続すれば、キャラクターはもとの位置にいて、経験値も減っていないのでただのエフェクトと分かる。
しかしいちいち再接続するのは面倒このうえないので、このエフェクトはよほど特殊な目的でなければ、使わないほうがいいと思われる。

エンティティに火をつけるエフェクトは定義されていないようなので、必要ならEntity.setFireTicksで火をつけて
ダメージイベントで火傷をキャンセルするといった対応になるだろう。
クリーパーの帯電具合はエフェクトではないので、Creeper.setPoweredで設定できる。


走るキャラクターの足元に花火をスポーンさせ、直後に爆破エフェクト→花火はremove()で削除、という状況を繰り返してみた。
足元が爆発し、まるでロケットダッシュでもしているような見た目になる。
(もっとも、花火の爆発音が鳴るので誰がどうみても花火にしか見えないわけだけど。)

この記事を評価

この記事にコメント

  1. ...

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

Menu