プラグイン作成についての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.10段階ではできません。
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 でブレンドなしでモーション再生を開始します。
通常のモーション再生パネルではブレンドが邪魔という場合にお使いください。
下記の方法で取得することができます。
// コモンイベントを名前から探す(GUIDがわかっている場合はGUIDを直接セットしてもいいです)
var guid = catalog.getGameSettings().commonEvents.FirstOrDefault(x => catalog.getItemFromGuid(x)?.name == "実行したいイベント名");
if(guid != Guid.Empty)
{
// マップシーンからランナーを取得
var runner = mapScene.GetScriptRunner(guid);
// ランナーが取得できなかった(条件を満たしたシートが1つもない)場合は脱出
if (runner == null)
return;
// 実行開始
bool result = runner.Run();
// バトル中に実行したい場合は、バトル処理のメインループに組み込まれるようフラグを立てる
var btlEvtCtl = mapScene as BattleEventControllerBase;
if (result && btlEvtCtl != null)
{
btlEvtCtl.start(guid);
}
}
下記のように SetWaiter に Func<bool> を渡すことで、funcがfalseを返すまでイベントの進行を止めることができるようになります。
[BakinFunction]
public void WaitFunc()
{
float elapsed = 0;
runner.SetWaiter(() => {
elapsed += GameMain.getElapsedTime();
return elapsed < 10; // 10秒経過するまでイベントの進行を止める
});
}
下記を毎フレーム呼び出しください。
mapScene.GetCharacterScreenPos(MapCharacter, out var x, out var y, MapScene.EffectPosType.Head); mapScene.menuWindow.AdjustBalloonRect(x, y - 32);
colorはMicrosoft.Xna.Framework.Colorクラスを指定してください。
fontですが、サイズの指定が不要であれば、TextDrawerクラスではなく、Graphicsクラスの以下のメソッドにfontId=0を指定して表示してください。
Graphics.DrawString(0, "表示したい文字列", new Vector2(0, 0), Color.White);
サイズ指定が必要な場合は、SharpKmyGfx.Fontクラスのインスタンスを作成してTextDrawerのメソッドをご利用ください。
作成したSharpKmyGfx.Fontクラスのインスタンスは自前の処理にて破棄する必要があることに注意してください。
下記となります。
// イメージを表示
int spIndex = 0; // イメージ番号
int sliceNo = 0; // 画像に分割指定がある場合、左上を0(横優先)として何番目を表示するか
var guid = catalog.getItemFromName<Yukar.Common.Resource.Texture>("テクスチャ名")?.guId ?? Guid.Empty;
mapScene.spManager.ShowPicture(spIndex, guid, 100, 100, Microsoft.Xna.Framework.Color.White, sliceNo);
// 座標をセットする
int x = 0; // 座標X
int y = 0; // 座標Y
mapScene.spManager.Move(spIndex, 0, x, y);
// イメージとして文字列を表示
int spIndex = 0; // イメージ番号
int x = 0; // 座標X
int y = 0; // 座標Y
mapScene.spManager.ShowText(spIndex, "表示したい文字列", x, y);
それぞれ以下となります。
「プレイヤーの操作の許可/禁止」
許可
mapScene.playerLocked &= ~MapScene.PLAYER_LOCK_BY_EVENT;
禁止
mapScene.playerLocked |= MapScene.PLAYER_LOCK_BY_EVENT;
「プレイヤーの向きの変更の禁止・許可」
禁止
mapScene.owner.data.start.fixDirectionPlayer = true; mapScene.hero.dirMethod = MapCharacter.DirectionMethods.FIX;
許可
mapScene.owner.data.start.fixDirectionPlayer = false; mapScene.hero.dirMethod = MapCharacter.DirectionMethods.NORMAL;
「プレイヤーのダッシュの許可/禁止」
許可
mapScene.owner.data.system.dashAvailable = true;
禁止
mapScene.owner.data.system.dashAvailable = false;
「ジャンプの許可/禁止」
許可
mapScene.owner.data.system.jumpAvailable = true;
禁止
mapScene.owner.data.system.jumpAvailable = false;
「移動の許可/禁止」
許可
mapScene.owner.data.system.walkAvailable = true;
禁止
mapScene.owner.data.system.walkAvailable = true;
機能としては公開しておりません。
剛体があるものに関しましては、以下のように設定して物理で処理しております。
(tgtはMapCharacterクラスのインスタンス)
var rgd = tgt.getRigidbody(); tgt.setGravity(speed); tgt.fixHeight = false; tgt.refreshRigidBodyMask(); rgd.activate(true); rgd.setAngularDamping(0.5f); rgd.setPositionDamping(0.5f);
剛体がないものに関しましては、自前でY位置を移動してください。
下記にて時間を測ってください。
[BakinFunction]
public void WaitFunc()
{
float elapsed = 0;
runner.SetWaiter(() => {
elapsed += GameMain.getElapsedTime();
return elapsed < 10; // 10秒経過するまでイベントの進行を止める
});
}
スクリーン座標に変換するためにどちらのパネルでも同じくMapScene.GetCharacterScreenPos() を使用しています。
現在表示中のフリーレイアウトは GameMain.instance.freeLayouts に格納されています。
まだ表示されていないものを新しく表示する場合、下記のように catalog からレイアウトのROMを探してくる必要があります。
// 開く場合
var lyt = catalog.getLayoutProperties().AllLayoutNodes.FirstOrDefault(x => x.Name == "ItemSelect");
if (lyt != null)
{
GameMain.instance.ShowFreeLayout(lyt.Guid);
}
明示的に当たり判定を行うメソッドはありません。
接触時の当たり判定については、mapChr.collisionStatus.hitChrList にヒットした対象がリストで入っておりますのでそちらをお使いいただくか、レイキャストをご使用ください。
下記となります。
mapChr.collisionStatus.playerCollidable = true; // プレイヤーとぶつかる mapChr.collisionStatus.eventCollidable = true; // イベントとぶつかる mapChr.fixPos = true; // 押して動かせる
これらへの変更を反映するには下記の呼び出しが必要です。
mapChr.refreshRigidBodyMask(); // collidableのみ変更した場合 mapChr.refreshRigidBody(); // fixPosも変更した場合
MAP_SLOPEは坂と階段をターゲットとしています。
「周囲の当たり判定の確認(レイキャスト)」での実行ですが、チェック先を「地形」に設定しますと、坂にヒットします。
(「地形」ではCollisionType.MAP とCollisionType.MAP_SLOPEをターゲットとしています。)
ただし坂の高さが低いケースではヒットしません。
レイキャストの発射の高さを調整してみてください。
以下のような方法でできます。
var result = chr.getRigidbody().getPhysicsBase().rayCast( Util.ToKmyVector(thisCastPos), // from Util.ToKmyVector(playerPos), // to (ushort)(CollisionType.PLAYER) , hit);
AdvancedEnhance()をご利用ください。
使用方法については下記のスクリプトを参考にしてください。
ItemEnhancementSampleScript_1.cs
下記の手順でイベント実行付きで強化アイテムの入手を実行できます
[BakinFunction]
public void AddEnhancedItem()
{
var item = catalog.getItemFromName<Yukar.Common.Rom.NItem>("ロングソード");
var enhancedItem = item.CreateEnhancedItem();
catalog.addEnhancedItem(enhancedItem);
GameMain.instance.data.party.SetItemNum(enhancedItem.guId, 1, true);
var ev = catalog.getItemFromGuid(item.scriptOnNew) as Yukar.Common.Rom.Event;
var runner = mapScene.mapEngine.AddEvent(mapScene, ev, enhancedItem);
}
下記を使うことで可能です。
var item = catalog.getItemFromName<Yukar.Common.Rom.NItem>("ロングソード");
var enhancedItemList = GameMain.instance.data.party.Items.Where(x => x.BaseItemId == item.guId).Select(x => x.enhancedItem).ToList();
catalogからcastを探して、そのeventRefを渡すようにしていただければ可能です。
データベースで定義しているものは基本的にcatalogから探してくると良いでしょう。
GameMain.instance.pushTask(() =>
{
var cast = catalog.getItemFromName<Yukar.Common.Rom.Cast>("探したいキャスト名");
targetEvent.CreateEvent(cast.eventRef,
targetEvent.getDirectionRadian());
return false;
});
下記をご利用ください
// マップイベントは現状HPのみシステムからコントロールされており、それは下記でアクセス可能です。
mapChr.battleStatus.HitPoint;
// マップバトルシステムからはアクセスしませんが、その他の消費ステータスにアクセスする場合
mapChr.battleStatus.battleStatusData.consumptionStatusValue.GetStatus(catalog.getGameSettings(), "ステータスのキー");
// そのほかの通常ステータスの取得の場合
mapChr.battleStatus.battleStatusData.statusValue.GetStatus(catalog.getGameSettings(), "ステータスのキー");
nameはモーション名、blendTimeはモーションのブレンド開始時間です。
isTemporaryでfalseを指定すると現在再生中のモーション名を変更します。
このモーション名はwalk/run/jumpup/landing等のモーション名だった場合に挙動の判定に使用しています。trueにするとこのモーション名を変更しません。
doMotionLockはモーションが一周するまでユーザー操作によるモーション変化が起こらないようにするためのフラグとなりますが、おまじない程度と考えてください。
定義の引数部分にある=の後ろ(=false等)は引数を省略した場合に使われる値になります。
void Yukar.Engine.MapCharacter.playMotion( string name, float blendTime = 0.2f, bool isTemporary = false, bool doLockMotion = false )
コモンイベントから取得する場合は下記のスクリプトを参考にしてください。(関数のみを記載しています。)
Takable.txt
通常のイベントから取得する場合は下記のようにメソッドを変更してください。
[BakinFunction(Description = "このイベントに話しかけられる = 1 / 話しかけられない = 0")]
public int GetTalkableForThis()
{
// 現在選ばれているシートを取得
var scriptGuid = mapChr.getCurrentSheet()?.script ?? Guid.Empty;
var script = catalog.getItemFromGuid(scriptGuid) as Yukar.Common.Rom.Script;
// 成立しているシートなし
if (script == null)
return 0;
// 話しかけられるイベントでも、中身が空っぽだったら無視
if (script.commands.Count == 0)
return 0;
// 話しかけられる位置にいれば1を返す
if (mapScene.hero.collisionStatus.talkableChrList.Contains(mapChr) && script.trigger == Yukar.Common.Rom.Script.Trigger.TALK)
return 1;
return 0;
}
現時点(Ver.1.10)ではできません。
下記をお使いください。
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 index = 1; // 目的のサブグラフィック番号
foreach (var obj in mapChr.DisplayObjects)
{
if(obj.index == index && obj.instance is SharpKmyGfx.LocalLight lgt)
{
lgt.setIntensity(強さ);
lgt.setColor(色);
lgt.setRadius(半径);
}
}
変更については、リソースを直接書き換えることになりますのでおすすめできません。
下記の方法で可能です。
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); を実行してください。
下記のコードで変更できます。
var lgt = mapScene.mapDrawer.mapRom.localLights.FirstOrDefault(x => x.name == "探したいローカルライトの名前");
lgt.setIntensity(強さ);
lgt.setColor(色);
lgt.setRadius(半径);
mapScene.mapDrawer.renderSettingsから取得できます。
設定について、一部の項目はこの設定値を変更することで反映しますが、即時には反映しない項目もあります。
スカイボックス等のリソースのロードを伴う項目の変更は mapScene.mapDrawer.setRenderSettings() ご使用ください。
下記のコードで 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
ただし、変更はデータベースを直接変更することになるため、おすすめできません。
MapCharacter.invalidDamageColor に定義があります。
下記を使って切替できます。
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」を実行すれば取得可能です。
それぞれ下記となります。
「移動軸は横と奥行き」
mapScene.owner.catalog.getGameSettings().axisMode = Yukar.Common.Rom.GameSettings.AxisMode.XZ;
「移動軸は横と高さ」
mapScene.owner.catalog.getGameSettings().axisMode = Yukar.Common.Rom.GameSettings.AxisMode.XY;
ゲーム実行中にアイテム袋の最大値を変更する場合 GameMain.instance.data.party.inventoryMax をご利用ください。
この値はゲーム定義の方ではなくセーブデータに保存されますので、次回ロード時も変更後の値になります。
SEの変更は以下の手順で変更できます。
var sound = catalog.getItemFromName<Yukar.Common.Resource.SoundResource>("サウンド名");
Audio.UnloadSound(GameMain.instance.se.decide);
GameMain.instance.se.decide = Audio.LoadSound(sound);
ただしこれらはセーブデータへの保存対象ではないため、変更するたびに実行が必要になります。
下記をお使いください。
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 = "特殊座標タグ書き換え";
}
GameMain.instance.freeLayouts.Countを見る場合は以下をお使いください。
// 全て非表示 GameMain.instance.HideALLFreeLayout(mapScene.isBattle); // 選択したレイアウトのみ表示 GameMain.instance.ShowFreeLayout(layoutGuid, mapScene.isBattle); // 選択したレイアウトを追加して表示 GameMain.instance.AddFreeLayout(layoutGuid, mapScene.isBattle); // 選択したレイアウトを非表示 GameMain.instance.HideFreeLayout(layoutGuid, mapScene.isBattle);
プラグインリファレンス:Yukar.Engine.RenderContainer クラスの説明内にあるShow/Hideメソッドを使用してください
アニメーション不要な場合は ShowWithNotAnimation/HideWithNotAnimation が使えます。
プラグインリファレンスにて"RenderContainer"で検索すると該当のクラスが見つかります。
https://rpgbakin.com/csreference/doc/ja/class_yukar_1_1_engine_1_1_render_container.html
下記の方法で現在表示中のレイアウトにアクセスできます。
[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();
}
キャンセルを禁止するには下記の方法が利用できます。
Update() 内に記述するなどしてお試しください。
var menu = mapScene.menuWindow as LayoutMenuController;
var lyt = menu.mainMenu;
while (lyt.NextlayoutManager != null)
lyt = lyt.NextlayoutManager;
if (lyt.LayoutNode.Name == "SkillSelect") // SkillSelect の部分には対象にしたいレイアウトの名前を入れる
{
// 基本はロック解除の状態にする
if (lyt.IsLocked())
lyt.UnLock();
// キャンセル禁止
if (Input.KeyTest(Input.StateType.TRIGGER, Input.KeyStates.CANCEL, Input.GameState.MENU) && !lyt.IsLocked())
lyt.Lock();
}
まず以下のようにdefaultPositionにも値を設定する必要があります。
(defaultPositioにアクセスするためキャストも必要)
var node = lyt.LayoutDrawer.ParseNodes().FirstOrDefault(x => x.MenuItem.name == RenderContainerName) as RenderContainer; node.Position = node.defaultPosition = node.MenuItem.pos = new Vector2(scrnPosX, scrnPosY); // 直接移動させる場合
アニメに使用するスプライトが切り替わる時にレイアウトデータから基準座標を取得し更新が入りますので、defaultPositionに加えてnode.MenuItem.posも書き換えることで実現可能とは思いますが、レイアウトツール上の座標変更になります。(こちらは非推奨です)
現在初回のみにSetLayoutPosition()にて位置を設定しておりますが、表示中は毎フレームdefaultPositionを書き換えて頂ければ回避可能と存じます。
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 を見て上限チェックをしてください。
下記のようにcatalogからromを取得してください。
var rom = catalog.getItemFromGuid(guid) as Yukar.Common.Resource.SoundResource; Audio.LoadSound(rom);
システムとしての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加算されるプログラムとすることが可能 となります。
Util.UnProject2World()は画面上のXY座標を3D空間上の座標時に変換するメソッドです。
現在のカメラの射影行列とビュー行列を渡します。
基本的には mapScene.CurrentPP, mapScene.CurrentVV を指定してください。
Input.KeyTest()はゲーム中の入力デバイスの状態を取得するメソッドです。
タッチ動作のシミュレーションがが目的のためそのような値を返すように加工しております。
加工なしの値が欲しい場合は、GameStateをWALKではなくSYSTEMを指定してください。
setPositiionを使うとはvelocityのリセットがかかってしまうため、その代わりに補正したい座標との差分を取って、 MapCharacter.Move メソッドで座標を移動してください。
C#スクリプトから変更の場合、以下になります。
カメラ
mapScene.CameraManager.ntpCamera
キーフレーム
getKeyFrame()
DOF
Yukar.Common.Rom.Camera.KeyFrame.dof
X=焦点係数, Y=焦点範囲係数, Z=ぼかし半径
C#スクリプトで値を変更した場合、カメラツールで設定している値を書き換えてしまいますのでご使用にはその点をご注意ください。
var indexに保存スロットの番号を取得しています。
[BakinFunction(Description = "説明文 / Description")]
public void Func()
{
var lc = mapScene.GetMenuController();
var lm = lc.mainMenu;
var index = lm.SelectProp.SelectSaveIndex;
}
var lm = lc.mainMenuはメインメニューから保存した場合になります。
イベントから「セーブ画面を表示」で保存した場合は、lm = lc.saveに変更してください。