#author("2024-07-20T11:17:01+09:00;2024-07-17T15:28:48+09:00","default:admin","admin")
#author("2024-12-22T16:15:31+09:00","default:admin","admin")
*プラグイン作成 FAQ [#ia027cab]
プラグイン作成についてのFAQです。
FAQの内容は、ユーザーの皆さまからいただいたお問い合わせとそれに対する開発チームからの回答を元として作成しています。

#Contents
----
**プラグインの作成について [#z3dcec55]
***プラグインはどうやって作成すればよいですか? [#w392bc64]
[[プラグインの作り方:https://rpgbakin.com/pukiwiki/?%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#v2e3b2ae]]を参照してください。

***イベントエディターからC#プログラムを編集するときに起動するエディタを選択する事は出来ますか? [#ba891e64]
slnファイルの関連付けをVisual Studio以外に設定することで、別のエディタを使うことができます。

----
**イベント関係 [#da58dbeb]
***「会話を表示」や「メッセージを表示」パネルに相当するメソッドはありますか? [#m0376b52]
「会話」は下記メソッドで可能です。 0 の部分は 1,2,3 などにするとウィンドウのポジション(上中下)が変わります。

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

DialogueCharacterProperty() の引数に会話するキャラのグラフィックなどを指定出来ますが、
引数は概ねパネルで設定できる内容と連動しているかと思いますので、必要であればお試しください。
#br
「メッセージ」は下記メソッドです。会話と同じく第二引数の 0 はウィンドウポジションの指定です。

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

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

 mapScene.ShowTelop(msg, 0, MenuControllerBase.WindowTypes.TELOP, new AbstractRenderObject.GameContent.TelopProperty(), mapChr.guId);
#br
ShowDialogue, ShowMessage は戻り値にその場限りの id が返りますので、これを使って
mapScene.IsQueuedDialogue(id) や 
mapScene.IsQueuedMessage(id)
を実行すると、表示した会話やメッセージがまだ表示中(閉じられていない)かどうかがわかります。

***会話メッセージやダイアログを閉じることはできますか? [#v4e5c39c]
Ver.1.10段階ではできません。

***「イメージとして画面に文字を表示する」パネルに相当するメソッドはどれですか? [#p4db3d09]
Graphics.DrawString (縁取りあり)や
Graphics.DrawStringSoloColor (縁取りなし)をご利用ください。
現時点(ver.1.9)では書式によるテキスト装飾に関するメソッドは公開しておりません。 
(書式によるテキスト装飾が必要な場合、SpriteManager の公開をお待ち下さい。)

***「レンダリング設定の変更」パネルに相当するメソッドはどれですか? [#s29ba613]
下記をお使いください。
 var render = catalog.getItemFromName<Yukar.Common.Rom.RenderSettings>("レンダリング設定名前");
 mapScene.mapDrawer.setRenderSettings(render);


***「イベントのモーションを変更」や「キャストのモーションを変更」パネルに該当するメソッドはどれですか? [#o4b5b034]
下記の2つのどちらかをお使いください。
 mapChr.playMotion("モーション名") 
 mapScene.hero.playMotion(("モーション名", 0.2f, true, lockMotion))
※lockMotion = 歩きなどで解除されないようにするかどうか / true でロック, false でロックなしになります。

***「プレイヤーにブレンドシェイプを適用」に該当するメソッドはどれですか? [#ue9b709b]
キーを指定して適用する場合は下記をお使いください。
 mapScene.hero.getModelInstance().setMorphBlend("キー名", 0.5f);
 
クリップを指定して適用する場合は下記をお使いください。
引数はそれぞれ 適用対象、クリップ名、補間時間、他のブレンドシェイプをリセットするかどうか です。
 ScriptRunner.AddBlendShapeTask(mapScene.hero, "クリップ名", 4, false);


***モーションの終了を取得する方法はありますか? [#xeadccf3]
下記のサンプルコードをイベントにバインドしてご利用ください。
[[MotionUtil.cs:https://rpgbakin.com/pukiwiki/?plugin=attach&pcmd=open&file=MotionUtil.cs&refer=%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%20FAQ]]
GetMotionLoopCount でモーションのループ回数を取得します。
ワンショットの場合、1だったらモーション完了とみなす事ができます。

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

***「コモンイベントの実行」をC#で取得する方法はありますか? [#qf6cf61e]
下記の方法で取得することができます。
 // コモンイベントを名前から探す(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);
     }
 }

***選択肢を表示している間は次のイベントパネルに進まずに止めておく方法と再開する方法はありますか? [#gbba60ef]
下記のように SetWaiter に Func<bool> を渡すことで、funcがfalseを返すまでイベントの進行を止めることができるようになります。
 
        [BakinFunction]
        public void WaitFunc()
        {
            float elapsed = 0;
            runner.SetWaiter(() => {
                elapsed += GameMain.getElapsedTime();
                return elapsed < 10; // 10秒経過するまでイベントの進行を止める
            });
        }

***プレイヤーやキャストの位置に吹き出しを表示させることはできますか? [#w3fa8d77]
下記を毎フレーム呼び出しください。
 mapScene.GetCharacterScreenPos(MapCharacter, out var x, out var y, MapScene.EffectPosType.Head);
 mapScene.menuWindow.AdjustBalloonRect(x, y - 32);
 

***文字列を表示するYukar.Engine.TextDrawer.DrawString()に指定するfontとcolorには何を指定すればよいですか? [#ieb0bf9b]

colorはMicrosoft.Xna.Framework.Colorクラスを指定してください。
fontですが、サイズの指定が不要であれば、TextDrawerクラスではなく、Graphicsクラスの以下のメソッドにfontId=0を指定して表示してください。
 Graphics.DrawString(0, "表示したい文字列", new Vector2(0, 0), Color.White);
サイズ指定が必要な場合は、SharpKmyGfx.Fontクラスのインスタンスを作成してTextDrawerのメソッドをご利用ください。
作成したSharpKmyGfx.Fontクラスのインスタンスは自前の処理にて破棄する必要があることに注意してください。

***イベントパネル「イメージを表示」「イメージとして画面に文字を表示する」に相当するメソッドはありますか? [#w8ac4c1f]
下記となります。
 // イメージを表示
 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);

***イベントパネル「プレイヤーの操作の許可/禁止」「プレイヤーの向きの変更の禁止・許可」「プレイヤーのダッシュの許可/禁止」「ジャンプの許可/禁止」「移動の許可/禁止」に該当する方法はありますか? [#g95f103e]
それぞれ以下となります。
「プレイヤーの操作の許可/禁止」
 許可
  mapScene.playerLocked &= ~MapScene.PLAYER_LOCK_BY_EVENT;
 禁止
  mapScene.playerLocked |= MapScene.PLAYER_LOCK_BY_EVENT;
#br
「プレイヤーの向きの変更の禁止・許可」
 禁止
  mapScene.owner.data.start.fixDirectionPlayer = true;
  mapScene.hero.dirMethod = MapCharacter.DirectionMethods.FIX;
 許可
  mapScene.owner.data.start.fixDirectionPlayer = false;
  mapScene.hero.dirMethod = MapCharacter.DirectionMethods.NORMAL;
#br
「プレイヤーのダッシュの許可/禁止」
 許可
  mapScene.owner.data.system.dashAvailable = true;
 禁止
  mapScene.owner.data.system.dashAvailable = false;
#br
「ジャンプの許可/禁止」
 許可
  mapScene.owner.data.system.jumpAvailable = true;
 禁止
  mapScene.owner.data.system.jumpAvailable = false;
#br
「移動の許可/禁止」
 許可
  mapScene.owner.data.system.walkAvailable = true;
 禁止
  mapScene.owner.data.system.walkAvailable = true;

***イベントパネル「プレイヤーの落下を開始」「イベントの落下を開始」に該当する方法はありますか? [#d4ce5d35]
機能としては公開しておりません。
剛体があるものに関しましては、以下のように設定して物理で処理しております。
(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位置を移動してください。

***イベントパネル「指定した時間待つ」に該当する方法はありますか? [#k42068f2]
下記にて時間を測ってください。
 [BakinFunction]
        public void WaitFunc()
        {
            float elapsed = 0;
            runner.SetWaiter(() => {
                elapsed += GameMain.getElapsedTime();
                return elapsed < 10; // 10秒経過するまでイベントの進行を止める
            });
        }

***イベントパネル「エフェクトの表示」「感情マークを表示」にある表示位置>「プレイヤーを中心に表示する」に相当するメソッドはどれですか? [#h28e679c]
スクリーン座標に変換するためにどちらのパネルでも同じくMapScene.GetCharacterScreenPos() を使用しています。

***イベントパネル「イベント用フリーレイアウトの表示」の機能である「追加して表示」に該当するコードを教えてください。 [#jdcb00f8]
現在表示中のフリーレイアウトは GameMain.instance.freeLayouts に格納されています。 
まだ表示されていないものを新しく表示する場合、下記のように catalog からレイアウトのROMを探してくる必要があります。
  // 開く場合
 var lyt = catalog.getLayoutProperties().AllLayoutNodes.FirstOrDefault(x => x.Name == "ItemSelect");
 if (lyt != null)
 {
     GameMain.instance.ShowFreeLayout(lyt.Guid);
 }

***イベント接触時の当たり判定に関するメソッドはありますか? [#k92aa430]
明示的に当たり判定を行うメソッドはありません。
接触時の当たり判定については、mapChr.collisionStatus.hitChrList にヒットした対象がリストで入っておりますのでそちらをお使いいただくか、レイキャストをご使用ください。

***イベントエディターの衝突設定「プレイヤーとぶつかる」「他のイベントとぶつかる」「押して動かせる」のオン/オフを切り替えるコードはありますか? [#a935e16d]
下記となります。
 mapChr.collisionStatus.playerCollidable = true; // プレイヤーとぶつかる
 mapChr.collisionStatus.eventCollidable = true; // イベントとぶつかる
 mapChr.fixPos = true; // 押して動かせる
これらへの変更を反映するには下記の呼び出しが必要です。
 mapChr.refreshRigidBodyMask(); // collidableのみ変更した場合
 mapChr.refreshRigidBody(); // fixPosも変更した場合


***レイキャストのCollisionTypeで選択できる、「MAP_SLOPE」は何に反応するものでしょうか? [#f269b7ff]
MAP_SLOPEは坂と階段をターゲットとしています。
「周囲の当たり判定の確認(レイキャスト)」での実行ですが、チェック先を「地形」に設定しますと、坂にヒットします。
(「地形」ではCollisionType.MAP とCollisionType.MAP_SLOPEをターゲットとしています。)
ただし坂の高さが低いケースではヒットしません。
レイキャストの発射の高さを調整してみてください。

***レイキャスト機能を使用してキャストイベントにプレイヤーを探知させる方法はありますか? [#kec90d97]
以下のような方法でできます。
 var result = chr.getRigidbody().getPhysicsBase().rayCast(
   Util.ToKmyVector(thisCastPos),      // from
   Util.ToKmyVector(playerPos),        // to
   (ushort)(CollisionType.PLAYER) , hit);

***強化アイテムをプラグインで強化する方法はありますか? [#nf3f3933]
AdvancedEnhance()をご利用ください。
使用方法については下記のスクリプトを参考にしてください。
[[ItemEnhancementSampleScript_1.cs:https://rpgbakin.com/pukiwiki/?plugin=attach&pcmd=open&file=ItemEnhancementSampleScript_1.cs&refer=%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%20FAQ]]

***強化アイテム取得した際にアイテム取得時のイベントを走らせる方法はありますか? [#ga0f0c00]
下記の手順でイベント実行付きで強化アイテムの入手を実行できます
        [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);
         }

***同じアイテム名が複数あった場合にListなどの方法でまとめて取得することはできますか? [#gaa29871]
下記を使うことで可能です。
 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();


***マップ上に未配置のキャストイベントを生成することはできますか? [#ieabbd0e]
catalogからcastを探して、そのeventRefを渡すようにしていただければ可能です。
データベースで定義しているものは基本的にcatalogから探してくると良いでしょう。
            GameMain.instance.pushTask(() =>
            {
                var cast = catalog.getItemFromName<Yukar.Common.Rom.Cast>("探したいキャスト名");
                targetEvent.CreateEvent(cast.eventRef,
                targetEvent.getDirectionRadian());
                return false;
            });

***キャストイベントの「現在のHP」など、消費型ステータスの現在値を取得・設定するコードはありますか? [#gf011290]
下記をご利用ください 
  // マップイベントは現状HPのみシステムからコントロールされており、それは下記でアクセス可能です。
            mapChr.battleStatus.HitPoint;
 
            // マップバトルシステムからはアクセスしませんが、その他の消費ステータスにアクセスする場合
            mapChr.battleStatus.battleStatusData.consumptionStatusValue.GetStatus(catalog.getGameSettings(), "ステータスのキー");
 
            // そのほかの通常ステータスの取得の場合
            mapChr.battleStatus.battleStatusData.statusValue.GetStatus(catalog.getGameSettings(), "ステータスのキー");

***イベントのグラフィックのモーション再生に関するYukar.Engine.MapCharacter.playMotion()の引数の意味を教えてください。 [#gc73502f]
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 
 )

***イベントが「話しかけられる状態(イベント開始条件が「話しかけたとき」の条件が成立している状態)」になっているかどうかを取得する方法はありますか? [#uae57ba5]
コモンイベントから取得する場合は下記のスクリプトを参考にしてください。(関数のみを記載しています。)
[[Takable.txt:https://rpgbakin.com/pukiwiki/?plugin=attach&pcmd=open&file=Takable.txt&refer=%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%20FAQ]]
通常のイベントから取得する場合は下記のようにメソッドを変更してください。
 [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;
        }

***ヒットストップ表現を実装するために、キャストイベントの再生中のアニメーションを一時停止・再生することはできますか? [#cf3a3995]
現時点(Ver.1.10)ではできません。

----
**リソース [#yda86c46]
***スタンプのサブグラフィックのオン・オフを切り替えることはできますか? [#e4848880]
下記をお使いください。
 mapChr.SetSubGraphicOpacity 

***スタンプのサブグラフィックの「位置のみを適応」のオン・オフを切り替えることはできますか? [#kcc6cedb]
サブグラフィックの位置はmapChr.DisplayObjects 内に各表示物の座標更新用マトリクス取得関数として解釈されますので、動的な変更はできません。
下記を使って取得することはできます。
   ((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号].useTranslateOnly
#br
''変更については、リソースを直接書き換えることになりますのでおすすめできません。''

***スタンプのサブグラフィックの相対位置XYZ、相対角度XYZ、スケールXYZを設定することはできますか? [#k5ffffc3]
下記の pos, rot, scale がこれらの情報を管理しています。
 ((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号] 
#br
''変更については、リソースを直接書き換えることになりますのでおすすめできません。''


***スタンプのサブグラフィックのローカルライト連動の「利用する」のオン・オフを切り替えることはできますか? [#a95916a3]
下記の useLight でオン・オフの情報を管理しています。
 ((Yukar.Common.Resource.GfxResourceBase)mapChr.getGraphic()).SubGraphics[サブグラフィック番号] 
#br
''変更については、リソースを直接書き換えることになりますのでおすすめできません。''

***サブグラフィックに設定できるローカルライトの色・強度・半径を設定するコードはありますか? [#qde81143]
下記の手順で設定できます。
            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(半径);
                }
            }
#br
''変更については、リソースを直接書き換えることになりますのでおすすめできません。''

***パターンアニメのモーションを指定して、2D描画することはできますか?ビルボード表示ではなく、2Dイメージをそのまま表示する方法を教えてください。 [#s8fc80fa]
下記の方法で可能です。
 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 で消すことが出来ます。
こちらはイベントパネル「イメージを表示」で使っているクラスです。


----
**マップ関連 [#rec506a5]
***マップエディターのように、マップ上でオブジェクトにカーソルを合わせた際にオブジェクトが縁取りするためのメソッドはありますか? [#f9b69aa3]
この機能はエディタ専用の描画パス(ピックアップバッファ)を利用しているため、エンジンでは利用できません。

***マップ設定パレット>基本タブ>「カメラ追従範囲」で設定した座標を取得する方法はありますか? [#r8a9002b]
下記をお使いください。
 mapScene.map.mapCameraRange 
if(mapScene.map.mapCameraRange == Rectangle.Empty) が true のときは未設定(制限なし)になります。

***マップ設定パレット>レンダリング設定タブにある「背景」セクションの「遠景モデル」及び「環境マップ」を変更することはできますか? [#fe891132]
mapScene.mapDrawer.renderSettings.skyModel にモデルのGUIDを
mapScene.mapDrawer.renderSettings.reflection に環境マップテクスチャのGUIDをセットしたのち、
mapScene.mapDrawer.setRenderSettings(mapScene.mapDrawer.renderSettings); を実行してください。

***マップに配置したローカルライトの色・強度・半径を設定するコードはありますでしょうか? [#pc099c0d]
下記のコードで変更できます。
var lgt = mapScene.mapDrawer.mapRom.localLights.FirstOrDefault(x => x.name == "探したいローカルライトの名前");
            lgt.setIntensity(強さ);
            lgt.setColor(色);
            lgt.setRadius(半径);

***「マップ設定」の中の「レンダリング」にある「ライト」や「フォグ」などの値を取得および設定するコードはありますか?ゲーム内時間経過により日の出/日の入りを表現することなどを想定しています。 [#xfd9ec09]
mapScene.mapDrawer.renderSettingsから取得できます。
設定について、一部の項目はこの設定値を変更することで反映しますが、即時には反映しない項目もあります。
スカイボックス等のリソースのロードを伴う項目の変更は mapScene.mapDrawer.setRenderSettings() ご使用ください。


----
**マップバトル [#x922c1f1]
***キャストの種別指定(味方・敵・両方・なし)を変更するコードはありますでしょうか? [#p7f6309a]
下記のコードで mapChr のキャストタイプが取得可能です。
 var type = mapChr.rom?.CastType ?? Yukar.Common.Rom.CastType.ALLY;
[[キャストやイベント同士の当たり判定]]を参考に判断してみてください。

***マップバトルの際に表示されるダメージ表示の色や大きさを変更することはできますか? [#s258a85f]
下記のコードで可能です
            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:https://rpgbakin.com/pukiwiki/?plugin=attach&pcmd=open&file=ChangeFieldBattleViewer.cs&refer=%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%20FAQ]]

***マップバトルの際、クリティカルダメージを発生させる方法はありますか? [#u8928c8b]
クリティカル率に基づいてランダムに判定を行っているため、単純に確定で発生させることは出来ません。
状態変化を使って、一時的にクリティカル率を上昇・下降させてしまうのが良いかと思います。


***マップバトルの際、ダメージを受けたキャストの色が変化してから元に戻るまでの時間を設定することはできますか? [#of2b1e13]
下記を使うことで取得はすることはできます。
 mapChr.rom.InvincibleTime 
''ただし、変更はデータベースを直接変更することになるため、おすすめできません。''

***マップバトル使用時に、ダメージを受けたキャストの色(デフォルトでは白色)を変更するコードはありますでしょうか? [#udb9e5db]
MapCharacter.invalidDamageColor に定義があります。

----
**ゲーム定義 [#fde57f94]
***ルールと操作の「標準操作」および「ラジコン操作」のON/OFFを取得・変更することはできますか? [#rf2a4200]
***[[移動と操作]]の「標準操作」および「ラジコン操作」のON/OFFを取得・変更することはできますか? [#rf2a4200]
下記を使って切替できます。
 GameMain.instance.data.start.controlMode = Yukar.Common.Rom.GameSettings.ControlMode.NORMAL;
 GameMain.instance.data.start.controlMode = Yukar.Common.Rom.GameSettings.ControlMode.RESIDENT_EVIL_LIKE;


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

***ルールと操作の「カメラ操作を許可しない」のON/OFFを取得・変更することはできますか? [#w44d8794]
***[[移動と操作]]の「カメラ操作を許可しない」のON/OFFを取得・変更することはできますか? [#w44d8794]
下記を使って取得・変更が可能です。
 mapScene.mapFixCamera

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

***ルールと操作>カメラ距離自動調整の「地形」および「物体」をON/OFFすることはできますか? [#y0ceb8f9]
***[[移動と操作]]>カメラ距離自動調整の「地形」および「物体」をON/OFFすることはできますか? [#y0ceb8f9]
下記で使ってそれぞれの状態を取得することができます。
 catalog.getGameSettings().CameraAvoidObjects
 catalog.getGameSettings().CameraAvoidTerrain

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


***ルールと操作の「自動的にプレイヤーの後ろに回り込む」のON/OFFを取得・変更することはできますか? [#j384f163]
***[[移動と操作]]の「自動的にプレイヤーの後ろに回り込む」のON/OFFを取得・変更することはできますか? [#j384f163]
下記を使って情報を取得することはできます。
GameMain.instance.catalog.getGameSettings().isTpsMode
''ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。''

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

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


***ルールと操作>移動(慣性)の「標準旋回速度」を変更することはできますか? [#g6390204]
***[[移動と操作]]>移動(慣性)の「標準旋回速度」を変更することはできますか? [#g6390204]
下記を使って速度を取得することはできます。
 GameMain.instance.catalog.getGameSettings().DefaultRotateSpeed 
''ただし、変更はゲーム定義の値を直接編集することになりますので、おすすめできません。''

***ゲーム定義>ルールと操作>デバイス入力値の調整要素にある「マウス上下」などの「感度」を変更することはできますか? [#s14edda1]
***ゲーム定義>[[移動と操作]]>デバイス入力値の調整要素にある「マウス上下」などの「感度」を変更することはできますか? [#s14edda1]
できません。
代わりに Input.GetAxis() の値に応じてカメラを回転させる処理を自前で作成することで、場合に応じて回転速度を変更することで対応してください。

***プロジェクト設定のバージョン 製作者などをタイトルに表示するにはどうしたらよいですか? [#w0895bb0]
下記を使って情報を取得することはできます。
 catalog.getGameSettings().meta.buildVer 
 
そのうえで下記のように変数に情報を格納すればレイアウト上に表示できます。
 GameMain.instance.data.system.SetVariable("変数名", catalog.getGameSettings().meta.buildVer.ToString(), Guid.Empty, false);

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

***コンフィグ画面にある「自動ダッシュ」のON/OFFの判定を取得することはできますか? [#r2344858]
サンプルコードを添付します。
[[ConfigGetter.cs:https://rpgbakin.com/pukiwiki/?plugin=attach&pcmd=open&file=ConfigGetter.cs&refer=%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%20FAQ]]
アサインした上でC#メソッド「GetAutoDash」を実行すれば取得可能です。

***ルールと操作の「操作」カテゴリーにおける「移動軸は横と奥行き」と「移動軸は横と高さ」とを変更する方法はありますか? [#o5b8d030]
***[[移動と操作]]の「操作」カテゴリーにおける「移動軸は横と奥行き」と「移動軸は横と高さ」とを変更する方法はありますか? [#o5b8d030]
それぞれ下記となります。
「移動軸は横と奥行き」
 mapScene.owner.catalog.getGameSettings().axisMode = Yukar.Common.Rom.GameSettings.AxisMode.XZ;
「移動軸は横と高さ」
 mapScene.owner.catalog.getGameSettings().axisMode = Yukar.Common.Rom.GameSettings.AxisMode.XY;

***ルールと操作の「ゲームシステムの定義」のアイテム袋の最大容量を変更することはできますか? [#t984854e]
***[[ルールと描画]]の「ゲームシステムの定義」のアイテム袋の最大容量を変更することはできますか? [#t984854e]
ゲーム実行中にアイテム袋の最大値を変更する場合 GameMain.instance.data.party.inventoryMax をご利用ください。
この値はゲーム定義の方ではなくセーブデータに保存されますので、次回ロード時も変更後の値になります。


***システムリソースの「システム効果音の設定」にある決定やキャンセルなどの効果音を設定・変更することはできますか? [#lfbd595c]
SEの変更は以下の手順で変更できます。
 var sound = catalog.getItemFromName<Yukar.Common.Resource.SoundResource>("サウンド名");
  Audio.UnloadSound(GameMain.instance.se.decide);
  GameMain.instance.se.decide = Audio.LoadSound(sound);
ただしこれらはセーブデータへの保存対象ではないため、変更するたびに実行が必要になります。

----
***「地形」と「プレイヤー」また「キャスト」との摩擦を設定する方法はありますか? [#fb3a4fcd]
下記をお使いください。
 MapCharacter.getRigidBody().setFriction(摩擦値)
ただしMapCharacterで適宜摩擦をコントロールしているため、ふとしたタイミングで無効になる可能性がございます。

***プレイヤーおよびキャストの透明度を変更することはできますか? [#lf254376]
下記メソッドで可能です。
 mapChr.setOpacityMultiplier(0.5f); // 透明度 0f で完全透明

***プレイヤーを透明化するために、mapScene.hero.setOpacityMultiplier(値)を試してみましたが、効果がないようです。 [#xbc44c2f]
setOpacityMultiplier について、プレイヤーは状態変化による透明度変化を常に監視・適用しているため、変更しても上書きされてしまいます。
AfterDraw() で毎フレームセットしてみてください。


----
**レイアウト [#ga0ba69d]
***指定した名前のフリーレイアウトを開く/閉じるコードはありますか? [#o2ac1942]
下記のコードをご利用ください。
 // 開く場合
 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#から設定することはできますか? [#kb6d789e]
下記のように操作できますが、
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 が0以外になっているかで判定していましたが、mapScene.ShowEventLayout メソッドで表示した場合は0 => 1 になりません。このメソッドはどのように使えばよろしいですか? [#qcf1b646]
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);



***イベント用フリーレイアウトのRenderContainer>基本>表示条件スイッチに該当するコード(RenderContainerごとの表示非表示を操作するコード)はありますか? [#waaf8f17]
プラグインリファレンス:Yukar.Engine.RenderContainer クラスの説明内にあるShow/Hideメソッドを使用してください
アニメーション不要な場合は ShowWithNotAnimation/HideWithNotAnimation が使えます。

プラグインリファレンスにて"RenderContainer"で検索すると該当のクラスが見つかります。
https://rpgbakin.com/csreference/doc/ja/class_yukar_1_1_engine_1_1_render_container.html



***レイアウトの選択されたコンテナのコンテナ管理番号(インデックス)を取得することはできますか? [#sb27c497]
下記の方法で現在表示中のレイアウトにアクセスできます。
 
        [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();
        }

***プラグインを使ってレイアウトをキャンセルボタンで閉じないようにすることはできますか? [#q1104376]
キャンセルを禁止するには下記の方法が利用できます。
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();
    }

***イベント用フリーレイアウトの表示位置を制御にはどうしたらよいですか? [#v21f9423]
まず以下のようにdefaultPositionにも値を設定する必要があります。
(defaultPositionにアクセスするためキャストも必要)
  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を書き換えて頂ければ回避可能と存じます。

----
**データベース [#lc2957df]
***キャストのデータベースに記入してある管理タグ+メモの文字列を取得する事はできますか? [#q6f7a4cf]
tags というフィールドがそうです。
下記にてアクセスできます。
 catalog.getItemFromName<Yukar.Common.Rom.Cast>("Hero").tags

***キャストが習得するスキルの一覧を取得することはできますか? [#n4ae278c]
キャストが習得するスキルは 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>();


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

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

 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 を見て上限チェックをしてください。


**サウンド [#j1ecc16a]
***効果音を再生するコードはありますか? [#jc656827]
下記のようにcatalogからromを取得してください。 
 var rom = catalog.getItemFromGuid(guid) as Yukar.Common.Resource.SoundResource;
 Audio.LoadSound(rom);

***BGMをクロスフェードさせることはできますか? [#sc2b77d2]
システムとしてのBGMは再生ラインを一つしか持っていないため、Audio.PlayBGMではできません。

まず下記の方法で、効果音として音量ゼロで再生開始(この場合でもループ設定は反映されます)してください。 
            var id = Audio.LoadSound(guid);
            Audio.PlaySound(id, 0, 0, 1);
 
その後下記を使って、毎フレームボリュームを操作し、前のBGMを0に近づけつつ、新しいBGMの音量を1に近づけてください。
            Audio.SetSEVolume(id, volume);



----
**そのほか [#i83a30a8]
***バトル中にバトルカメラを切り替えることはできますか? [#o63e041d]
下記のコードで変更できます。
            GameMain.instance.data.system.currentBattleCameraSet = "カメラセット名";
 
カメラ切り替わりのタイミングで反映されますが、即時反映したい場合は、下記コードで可能です
 
           mapScene.applyCameraToBattle();

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

***特定の画像を表示させたい場合、Graphics.DrawImageの引数はどのように記述すればよいでしょうか? [#idf91899]
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()は使用可能でしょうか?可能な場合、メソッドの引数の設定はどのようにすればいいですか。 [#f53eaf0b]
使用可能です。
mapChr.CreateEvent(guid, dir); のように使えます。
dir は発射元と同じ方向を向かせたい場合、 mapChr.getDirectionRad() を渡してください。

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


***GameMainクラスにあるgetRelativeParam60FPS関数は、どういった値を返していますか? [#b9e89b18]
getRelativeParam60FPS は直前のフレームからの経過時間を60FPS換算にしたものを返します。
つまりこのメソッドは1フレームにかかった時間(60FPSであれば 0.016666666) を 60 倍したものを返すメソッドです。
#br
C#スクリプトの Update() 内でframeCount++; とすると frameCount に 1 が加算され、処理落ちがない前提であれば、毎秒60回コールされて1秒に60ずつ増えることになります。
しかしこの方法だと、処理落ちが発生していたり、リフレッシュレートが60より高い場合に、1秒間に"30や120といった、"60"でない値が加算されてしまうことなります。

そこで、frameCount++ のかわりに frameCount += getRelativeParam60FPS() とすると
Update 1回につきかかった時間が 1/60 秒でなかった場合にも、確実に1秒間に60加算されるプログラムとすることが可能 となります。

***マウスの位置に対してのマップ上(3D空間上)の座標を求めるためUtil.UnProject2World()を使用しています。このメソッドのprojectionMatrixとviewMatrixは何を指定すれば良いでしょうか? [#d21dfe56]
Util.UnProject2World()は画面上のXY座標を3D空間上の座標時に変換するメソッドです。
現在のカメラの射影行列とビュー行列を渡します。
基本的には mapScene.CurrentPP, mapScene.CurrentVV を指定してください。

***Input.KeyTest()にてKeyStateにTOUCHを指定した場合、StateTypeの指定に関わらず同じ結果になってしまいます。 [#y23a1228]
Input.KeyTest()はゲーム中の入力デバイスの状態を取得するメソッドです。
タッチ動作のシミュレーションが目的のためそのような値を返すように加工しております。
加工なしの値が欲しい場合は、GameStateをWALKではなくSYSTEMを指定してください。

***プレイヤーのジャンプ中の位置を変更する方法(ジャンプ操作はできつつX,Z座標を変更する方法)はありますか? [#k7ef25d5]
setPositiionを使うとはvelocityのリセットがかかってしまうため、その代わりに補正したい座標との差分を取って、 MapCharacter.Move メソッドで座標を移動してください。

***カメラツールのフレームのプロパティ「光源設定>DOF焦点係数」の値を変更することはできますか? [#p7ee2bf6]
C#スクリプトから変更の場合、以下になります。
 カメラ
  mapScene.CameraManager.ntpCamera
 キーフレーム
  getKeyFrame()
 DOF
  Yukar.Common.Rom.Camera.KeyFrame.dof
  X=焦点係数, Y=焦点範囲係数, Z=ぼかし半径

C#スクリプトで値を変更した場合、カメラツールで設定している値を書き換えてしまいますのでご使用にはその点をご注意ください。

***セーブデータの保存スロットの番号(0-)の取得方法を教えてください。 [#ta2a6897]
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に変更してください。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS