IronPythonによる柔軟なゲーム開発
自己紹介
IronPythonって?
●.Net FrameworkおよびMono上で動作するPython
●.NetFramework、Monoは共通中間言語(CIL)のた
めの仮想マシン。
●CILが動く仮想マシンの仕様は共通言語基盤(CLI)
と呼ばれている。
●CILを利用できる言語としてはC#、C++/CLIなどが上
げられる。
発音は あいあんぱいそん
Jim Huguin
●CLIの設計は動的言語との相性が悪い、を主張す
るために
Pythonを試しに移植。
●その結果、不幸にもよく動くものが出来てしまった。
●CPython2.4より.Net2.0Β上でのIronPythonの
ほうが
1.8倍高速
●それにより開発の継続を決定
バージョン
●現在最新バージョンは
2.0.1(2009/02/13)
●1.xと2.xはかなり違う。
●日本の
Wikipediaの情報は遥かに古い。
●国内の資料も大半が
1.x
●今回の解説は
2.xなのでご安心を。
●ただ、今回は
C#からの呼び出しのみ。
インストール
●公式サイト
から
IronPython-2.0.1-Bin.zipをDL
●IronPython.dll、
IronPython.Modules.dll
Microsoft.Scripting.Core.dll
Microsoft.Scripting.dll
Microsoft.Scripting.ExtensionAttribute.dll
を参照に追加
簡易な
Classの説明 その1
●Microsoft.Scripting.Hosting.ScriptEngine
–動的言語ランタイム
–動的言語を
.net frameworkで実装するためのエンジン
●Microsoft.Scripting.Hosting.ScriptSource
–コンパイルされていないソースコードクラス
●Microsoft.Scripting.Hosting.CompiledCode
–コンパイルされたソースコードクラス
Hello World! その1
●
test1.py
●
print "Hello World!"
Hello World! その2
using System;
using Microsoft.Scripting.Hosting; class Test
{
public static void Main() {
// Pythonを実行できるエンジンの生成
ScriptEngine engine = IronPython.Hosting.Python.CreateEngine(); // テキストファイルからソースコードクラスを生成
ScriptSource source = engine.CreateScriptSourceFromFile("test1.py"); // ソースコードをコンパイル
CompiledCode compiled = source.Compile(); // コンパイルした結果を実行
compiled.Execute(); }
Hello World! その3
●
結果
●
Hello World!
簡易な
Classの説明 その2
●
Microsoft.Scripting.Hosting.ScriptScope
IronPythonでC#クラスの利用 その1
利用されるクラス
class SampleFunction {
static public string SampleString1 = string.Empty;
static public string CombineString(string string1, string string2) {
return string1 + string2; }
}
IronPythonでC#クラスの利用 その2
public static void Main() {
// Pythonを実行できるエンジンの生成
ScriptEngine engine = IronPython.Hosting.Python.CreateEngine(); // テキストファイルからソースコードクラスを生成
ScriptSource source = engine.CreateScriptSourceFromFile("test2.py"); // ソースコードをコンパイル
CompiledCode compiled = source.Compile(); // スコープの生成
ScriptScope scope = engine.CreateScope();
// スコープに 名前を SF として SampleFunctionのインスタンスを格納 scope.SetVariable("SF", new SampleFunction());
// コンパイルした結果を実行 compiled.Execute(scope); // 結果を表示
IronPythonでC#クラスの利用 その3
●test2.py
●SF.SampleString1 = "Hello "
●result = SF.CombineString("World", "!")
●SampleFunction.SampleString1 = “Hello ”
●result = Wrold!
●となり
Hello World! と表示されるはず。
IronPythonでC#クラスの利用 その4
●結果は「
Hello World!」
●IronPython は 戻り値を返せない。
●ただし
resultはscopeに残る。
●IronRubyでは
●object re = compiled.Execute(scope);
などとして戻り値を返せる。
●ただし
resultはscopeに残らない。
IronPythonでC#クラスを継承 その1
●
今回、継承するクラス
●
ネストしたクラスでは不可能な模様
namespace Sample {
abstract public class Abstract {
public abstract void Func(); }
IronPythonでC#クラスを継承 その2
ScriptEngine engine = IronPython.Hosting.Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("test3.py"); CompiledCode compiled = source.Compile();
ScriptScope scope = engine.CreateScope(); compiled.Execute(scope); // Inheを取得 object inheType; inheType = scope.GetVariable("Inhe"); // Inhe を Abstract として インスタンスを作成 Sample.Abstract inhe = IronPython.Runtime.Operations.PythonCalls.Call(inheType) as Sample.Abstract; // Inheを実行 inhe.Func();
IronPythonでC#クラスを継承 その3
●test3.py
●AddReference Sample3(.exe)を参照先に追加
●どちらでもお好きなほうをどうぞ。
import clr clr.AddReference('Sample3') from Sample import Abstract class Inhe(Abstract): def Func(self): import clr clr.AddReference('Sample3') import Sample.Abstract class Inhe(Sample.Abstract): def Func(self):IronPythonでC#クラスを継承 その4
●結果、「
Hello World!」が表示されました。
●問題なく継承されています。
–import clr
–clr.AddReference('Sample3')
–の代わりに
–engine.Runtime.LoadAssembly(typeof(Sample.Abstract).
Assembly);
–と
C#側で参照を追加しても問題ありません。
他のスクリプト言語に対するメリット
●関数のラッパーや追加のコードを一切書く必要なし
●1行書くだけでクラスのメソッド全てが使用可能
●プラグインを入れれば
VisualStudioでブレークポイ
ントを入れることも可能らしい
●.NETの資産のほとんどを利用可能
他のスクリプト言語に対するデメリット
●
Lua、Squirrelなどに対して遅い。
●
何でも
.NETの関数なら実行できてしまう。
●