プラグイン作成 FAQ

プラグイン作成についてのFAQです。
FAQの内容は、ユーザーの皆さまからいただいたお問い合わせとそれに対する開発チームからの回答を元として作成しています。


プラグインの作成について

プラグインはどうやって作成すればよいですか?

プラグインの作り方を参照してください。

イベントエディターからC#プログラムを編集するときに起動するエディタを選択する事は出来ますか?

slnファイルの関連付けをVisual Studio以外に設定することで、別のエディタを使うことができます。


イベント関係

「会話を表示」や「メッセージを表示」パネルに相当するメソッドはありますか?

「会話」は下記メソッドで可能です。 0 の部分は 1,2,3 などにするとウィンドウのポジション(上中下)が変わります。

mapScene.ShowDialogue(msg, 0, MenuControllerBase.WindowTypes.DIALOGUE,
new AbstractRenderObject.GameContent.DialogueCharacterProperty()
new AbstractRenderObject.GameContent.DialogueCharacterProperty(), mapChr.guId);

DialogueCharacterProperty() の引数に会話するキャラのグラフィックなどを指定出来ますが、
引数は概ねパネルで設定できる内容と連動しているかと思いますので、必要であればお試しください。

 

「メッセージ」は下記メソッドです。会話と同じく第二引数の 0 はウィンドウポジションの指定です。

mapScene.ShowMessage(stringAttr.value, 0, MenuControllerBase.WindowTypes.MESSAGE, mapChr.guId);
 

また「テロップ」は下記メソッドとなります。

mapScene.ShowTelop(msg, 0, MenuControllerBase.WindowTypes.TELOP, new AbstractRenderObject.GameContent.TelopProperty(), mapChr.guId);
 

ShowDialogue, ShowMessage は戻り値にその場限りの id が返りますので、これを使って
mapScene.IsQueuedDialogue(id) や
mapScene.IsQueuedMessage(id)
を実行すると、表示した会話やメッセージがまだ表示中(閉じられていない)かどうかがわかります。

会話メッセージやダイアログを閉じることはできますか?

Ver.1.9段階ではできません。

「イメージとして画面に文字を表示する」パネルに相当するメソッドはどれですか?

Graphics.DrawString (縁取りあり)や
Graphics.DrawStringSoloColor (縁取りなし)をご利用ください。
現時点(ver.1.9)では書式によるテキスト装飾に関するメソッドは公開しておりません。
(書式によるテキスト装飾が必要な場合、SpriteManager の公開をお待ち下さい。)

「レンダリング設定の変更」パネルに相当するメソッドはどれですか?

下記をお使いください。

var render = catalog.getItemFromName<Yukar.Common.Rom.RenderSettings>("レンダリング設定名前");
mapScene.mapDrawer.setRenderSettings(render);

「イベントのモーションを変更」や「キャストのモーションを変更」パネルに該当するメソッドはどれですか?

下記の2つのどちらかをお使いください。

mapChr.playMotion("モーション名") 
mapScene.hero.playMotion(("モーション名", 0.2f, true, lockMotion))

※lockMotion = 歩きなどで解除されないようにするかどうか / true でロック, false でロックなしになります。

「プレイヤーにブレンドシェイプを適用」に該当するメソッドはどれですか?

キーを指定して適用する場合は下記をお使いください。

mapScene.hero.getModelInstance().setMorphBlend("キー名", 0.5f);

クリップを指定して適用する場合は下記をお使いください。
引数はそれぞれ 適用対象、クリップ名、補間時間、他のブレンドシェイプをリセットするかどうか です。

ScriptRunner.AddBlendShapeTask(mapScene.hero, "クリップ名", 4, false);

モーションの終了を取得する方法はありますか?

下記のサンプルコードをイベントにバインドしてご利用ください。
MotionUtil.cs
GetMotionLoopCount でモーションのループ回数を取得します。
ワンショットの場合、1だったらモーション完了とみなす事ができます。

PlayMotionImmediately でブレンドなしでモーション再生を開始します。
通常のモーション再生パネルではブレンドが邪魔という場合にお使いください。


リソース

スタンプのサブグラフィックのオン・オフを切り替えることはできますか?

下記をお使いください。

mapChr.SetSubGraphicOpacity 

スタンプのサブグラフィックの「位置のみを適応」のオン・オフを切り替えることはできますか?

