[Unity] 汎用スクリプトを作ってみたら…


汎用スクリプト?

UnityではC#なんかを利用しますが、シナリオをそのままC#で作成すしないで、別のスクリプトを利用したりします。

有名なところでは…

Lua とかですね。

そういうのを昔に作っていたので…

いろいろと拡張して、Unity向けにカスタマイズしたものを作ってみました(まだまだ作りかけ)。

Githubに入ってます

Unityにも使える、汎用スクリプト言語のサンプルです。

どんな特徴?

C# 2.0 で作られている

ので、すんなり動くと思います。
基礎になるコードはDLLにしてあります。

クラスを継承して、拡張することができる

ので、いろいろとカスタマイズすることができます。

カスタマイズすると…

スクリプト側から C# のデータや関数を呼び出すことが簡単にできます。

例えば…

Time.deltaTimeの値を、スクリプト側からも変数のように取得することができます。
Random.Range()も、簡単に呼び出すことができます。

ということで…

スクリプト側からも、C#側からも、変数や関数をお互いに呼び出したり共有が簡単にできるという特徴があります。

コードの記述法は…

基本的にC言語っぽくしてあります。
少しC#よりになってたりもします。
記述用のメモがありますので、興味のある方はこちらへ
スクリプトのファイル拡張子は任意になので、Unityに勘違いされなければなんでもオッケーです。

コンパイル

する必要がありますが、実行中でもコンパイルさせることはできるので、データはテキストでもつこともできます。


KindleのUnity本一覧

というわけでサンプル

"Assets/Scenes/SampleScene.unity" のシーンを実行すると Consoleに、スクリプトから文字列を出力する命令が実行されます。DeltaTimeも出力されますよ。
Buttonを押すと、スクリプトを利用してCubeが移動します。


コードの簡単な説明

スクリプトをコンパイルする

指定したフォルダーにあるスクリプトを一括でリソースデータにします。
詳しくは、AutoCreate()の中身へ。
Loader.AutoCreate<CustomCompiler, CustomCpu>("CK", false);

スクリプトの本体

CustomCpu Machine { get; set; }

スクリプトの読み込み

Machine = Loader.LoadFromResource<CustomCpu>("test");

スクリプトの実行(main関数を実行する)

Machine.Run();

スクリプトの状況をリセットする

Machine.Initialize();

スクリプト内の関数を指定して実行する

このスクリプトは、yieldで一時停止して処理をC#に返すのですが、それをコルーチンで簡単に操作できるようにしてあります。
引数は、カスタマイズをしてUnityのVector3を利用できるようにしてあります。
Machine.FunctionCall(ArgVariable.CreateFunctionName("Vector3", "Move", "Vector3", "Vector3", "float"),
    CustomArgVariable.Create(new Vector3(0.0f, 0.0f, 0.0f)),
    CustomArgVariable.Create(new Vector3(10.0f, 1.0f, 1.0f)),
    CustomArgVariable.Create(1.0f));
StartCoroutine(Machine.Routin((cpu) => PreAction(cpu), (cpu) => Move(cpu, target), (cpu) => Move(cpu, target)));

全コードはこちら

Githubにありますよ

スクリプトのコード

見ての通り、C言語風の記述になります。
#include "../UnityHelper.ckh" #include "../GameCoreHelper.ckh" void main() { Print("main start"); Print(DeltaTime); Print("main end"); } Vector3 Move(Vector3 from, Vector3 to, float time) { Vector3 result = from; float rate = 1.0f / time; float currentValue = 0.0f; while(currentValue < 1.0f) { yield result; float tempValue = 0.0f; result = from + (to - from) * currentValue; Print(currentValue); currentValue += rate * DeltaTime; } return to; }



こういったものですが・・・

マニュアル関係はなにも作っていないので、利用するのは難しいかもしれませんが、こういうのを作ってみましたよというお話でした。


0 件のコメント :

コメントを投稿