メインコンテンツまでスキップ

感情バルーンとエモート

感情バルーンとは、キャラクターの頭上に現れる小さなアニメーションの吹き出しです。トレーナーがあなたを見つけたときの感嘆符、フォロワーの上のハート、困っている NPC の上の疑問符などがそれにあたります。MCE は独自の 14 種類のバルーン(すべてのゲームが持つオリジナルの絵)を同梱しており、ゲームはその上に独自のセットを追加できます。

同じバルーンが、4 種類の呼び出し元から使われます。

呼び出し元バルーンの要求方法
プレイヤーファンクションキーのホットキー(F1〜F12、Shift+F1、Shift+F2)
スクリプトCommandGraph の PlayEmotion ノード
フォロワーあなたに向かって唸るときのハート(MonsterFollowerController)
他のプレイヤーMMORPG レイヤーで、リモートアバターの上に表示されるバルーン:オンラインエモート を参照

すべて名前で要求します。

エンジン標準の 14 種類のバルーン​

名前は EmotionBalloonNames(名前空間 OpenMon.MCE.Characters.Followers.Talk)にあります。EmotionBalloonNames.All は、ホットキーが使う順序で一覧します。

名前ホットキー
exclamation_markF1
question_markF2
heartF3
music_noteF4
angerF5
sweat_dropF6
sleepF7
happyF8
sadF9
shockedF10
ideaF11
ellipsisF12
sparkleShift+F1
determinedShift+F2

エンジン自身のセットは Resources/Characters/EmotionBalloons/DefaultEmotionBalloons にある ScriptableObject なので、どのゲームでも何も接続せずに見つけられます。

プレイヤーのホットキー​

PlayerCharacter は、入力の受け取りを開始するとすぐに自分自身に PlayerEmoteInput コンポーネントを追加します。それ以降、上記のホットキーで対応するバルーンがプレイヤーの上に表示されます。

ホットキーは、プレイヤーが行動できる状態のときにだけ作動します。

  • プレイヤーが操作中でない(ダイアログ、メニュー、カットシーンに拘束されていない)
  • ゲームが動作している(タイムスケールが 0 より大きい)
  • 前のバルーンが終了している — バルーンは同時に 1 つだけです

ローカルプレイヤーがバルーンを表示するたびに、バルーン名とともに PlayerEmotes.Played が発生します。このイベントによって、オンラインレイヤーは他のプレイヤーに知らせる必要があることを把握します。あなたもこれを購読できます。

using OpenMon.MCE.Characters;

PlayerEmotes.Played += name => Debug.Log($"The player showed '{name}'.");

PlayerEmotes.NameForHotkey(functionKey, shift) は、キーをそのバルーン名に対応付けます(バルーンを持たないキーには null を返します)。

スクリプトからバルーンを表示する​

任意のグラフに PlayEmotion ノード(Create Command / Animations / PlayEmotion)を追加します。

フィールド意味
Emotionバルーン名(デフォルトは heart)。誰も持っていない名前は、音も含めて何も再生しません。
Targetバルーンを表示するキャラクター。空の場合:グラフを実行しているアクター。
On Player代わりにプレイヤーの上に表示します。
Waitバルーンが消えるまでグラフを待機させます(デフォルトでオン)。オフの場合、バルーンの再生中もグラフは進みます。

PlayExclamation は、より古い単一目的の兄弟ノードです。キャラクターまたはプレイヤーの上に感嘆符を表示し、セットにゲーム独自の感嘆符があればそれを使います。

フォロワーのハート​

独自のトークテーブルを持たないフォロワー(テーブルをインポートしなかったゲーム)は、話しかけたときに唸りながら、エンジンのハートを自分の上に表示します。コードからは、フォロワーに任意のバルーンを要求できます。

// follower is the MonsterFollowerController of the player's follower
StartCoroutine(follower.ShowEmotion(EmotionBalloonNames.Sparkle));

独自のバルーンを持ち込む​

ゲームは Emotion Balloon Set(Create > MCE > Characters > Emotion Balloon Set)で、エンジンのバルーンを置き換えたり拡張したりします。

フィールド意味
balloonsバルーンの一覧。それぞれに name、sprites、更新ごとに表示するスプライト(spriteByUpdate)、更新ごとのジャンプの高さ(heightByUpdate)があります。タイムラインは毎秒 60 更新で動作し、16 マップユニットが 1 タイルです。
aliasesバルーンの別名 — カートリッジでは別の呼び方をしているバルーンに対する、スクリプト側の名前。
soundバルーンが現れるときに鳴る音。空の場合:無音。

セットを MCESettings アセットの Emotion Balloons フィールドに割り当てます。何かがバルーンを要求すると、EmotionBalloonSet.Resolve(gameSet, name) は次の順序で探します。

  1. ゲーム独自のセット(名前またはエイリアスで)
  2. エンジン独自のセット(EmotionBalloonSet.Default)

したがって、heart を定義したゲームでは、ホットキー、スクリプト、フォロワー、他のプレイヤーが見るバルーンのすべてでそのゲームのハートが使われ、何も定義しないゲームでも 14 種類すべてが使えます。

カートリッジからインポートしたゲーム(インポートされたゲームとゲームプロファイル を参照)には、インポーターが独自のセットを作成し、ゲームプロファイルがそれを MCESettings に割り当てます(プロファイルを復元すると元に戻ります)。

あらゆるボディの上に​

ポップアップ(CharacterPopUpController)は、プレイヤーとすべてのアクターの上にバルーンを描画します。ポップアップを持たないもの(フォロワー、別のプレイヤーのアバター、自作のプロップ)には EmotionBubbleOverBody を使います。

StartCoroutine(EmotionBubbleOverBody.Play(someTransform, balloon, clock: null));

ボディに一時的なオブジェクトを吊り下げ、ボディのスプライトのうち最も高いものの上に置き、すべてのスプライトを基準に中央揃えにして、更新のたびにバルーンのジャンプを追従します。バルーンが終了すると、そのオブジェクトは消えます。描画するものがないバルーンや、スプライトを持たないボディでは、何も起こりません。

リファレンス​

型名前空間役割
EmotionBalloonNamesOpenMon.MCE.Characters.Followers.Talk14 個の名前と All
EmotionBalloonSetOpenMon.MCE.Characters.Followers.Talkバルーンのセット、Default、Resolve、Find
EmotionBubbleOverBodyOpenMon.MCE.Characters.Followers.Talk任意のボディの上にバルーンを描画
PlayerEmotesOpenMon.MCE.Charactersホットキーの対応付けと Played イベント
PlayerEmoteInputOpenMon.MCE.Charactersホットキーを読み取る
CharacterPopUpControllerOpenMon.MCE.ActorsPlayEmotion(name)、PlayBalloon(balloon, sound)
PlayEmotionOpenMon.MCE.Actors.CommandGraph.Animationsスクリプトノード