Page 1 of 1

Playモード中での変更値の適用

Posted: 2017/09/24 13:37
by kj555
こんばんわ。

試用版にてMAC版最新リリースUnity(2017)から試しています。

AIを作成しPlayモード中にステート追加やパラメータの値変更等でチューニングした後プレイを終了させると
リセットされますが、これを覚えさせる方法は何か用意されているのでしょうか?

ステート追加に関してはプレイモード中にインスペクタよりFSMコンポーネントを右クリックしてCopy Componentし、
プレイモード終了後にPaste Component Valuesをすることで何度か上手く行きましたが、ステートが復元されますが
値の変更は復元されませんでした。
又、Paste後に稀にFSMエディタデータが壊れるのか、ノードの表示が一切無くなり、Unity再起動等でも復帰しなくなり
FSMを1から作り直す必要がありました。

これは試用版だからでしょうか。
何か正しい手段があればご教示下さい。

Re: Playモード中での変更値の適用

Posted: 2017/09/24 14:11
by caitsithware
Play中での値を復元するにはArborEditorウィンドウ上で、変更したステートやStateBehaviourのコピーを行い、Play終了後に貼り付けしてください。
また、複数ステートを復元(上書き)する機能は現状ありませんので、貼り付け後に遷移の付け直し作業等が必要な場合もありますのでご注意ください。

実装できそうであれば今後のアップデートで復元機能も付けたいと思います。
本対応はそれまでお待ちください。

また、InspectorウィンドウでのCopy Componentにつきましては、Unityの仕様上、StateBehaviourが保持できないため基本的には使用しないようにお願いいたします。

Re: Playモード中での変更値の適用

Posted: 2017/09/25 17:57
by kj555
ありがとうございます。
よくわかりました。

https://www.slideshare.net/Unite2017Tok ... y-75810280
こちらの講演に感銘を受けて試用をしているのですが、パフォーマンスは早いほうが当然良いので、
コード自動生成の部分、スライドP61〜のリフレクションによるメソッド抽出をこちらも実装出来るか試しているのですが
メソッドをリフレクションで取得する部分の方法は分かりますでしょうか?
講演者様独自カスタマイズ部分になりますので、もちろん簡単に分かればという事でお願いいたします。

Code: Select all

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Arbor;
using System.Reflection;
using System.Linq;
using System;

public class StateMaker : StateBehaviour
{
	[SerializeField] public List<StateLink> trantisionList = new List<StateLink> ();
	//	[SerializeField] static MethodInfo[] methods = Type.GetType ().GetMethods (); <- ここが上手く取れない


	public void method1 ()
	{
		
	}

	public void method2 ()
	{

	}
}

Re: Playモード中での変更値の適用

Posted: 2018/02/23 04:12
by caitsithware
Reflectionについては.NETの使用方法なので詳しいところまではサポートできませんが簡単にですが説明いたしますね。

Code: Select all

Type type = typeof(取得したいクラス);
MethodInfo[] methodInfos = type.GetMethods(必要に応じてBindingFlagsなどを指定);
methodInfos[0].Invoke( staticメソッドならnull、そうじゃなければインスタンス , new object[]{ 渡したい引数... } );
みたいな感じです。

Code: Select all

//   [SerializeField] static MethodInfo[] methods = Type.GetType ().GetMethods (); <- ここが上手く取れない
この場合はType.GetType()の引数が空なので定義されてないstaticメソッドということでコンパイルエラーが出ているのではないでしょうか?
Reflection周りのリファレンスを見るのをお勧めいたします。