【第0章】基本操作
第5回 スクリプトの書式解説
VRMNXのPythonスクリプトはvrmapiによるVRMNX専用命令と一般的なPython構文から成ります。今回はちょっと難しい言葉が続きますので、最初は軽く聞き流してください。但し赤文字の所だけは注意しましょう。
「親子で学ぼう用レイアウト(2初期状態).vrmnx」を開き、[レイアウターツール]-[レイアウト]-[スクリプト]-[レイアウトスクリプトエディター]を実行しましょう。
これで少し解説すると
#LAYOUT #レイアウトであることの表示
import vrmapi #vrmapi読み込み
def vrmevent(obj,ev,param): #イベントの関数定義
if ev == 'init': #ビューワー起動時に
vrmapi.LAYOUT().SetView(10) #ID10のカメラで表示する
elif ev == 'broadcast': #ブロードキャスト命令が来たら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'timer': #SetEventTimer命令が来たら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'time': #SetEventTime命令が来たら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'after': #SetEventAfter命令が来たら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'frame': #フレームごとに動作させるなら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'keydown': #SetEventKeyDown命令が来たら
dummy = 1 #ここに書く(今はダミー)
VRMNXのPythonスクリプトはイベントハンドラという割り込み制御として成り立っています。通常のプログラミングではスタートして何らかの結果を出し終了しますが、VRMNXのPythonスクリプトはそうではありません。ビューワー起動後にずっと何かが起こるのを待っていて、何かが起こったらそれに反応して書き込んだスクリプトを実行します。その点が入門書などのプログラミングとは違っていますが、このイベントハンドラという考え方は一般的な考え方でもあるのでご安心ください。この連載では、vrmapiによるVRMNX専用命令と一般的なPython構文の両方を説明していきます。
1行目の#LAYOUT ですが、#以降はコメントとなり動作に影響しなくなります。説明を書く時や消去せず一時的に使用を止める時に使いましょう。
2行目のimport vrmapi は、Pythonの命令importを使いVRMNX専用拡張機能となるvrmapiモジュールを読み込んでいます。ですのでこの一文より前にVRMNX専用命令を書いてしまうとエラーで強制終了してしまいます。覚えておいてください。
3行目のdef vrmevent(obj,ev,param): はPythonの命令defを使いvrmevent(obj,ev,param)という関数を定義しているところです。カッコ内の文字は引数(ひきすう)といい、特定の値を入れるための目印になります。この場合objは自分を示すインスタンス、evはイベントのコード、paramはイベントの辞書型パラメータを示しています。今は何の事か解らないと思いますがいずれ説明します。またdefやifなどの構文のあとには「:」コロンが付きます。忘れやすいですし「;」セミコロンと間違いやすいので注意しましょう。
4行目では段落が変わっていますのでここからがvrmevent(obj,ev,param)の中身になります。if ev == 'init':とは、もしイベントのコードの「initialize(イニシャライズ:初期化)」が起こったら、つまりビューワー起動時に以下のことを1回だけ実行するよという意味になり、これまた段落が変わった5行目を実行します。また==とイコールが2つ書かれていますが、これが算数の=と同じ等しいという意味になります。プログラミングの世界では=のイコール1つは代入を意味します。算数だとa=a+1はおかしいとなりますが、プログラミングの世界では「右側の変数aの値に1を足してを左側の変数aに入れる」となりますので正しいのです。変数とは数値などを入れる入れ物です。
5行目は私が書き込んだビューワー起動時に指定カメラで表示を行いなさいという命令です。デフォルトでは他の行と同じくdummy = 1(何もしないの意:これはVRMNX特有)が書かれます。
以降は各イベントとそれに対応する表記が続きますので省略します。なおelifとはifと組み合わせて「もしそうではなくこうなら」という意味で使います。「if~elif~else」となっていくのですがelseは一番最後に来て「最終的にそうでなければ」となりますがここでは省略されています。
説明だらけで難しかったですね(^_^;) この説明が一発で理解できるようなら今回の連載は読まずともプログラミングは出来ることでしょう。これから少しずつ進めていきますので今回の説明がよく解らなくても焦らないでください。そのうち解るようになることでしょう。
さて先程の書式はレイアウトの書式ですが、こちらは車両の書式です。
#CARID=1 #車両のID1番であることの表示
import vrmapi #vrmapi読み込み
def vrmcarevent_1(obj,ev,param): #イベントの関数定義
if ev == 'init': #ビューワー起動時に
dummy = 1 #ここに書く(今はダミー)
elif ev == 'broadcast': #ブロードキャスト命令が来たら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'dooropen': #ドアを開いたら
dummy = 1 #ここに書く(今はダミー)
elif ev == 'doorclose': #ドアを閉じたら
dummy = 1 #ここに書く(今はダミー)
オブジェクトによって書式は変わっており、編成「TRAIN_11」だと
#OBJID=11
import vrmapi
def vrmevent_11(obj,ev,param):
if ev == 'init':
dummy = 1
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'couple':
dummy = 1
elif ev == 'split':
dummy = 1
elif ev == 'start':
dummy = 1
elif ev == 'stop':
dummy = 1
elif ev == 'autospeed':
dummy = 1
elif ev == 'delete':
dummy = 1
elif ev == 'create':
dummy = 1
elif ev == 'homekey':
dummy = 1
elif ev == 'endkey':
dummy = 1
elif ev == 'insertkey':
dummy = 1
elif ev == 'spacekey':
dummy = 1
elif ev == 'active':
dummy = 1
elif ev == 'view':
dummy = 1
elif ev == 'keydown':
dummy = 1
こんなにたくさんのイベントがあります。大変なので説明は省略しました(^_^;)
なおVRMNXのPythonスクリプトの詳細を知りたい時は、公式の「VRM-NX SCRIPT MANUAL」にアクセスしましょう。そこでの説明が解りづらいからこの連載があるのですが(^_^;)
←戻る 目次 進む→