非同期にUnityAPIを操作する
About
一般に、UnityAPIはメインスレッド以外から操作することができないようです(Proはできる?)。しかしながら昨今のゲームは高い処理コストのためにスレッドを分割することも珍しくないでしょう。またネットワークを利用した多くのゲームで非同期の操作が行われることでしょう。この問題を解決するアセットが公開されていたので、その利用方法を少しだけまとめておきます。
HowTo
SpicyPixel-ConcurrencyKit
"SpicyPixel"が公開する、ConcurrencyKitを利用することで、非同期な操作を行うスレッドからもUnityAPIが操作できるようになります。私の場合は、非同期にPrefabのインスタンスを増やしたかったのでこれを利用しました。そこでここであつかう内容もインスタンスを増やす操作を例にします。その他の利用方法、サンプルについては公式を参照してください。
Sample
まず非同期操作をあつかうクラスはConcurrentBehaviourを継承する必要があります。C#は単一継承なので、標準で継承されているMonoBehaviourは利用できなくなる点に注意してください。
次いで、異なるスレッドから対象となるUnityAPIを操作するためのメソッドを実装します。ここではAddNewInstanceとしました。
最後に、実装したメソッドを非同期な操作(別スレッド)から呼び出す場合には、"taskFactory.StartNew(()=>メソッド名)"とします。
public class TestClass : ConcurrentBehaviour { //呼び出し taskFactory.StartNew(()=>AddNewPrefab()) … //呼び出す対象(別スレッドからUnityAPIを操作するためのメソッド) void AddNewPrefab() { GameObject newPrefab = GameObject.Instantiate(prefab); } }
たったこれだけの実装で実現できるため、非常に扱いやすいアセットです。
ライセンスに関して言及されているドキュメントを発見することができなかったのですが、PublicDomainで良いのでしょうか(2013.03.20現在)。