こんにちは、開発担当の杉原です。
最近少し(自分は)仕事が落ち着いてきたので、ちょっとしたお遊びモデルを作成してみました。
先月の自由研究で作ったピッチングマシンにも適用できそうなので、記事のネタがなくなったらまた後日紹介できたらなぁと思っています。
というわけで、今回は予定通り共通変数についてご説明させていただきます。
前回の検証結果より、JScriptとC#では関数の外側に定義したグローバルな変数の扱いが異なっていることがわかりました。
そしてC#ではその変数は、同じScriptを参照するVisual同士で共有されず、それぞれ独立したものとなっています。
複数のVisualで共有の変数が必要になる例がちょっと浮かばないのですが、もしC#でスクリプトを開発していた時にこれが必要になったとします。
このときどうすればいいのか。前回作成したC#プログラムに追記して、以下のようなものを作成してみました。
// C#向けの内容なのでここは省略 // C#タブを選択してください。
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using Demo3D.Native; using Demo3D.Visuals; [Auto] public class Sphere_CS : NativeObject { [Auto] SimplePropertyValue PropCount; int GrobalCount = 0; static int StaticCount = 0; public Sphere_CS(Visual sender) : base(sender) {} [Auto] void OnReset(Visual sender) { PropCount.Value = PropCount.Value + 1; GrobalCount = GrobalCount + 1; StaticCount = StaticCount + 1; print("[" + sender.Name + "][PropCount][" + PropCount.Value + "]"); print("[" + sender.Name + "][GrobalCount][" + GrobalCount + "]"); print("[" + sender.Name + "][StaticCount][" + StaticCount + "]"); } }
変更点として、まずグローバル変数として「StaticCount」が追加されていること。そして、それを加算し、ログ出力しています。
細かい説明は後にして、まずは実行してみましょう。
結果、StaticCountは順次値が加算されており、各Visualで共有されていることがわかります。
GrobalCountと異なり、なぜこのようになるのか。ポイントは変数定義の先頭にある「static」です。
別にDemo3Dに関係なくC#という言語の仕様なのですが、グローバル変数や関数の宣言時に「static」というキーワードが付与されると、それは「静的」なものになります。
通常の変数の場合そのクラスから生成されたインスタンスごとに変数の値が異なる(=動的である)の対し、静的な変数の場合はクラスとして変数を持っていてインスタンスによらず同じ値を見る(=静的である)ようになっています。
そのため、同じ Sphere_CSクラスで共通した値となるわけです。
これでVisual間で共通な変数をJScriptでもC#でも利用できるようになるわけです。
しかしながら、JScriptのグローバル変数にせよ、先ほど紹介したC#のstatic変数にしても、同じスクリプトを使用するVisualからしか参照できないという制約があります。
もしほかのスクリプトを利用するVisualからも同じ変数を利用したいというのであれば、またひと工夫必要になってきます。
ただ、これについては次回ということで。
次回の【How to Demo3D Scripting】は「publicとUserVars」をお送りします。
更新は9/27(木)です。お楽しみに。
コメントをお書きください