プラグイン作成についてのFAQです。
FAQの内容は、ユーザーの皆さまからいただいたお問い合わせとそれに対する開発チームからの回答を元として作成しています。
プラグインの作り方を参照してください。
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
変更については、リソースを直接書き換えることになりますのでおすすめできません。
下記の pos, rot, scale がこれらの情報を管理しています。
((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号]
変更については、リソースを直接書き換えることになりますのでおすすめできません。
下記の useLight でオン・オフの情報を管理しています。
((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号]
変更については、リソースを直接書き換えることになりますのでおすすめできません。
下記の方法で可能です。
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
ただし、変更はデータベースを直接変更することになるため、おすすめできません。
下記を使って切替できます。
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 全般について値を変更することは推奨しません。
下記を使って取得・変更が可能です。
mapScene.mapFixCamera
また、各カメラ操作個別の許可・禁止については下記を使うことで取得・変更が可能です。
owner.data.start.camLockX owner.data.start.camLockY owner.data.start.camLockZoom owner.data.start.camLockReset
下記で使ってそれぞれの状態を取得することができます。
catalog.getGameSettings().CameraAvoidObjects catalog.getGameSettings().CameraAvoidTerrain
ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。
下記を使って情報を取得することはできます。
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の時点ではできません。
そのためゲーム定義でタイトル画面をスキップするようにし、イベントでゲーム内のタイトル画面と組み合わせて使う必要があります。
サンプルコードを添付します。
ConfigGetter.cs
アサインした上でC#メソッド「GetAutoDash」を実行すれば取得可能です。
下記をお使いください。
MapCharacter.getRigidBody().setFriction(摩擦値)
ただしMapCharacterで適宜摩擦をコントロールしているため、ふとしたタイミングで無効になる可能性がございます。
下記メソッドで可能です。
mapChr.setOpacityMultiplier(0.5f); // 透明度 0f で完全透明
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); }
下記のように操作できますが、
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は再生ラインを一つしか持っていないため、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#からしか効果がないのでご注意ください。
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(guid, dir); のように使えます。
dir は発射元と同じ方向を向かせたい場合、 mapChr.getDirectionRad() を渡してください。
guidはキャストのGUIDです。
catalog.getItemFromName("取得したいキャストの名前").guId で探してきて渡すのが良いかと思います。
GUIDは一度キャストを作ったら変化しません。ですので、ログ出力するなどでメモしておいて new Guid("GUID文字列") でcatalogから探さずに渡すとより高速です。
getRelativeParam60FPS は直前のフレームからの経過時間を60FPS換算にしたものを返します。
つまりこのメソッドは1フレームにかかった時間(60FPSであれば 0.016666666) を 60 倍したものを返すメソッドです。
C#スクリプトの Update() 内でframeCount++; とすると frameCount に 1 が加算され、処理落ちがない前提であれば、毎秒60回コールされて1秒に60ずつ増えることになります。
しかしこの方法だと、処理落ちが発生していたり、リフレッシュレートが60より高い場合に、1秒間に"30や120といった、"60"でない値が加算されてしまうことなります。
そこで、frameCount++ のかわりに frameCount += getRelativeParam60FPS() とすると
Update 1回につきかかった時間が 1/60 秒でなかった場合にも、確実に1秒間に60加算されるプログラムとすることが可能 となります。