サブグラフィックの位置はmapChr.DisplayObjects 内に各表示物の座標更新用マトリクス取得関数として解釈されますので、動的な変更はできません。
下記を使って取得することはできます。

  ((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号].useTranslateOnly
 

変更については、リソースを直接書き換えることになりますのでおすすめできません。

スタンプのサブグラフィックの相対位置XYZ、相対角度XYZ、スケールXYZを設定することはできますか?

下記の pos, rot, scale がこれらの情報を管理しています。

((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号] 
 

変更については、リソースを直接書き換えることになりますのでおすすめできません。

スタンプのサブグラフィックのローカルライト連動の「利用する」のオン・オフを切り替えることはできますか?

下記の useLight でオン・オフの情報を管理しています。

((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号] 
 

変更については、リソースを直接書き換えることになりますのでおすすめできません。

パターンアニメのモーションを指定して、2D描画することはできますか?ビルボード表示ではなく、2Dイメージをそのまま表示する方法を教えてください。

下記の方法で可能です。

var spIndex = 10; // スプライト番号
           var guid = new Guid("c15f94b6-d4a0-46c4-bc43-2db2f64471ac"); // スライスアニメのGUID
           var zoom = 100;
           var x = 640;
           var y = 360;
           mapScene.spManager.ShowPicture(spIndex, guid, zoom, zoom,
               Microsoft.Xna.Framework.Color.White, new Yukar.Common.Rom.Script.StringAttr("walk"), x, y);

スライスアニメのGUIDはリソース画面で右クリック>GUIDをコピー で取得できます。
これは Graphics.drawImage と違って一度だけ実行すればその後表示され続けます。
mapScene.spManager.Move で移動したり、 mapScene.spManager.Hide で消すことが出来ます。
こちらはイベントパネル「イメージを表示」で使っているクラスです。


マップ関連

マップエディターのように、マップ上でオブジェクトにカーソルを合わせた際にオブジェクトが縁取りするためのメソッドはありますか?

この機能はエディタ専用の描画パス(ピックアップバッファ)を利用しているため、エンジンでは利用できません。

マップ設定パレット>基本タブ>「カメラ追従範囲」で設定した座標を取得する方法はありますか?

下記をお使いください。

mapScene.map.mapCameraRange 

if(mapScene.map.mapCameraRange == Rectangle.Empty) が true のときは未設定(制限なし)になります。

マップ設定パレット>レンダリング設定タブにある「背景」セクションの「遠景モデル」及び「環境マップ」を変更することはできますか?

mapScene.mapDrawer.renderSettings.skyModel にモデルのGUIDを
mapScene.mapDrawer.renderSettings.reflection に環境マップテクスチャのGUIDをセットしたのち、
mapScene.mapDrawer.setRenderSettings(mapScene.mapDrawer.renderSettings); を実行してください。


マップバトル

キャストの種別指定(味方・敵・両方・なし)を変更するコードはありますでしょうか?

下記のコードで mapChr のキャストタイプが取得可能です。

var type = mapChr.rom?.CastType ?? Yukar.Common.Rom.CastType.ALLY;

キャストやイベント同士の当たり判定を参考に判断してみてください。

マップバトルの際に表示されるダメージ表示の色や大きさを変更することはできますか?

下記のコードで可能です

           var viewer = mapScene.fieldBattleViewer;
           viewer.zoomedScale = 2.0f; // 出たばかりのタイミングでのスケール
           viewer.damageScale = 1.0f; // 最終的なスケール
           viewer.zoomTime = 0.1f; // 最終的なスケールになるまでの時間
           viewer.drawTime = 1.0f; // ダメージが消えるまでの時間
           viewer.damageColor = Microsoft.Xna.Framework.Color.White; // ダメージ色
           viewer.criticalDamageColor = Microsoft.Xna.Framework.Color.Red; // クリティカルダメージ色
           viewer.criticalDamageColor = Microsoft.Xna.Framework.Color.Red; // クリティカルダメージ色

また、下記に添付したようなスクリプトを使って、ご自身でダメージ描画処理を作成することも可能です。
ChangeFieldBattleViewer.cs

マップバトルの際、クリティカルダメージを発生させる方法はありますか?

クリティカル率に基づいてランダムに判定を行っているため、単純に確定で発生させることは出来ません。
状態変化を使って、一時的にクリティカル率を上昇・下降させてしまうのが良いかと思います。

マップバトルの際、ダメージを受けたキャストの色が変化してから元に戻るまでの時間を設定することはできますか?

下記を使うことで取得はすることはできます。

mapChr.rom.InvincibleTime 

ただし、変更はデータベースを直接変更することになるため、おすすめできません。


ゲーム定義

ルールと操作の「標準操作」および「ラジコン操作」のON/OFFを取得・変更することはできますか?

下記を使って切替できます。

GameMain.instance.data.start.controlMode = Yukar.Common.Rom.GameSettings.ControlMode.NORMAL;
GameMain.instance.data.start.controlMode = Yukar.Common.Rom.GameSettings.ControlMode.RESIDENT_EVIL_LIKE;

ルールと操作の「話しかける判定スケール」を取得・変更することはできますか?

スケール自体は、GameMain.instance.catalog.getGameSettings().TalkColliderScale で取得可能です。
ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。
変更をするとテストプレイが完了しても値が保持されてしまうため。GameSettings 全般について値を変更することは推奨しません。

ルールと操作の「カメラ操作を許可しない」のON/OFFを取得・変更することはできますか?

下記を使って取得・変更が可能です。

mapScene.mapFixCamera

また、各カメラ操作個別の許可・禁止については下記を使うことで取得・変更が可能です。

owner.data.start.camLockX
owner.data.start.camLockY
owner.data.start.camLockZoom
owner.data.start.camLockReset

ルールと操作>カメラ距離自動調整の「地形」および「物体」をON/OFFすることはできますか?

下記で使ってそれぞれの状態を取得することができます。

catalog.getGameSettings().CameraAvoidObjects
catalog.getGameSettings().CameraAvoidTerrain

ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。

ルールと操作の「自動的にプレイヤーの後ろに回り込む」のON/OFFを取得・変更することはできますか?

下記を使って情報を取得することはできます。
GameMain.instance.catalog.getGameSettings().isTpsMode
ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。

ルールと操作ーキー・ボタン割り当てのゲームコントローラおよびマウスの項目にある、移動およびカメラ操作の係数を変更することはできますか?

できません。ゲーム定義の設定をそのまま使ってください。

ルールと操作>移動(慣性)の「標準旋回速度」を変更することはできますか?

下記を使って速度を取得することはできます。

GameMain.instance.catalog.getGameSettings().DefaultRotateSpeed 

ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。

ゲーム定義>ルールと操作>デバイス入力値の調整要素にある「マウス上下」などの「感度」を変更することはできますか?

できません。
代わりに Input.GetAxis() の値に応じてカメラを回転させる処理を自前で作成することで、場合に応じて回転速度を変更することで対応してください。

プロジェクト設定のバージョン 製作者などをタイトルに表示するにはどうしたらよいですか?

下記を使って情報を取得することはできます。

catalog.getGameSettings().meta.buildVer 

そのうえで下記のように変数に情報を格納すればレイアウト上に表示できます。

GameMain.instance.data.system.SetVariable("変数名", catalog.getGameSettings().meta.buildVer.ToString(), Guid.Empty, false);

ただし、デフォルトのタイトル画面上ではC#を動かすことはVer1.9の時点ではできません。
そのためゲーム定義でタイトル画面をスキップするようにし、イベントでゲーム内のタイトル画面と組み合わせて使う必要があります。

コンフィグ画面にある「自動ダッシュ」のON/OFFの判定を取得することはできますか?

サンプルコードを添付します。
ConfigGetter.cs
アサインした上でC#メソッド「GetAutoDash」を実行すれば取得可能です。


「地形」と「プレイヤー」また「キャスト」との摩擦を設定する方法はありますか?

下記をお使いください。

MapCharacter.getRigidBody().setFriction(摩擦値)

ただしMapCharacterで適宜摩擦をコントロールしているため、ふとしたタイミングで無効になる可能性がございます。

プレイヤーおよびキャストの透明度を変更することはできますか?

下記メソッドで可能です。

mapChr.setOpacityMultiplier(0.5f); // 透明度 0f で完全透明

プレイヤーを透明化するために、mapScene.hero.setOpacityMultiplier(値)を試してみましたが、効果がないようです。

setOpacityMultiplier について、プレイヤーは状態変化による透明度変化を常に監視・適用しているため、変更しても上書きされてしまいます。
AfterDraw() で毎フレームセットしてみてください。

指定した名前のフリーレイアウトを開く/閉じるコードはありますか?

下記のコードをご利用ください。

// 開く場合
var lyt = catalog.getLayoutProperties().AllLayoutNodes.FirstOrDefault(x => x.Name == "ItemSelect");
if (lyt != null)
{
    GameMain.instance.ShowFreeLayout(lyt.Guid);
}

// 閉じる場合
var lyt = GameMain.instance.freeLayouts.FirstOrDefault(x => x.LayoutNode.Name == "ItemSelect");
if (lyt != null)
{
    GameMain.instance.HideFreeLayout(lyt.LayoutGuid);
}

レイアウト

指定した名前のフリーレイアウトの表示位置を設定する(特殊座標指定タグ"Position[x][y]"相当)、または、特殊座標指定タグ"Position[x][y]をC#から設定することはできますか?

下記のように操作できますが、
positionAnchorTag への代入はレイアウトツールでの設定内容を直接書き換えてしまう(その後書き換えたままになってしまう)ほか、レイアウトを再表示させないと反映されませんので、 Position を操作するほうが良いかと思います。

var lyt = GameMain.instance.freeLayouts.FirstOrDefault(x => x.LayoutNode.Name == "ItemSelect");
if (lyt != null)
{
    var node = lyt.LayoutDrawer.ParseNodes().FirstOrDefault(x => x.MenuItem.name == "アイテム詳細表示");
 
    node.Position = new Microsoft.Xna.Framework.Vector2(256, 256); // 直接移動させる場合
 
    node.MenuItem.positionAnchorTag = "特殊座標タグ書き換え";
}

レイアウトの選択されたコンテナのコンテナ管理番号(インデックス)を取得することはできますか?

下記の方法で現在表示中のレイアウトにアクセスできます。

       [BakinFunction(Description = "選択されたサブコンテナのコンテナ管理番号を取得\nサブコンテナのアクションを「共通イベントを呼び出す」にし、そのイベント内で以下のメソッドを呼び出します")]
       public int GetIndex()
       {
           // まずメインメニューのマネージャを取得する
           var lc = mapScene.menuWindow as LayoutMenuController;
           var lm = lc.mainMenu;

           // メインメニューから派生して開かれているレイアウトを追跡して取得する
           // (アイテムセレクトから呼び出されているなら最後はアイテムセレクトになっているはず)
           while (lm.NextlayoutManager != null)
               lm = lm.NextlayoutManager;

           // Drawerから現在選択中のインデックスを取得する
           var drawer = lm.LayoutDrawer;
           GameMain.PushLog(DebugDialog.LogEntry.LogType.EVENT, "drawer", drawer.GetSelectIndex().ToString());
           return drawer.GetSelectIndex();
       }

さらに、インデックスを取得したあと、メインメニューを強制的に閉じてしまいたい場合は、
下記のような方法が使えます。

       [BakinFunction]
       public void CloseMainMenu()
       {
           // まずメインメニューのマネージャを取得する
           var lc = mapScene.menuWindow as LayoutMenuController;
           var lm = lc.mainMenu;
           lm.HideAll();
       }

ちなみに、フリーレイアウトから現在選択中のインデックスを取得する場合は下記のようになります。

       [BakinFunction]
       public int GetIndexForFreeLayout()
       {
           // まずフリーレイアウトのマネージャを取得する
           var lm = GameMain.instance.freeLayouts.FirstOrDefault(x => x.LayoutNode.Name == "取得したいフリーレイアウトの名前");
           if (lm == null)
           {
               GameMain.PushLog(DebugDialog.LogEntry.LogType.EVENT, "drawer", "error");
               return -1;
           }

           // Drawerから現在選択中のインデックスを取得する
           var drawer = lm.LayoutDrawer;
           GameMain.PushLog(DebugDialog.LogEntry.LogType.EVENT, "drawer", drawer.GetSelectIndex().ToString());
           return drawer.GetSelectIndex();
       }

データベース

キャストのデータベースに記入してある管理タグ+メモの文字列を取得する事はできますか?

tags というフィールドがそうです。
下記にてアクセスできます。

catalog.getItemFromName<Yukar.Common.Rom.Cast>("Hero").tags

キャストが習得するスキルの一覧を取得することはできますか?

キャストが習得するスキルは Cast.availableSkills に入っています。下記のように取得できます。

var learnSkills = catalog.getItemFromName<Yukar.Common.Rom.Cast>("ケン").availableSkills;

スキルはGUIDの形で格納しているので、下記のように更にCatalogに問い合わせすることで、習得レベルとスキルそのものが取得できます。

if (learnSkills.Count > 0)
{
    var skill = catalog.getItemFromGuid(learnSkills[0].skill) as Yukar.Common.Rom.NSkill;
    GameMain.PushLog(DebugDialog.LogEntry.LogType.EVENT, "C#", "習得レベル : " + learnSkills[0].level + " / スキル名 : " + skill.name);
}

全スキルの一覧は下記の方法で取得することができます。

           var allSkills = catalog.getFilteredItemList<Yukar.Common.Rom.NSkill>().Cast<Yukar.Common.Rom.NSkill>();

コモンイベントから現在バトル中の敵キャストの所持金やドロップアイテムを取得する事はできますか?

下記の方法で先頭のモンスターの経験値を取得できます。

BattleSequenceManagerBase.Get().EnemyViewDataList[0].monster.exp 

また、下記の方法で先頭のモンスターの1つ目のドロップアイテムを取得できます。

var guid = BattleSequenceManagerBase.Get().EnemyViewDataList[0].monster.dropItems[0].item;
var name = catalog.getItemFromGuid(guid)?.name;

実際に利用する際は、 EnemyViewDataList や dropItems の Count を見て上限チェックをしてください。


そのほか

BGMをクロスフェードさせることはできますか?

システムとしてのBGMは再生ラインを一つしか持っていないため、Audio.PlayBGMではできません。

まず下記の方法で、効果音として音量ゼロで再生開始(この場合でもループ設定は反映されます)してください。

           var id = Audio.LoadSound(guid);
           Audio.PlaySound(id, 0, 0, 1);

その後下記を使って、毎フレームボリュームを操作し、前のBGMを0に近づけつつ、新しいBGMの音量を1に近づけてください。

           Audio.SetSEVolume(id, volume);

バトル中にバトルカメラを切り替えることはできますか?

下記のコードで変更できます。

           GameMain.instance.data.system.currentBattleCameraSet = "カメラセット名";

カメラ切り替わりのタイミングで反映されますが、即時反映したい場合は、下記コードで可能です

          mapScene.applyCameraToBattle();

ただし、こちらはバトルイベントにアサインしたC#からしか効果がないのでご注意ください。

特定の画像を表示させたい場合、Graphics.DrawImageの引数はどのように記述すればよいでしょうか?

Start() 内などでまず下記のようなコードを使ってテクスチャを読み込みます。

           tex = catalog.getItemFromName<Yukar.Common.Resource.Texture>(""テクスチャリソース名"");
           Graphics.LoadImage(tex);

その後、描画したい場面で(Update, AfterDrawなどのタイミング)で下記を使ってください。

           Graphics.DrawImage(tex, x, y);

使用後、下記のようにイベント破棄時に使用した画像を解放してください。

       public override void Destroy()
       {
           Graphics.UnloadImage(tex);
       }

イベント生成mapChr.CreateEvent()は使用可能でしょうか?可能な場合、メソッドの引数の設定はどのようにすればいいですか。

使用可能です。
mapChr.CreateEvent(guid, dir); のように使えます。
dir は発射元と同じ方向を向かせたい場合、 mapChr.getDirectionRad() を渡してください。

guidはキャストのGUIDです。
catalog.getItemFromName("取得したいキャストの名前").guId で探してきて渡すのが良いかと思います。
GUIDは一度キャストを作ったら変化しません。ですので、ログ出力するなどでメモしておいて new Guid("GUID文字列") でcatalogから探さずに渡すとより高速です。

GameMainクラスにあるgetRelativeParam60FPS関数は、どういった値を返していますか?

getRelativeParam60FPS は直前のフレームからの経過時間を60FPS換算にしたものです。
毎フレーム1ずつカウントアップしていって、60で1秒とするプログラムの「1ずつ」の部分を本メソッドに置き換えることで、簡単に処理落ちや高リフレッシュレートに対応することが出来ます。
その必要がない場合は、 getElapsedTime() を使うのが良いでしょう。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS