2017年3月20日月曜日

MachineCraft備忘録:接合パーツの自由化と固定化

学校を卒業して学士を取得したことを確認して、ホッと一息をついていた。
接合パーツの自由化と固定化についてメモをしていなかったため、これについて
投稿する。Twitterで教えてくれた方に感謝だ。

例えば、自動車の駆動形式をFRやFFにしたり、牽引式のトレーラートラックや
電車などの関節部を実装するためには、自由に動く接合パーツがほしくなる。

しかし、接合パーツの自由化のためにSETUPを無設定にすると、パーツが
固定化されて動かなってしまい、自由化どころか動かなくなってしまう。
でも大丈夫。ちゃんと設定方法は用意してある。

必要なステップは二つ。

  1. SETUP画面にて、接合パーツにNEUTRALを設定
  2. パラメータを左一杯まで動かして、左矢印をクリック
スクリプトいらず、超シンプルである。
以下にRotatorSを例に、写真付きで説明する。

1SETUP画面接合パーツにNEUTRALを設定


2. パラメータを左一杯まで動かして、左矢印をクリック


NEUTRALの下のゲージに注目。
-100からFREE変わったはずだ。

今回はRotatorSで試してみたが、RotatorAや,Hinge(S,A),Piston(S,A)
でも可能である。

Wikiあたりでも解説はされているハズだが、マニュアル無しでマシクラを
始めた人の参考として、本トピックを掲載した。

因みに例として使ったモデルはコレである。私が初めて装飾パーツで造形を作った
LMPカーもどきである。


2017年3月16日木曜日

MachineCraftスクリプト機能(C#)の基本(総まとめ):スピードキープ車を作ろう

今までのトピックの総まとめとして、ある一定スピードを維持する車を作る。

要求としては、以下の通りとする。
・Carモデルを使用
・100[km/h]前後で速度を維持する
・キーボード入力から自動車を走行させる。

3番目の要求が前回トピックの「キー入力はスクリプトから受け付けない~」
に抵触するような気がするが、方法はある。
StartActionの「(キー割り当ては必須ではない)」というルールを使ってスクリプト
専用のブレーキアクションを作ってしまえばいい。

前回CarモデルのコピーのASSIGN画面を開いてアクション"Brake"を登録する。

これをそれぞれのWheelにつながっている4つのRotatorSに登録する。
Brakeアクションのパラメータは0(RotatorSを停止)にする。


あとはスクリプトだが、ここで重要なのがマシクラ基本(その4)で述べた
スクリプト中で使われる関数の出力はゲームにて表示されるパラメータ
と一致するとは限らない」という点。
計器上の値がそのまま使えないのだから、計器上の100[km/h]のときの
スクリプト上のスピードをPrintやLogで確認すればいい。
(勿論、100[km/h]×(スクリプト上の速度[-]/計器上の速度[km/h])で導いてもよい)

筆者の環境(Ver. 232a)では、スクリプト上のスピードは27だった。
以下にスピードキープ車のスクリプトを乗せる。

スクリプト上のUserNameは必ず自分のものに変えておくこと。


TESTで動かすと、こんな結果が得られるハズ。
こんな感じで、100[km/h]を超えるとBrakeアクションが発生し、RotatorS
チョコチョコと停止していることが確認できる。
ちなみにノーマルCarのトップスピードは190[km/h]である。

ただ注意してもらいたいのは、スクリプトが実行される周期はゲーム中のfps
に依存する。また、スクリプトの実行速度の都合上、ユーザ入力に根負けしてしまう
ことがある。

例えば上記プログラムのif条件文を"absVel>5"にしても、トップスピードはある
一定速度以下まで下がらないハズだ。

以上がMachineCraftスクリプト機能(C#)の基本である。
このプログラムが理解できれば、想像力次第でマシンが幾つもつくれるハズだ。

読者の参考になれば幸いである。

MachineCraftスクリプト機能(C#)の基本(その5):スクリプトからモデルを動かす

前回トピックでは、モデルに関する情報をスクリプト上から取得した。
今回は、得られた値からモデルを動かしてみたい。

モデルを動かすにあたって、覚えておかなければいけない関数は以下の二つである。
これらもLua解説テキストから確認できる内容である。
StartAction関数は、ASSIGNで指定した(name)アクションをduration[f]だけ実行する。
durationが-1であれば、そのアクションはソフトウェアのクラッシュや後述の
EnsAction関数などの例外を除いて実行され続ける。

EndAction関数は、StartAction関数で動いているアクションを無条件で停止させる。
この関数の説明は上述のコードの通りなため割愛するが、筆者の確認だと
キー入力されているアクションはどうやら停止できていないらしい。もし違う場合
はコメント欄やTwitterで教えてもらえるとありがたい。

確認として、StartAction関数でモデルを永遠に前進させてみようと思う。
ただし、今回は単純化のために_sampleのCarをモデルとして扱いたい。
元ファイルに手を付けたくないため、Copyをお願いしたい。


Buildをクリックして、Build画面へと遷移し、TABキー→ASSIGNでアクションの名前
を確認したい。TABキー→SETUPWheelにつながっているRotatorSで確認してもらって
もかまわない。

前者の方法であれば、こんな画面が出てくる。


"MoveF"というアクションを覚えてもらいたい。
これをStartAction関数の引数に指定する。

以上のスクリプトをCarモデルのコピーに適用して動かすと、
下の動画のような面白い状況になるかもしれない。
"MoveF"がずっと実行されている。結果としてEnemyに衝突した。

次はコメントアウトを消してEndAction関数を有効にしてみる。
結果の写真や動画は上げないが、全く動かないハズだ。

OnStart関数が実行された後にOnUpdate関数が走っているので、
StartAction関数が実行された直後にEndAction関数が実行される。
それ故に、アクション発生した直後にキャンセルされ、結果として
モデルが動かない。

一方で、Wキーを押してユーザから直接"MoveF"アクションを実行
してみると、普通に前進するハズだ。このことから、スクリプト外
のアクションに対してEndAction関数は動かないことが確認できる。

以上が、スクリプトからモデルを動かす方法である。
前回のトピックの内容を踏まえれば、いろいろな動きを作れると思う。

次回は、今までの"MachineCraftスクリプト機能(C#)の基本"
トピックの総まとめとして、速度をキープするCarを作ってみたい。

パラメータに応じてモデルを動かすということができれば、マシンクラフトの
スクリプトの書き方は一応理解できるハズ。

2017年3月14日火曜日

MachineCraftスクリプト機能(C#)の基本(その4):モデルの情報を得る

前回トピックでは、AutoPilotの立ち位置について述べた。
今回では、AutoPilotでモデルの情報を確認してみようと思う。

今回のモデルの情報というのは、モデルに含まれたCoreブロックから見た位置,
速度,傾き,方角などの空間的な情報のことを示す。実際に得られるデータは
これだけではないが、基本ということでこの4つに絞りたい。
興味があれば、_scriptフォルダのLua解説テキストあたりを参考に
調べてみるとよい。

モデルの位置や速度,傾き,方角は次の関数から得られる。参照元は
Lua解説テキストの60行目あたり。ほぼLua解説テキストからの抜粋である。


前回(その2)と同じ要領でC#スクリプトを組み、モデルに適用する。

速度に関しては、x,y,z方向への速度から絶対速度を求めただけである。
実をいうと、GetSpeed関数もあるが、今回はUnity3D謹製のクラスおよび
関数が使えることも示したかったため、あえてGetVelocity関数を使っている。

結果としてはこんな感じになる。






ここで勘のいい人であればあることに気づく。
右下のメータと速度が一致していない。わざとらしく単位を付けて申し訳ない。

ここで大事なことは、スクリプト中で使われる関数の出力はゲームにて表示される
パラメータと一致するとは限らないということだ。筆者はまだ確認できていないが、
位置もなんとなく違う気がする。

以上のことから、今後パラメータを使ってモデルの動きを変えていく際には、
Print関数やLog関数を活用して頂けると筆者は幸いである。

次回は、モデルを動かす事に関するトピックを述べていきたい。

2017年3月13日月曜日

MachineCraftスクリプト機能(C#)の基本(その3):AutoPilotについて

前回(http://henjin0antiforget.blogspot.jp/2017/03/machinecraftc.html)トピック
では、プログラムをモデルに組み込むフローについて述べた。
今回は、予定通りapオブジェクト(AutoPilotクラス)について述べていく。

ただし、今回話すトピックはクラスやオブジェクトなどについての説明ではない。
C#の文法を知るのであれば、SYODA Tuyano氏のこのサイトなどを参考にして
もらいたい。Unity 3Dに関するトピックもあるため、参考になると思う。

[初心者のためのC#プログラミング]

"http://libro.tuyano.com/index2?id=1204003"

前回のプログラムには
といったように、OnStart関数とOnUpdate関数への引数となっていた。
このapオブジェクトを使うことで、前回の文字列表示ができた。

このapオブジェクトの設計図にあたるAutoPilotクラスには、前回トピックの
Log関数やPrint関数が定義されており、MachineCraft本体との情報の
やり取りを簡便化させる役割を担っている。

ただ、AutoPilotクラスを使う上では、MachineCraft上のパラメータが必要になる。
それ故に、継承元(UserScript)で決め打ちになっているOnStart関数とOnUpdate関数
で初期化が逐次行われているのだと筆者は考える。
初期化に必要なパラメータが分からなくてもいいのは、正直ありがたい。

AutoPilotクラスで定義されている関数は、_scriptフォルダの"Luaスクリプト解説.txt"
と"C#スクリプト解説.txt"に書いてある。重要なのが、書いているプログラムが
C#スクリプトでも"Luaスクリプト解説.txt"の関数群が全て使えるということ。
ただし、関数を使うときにはC#の文法に則ってap.func()にする。

以上がapオブジェクト(AutoPilotクラス)についての説明だ。
次回は、モデルの状況をスクリプトへ反映させてみようと思う。

それにしても、継承元のUserScriptクラスはどこにあるんだろう?
ブラックボックス化されるべきスクリプトだというのは承知だけれども...

2017年3月12日日曜日

MachineCraftスクリプト機能(C#)の基本(その2):スクリプトを動かす

前回のトピックでは、スクリプトのリファレンスを記したテキストファイルが
どこにあるかを示した。今回は、スクリプトの用意の仕方について述べていく。
(本件で用いるスクリプト言語はC#とする。)

C#スクリプトをモデルに適用するまでの手順を大きく分けると、以下の3
ステップである。ステップごとに順を追って説明する。
  1. モデルを作成
  2. _scriptフォルダにスクリプトを用意
  3. 1. で用意したモデルにスクリプトを適用

1. モデルを作成

今回はSampleモデルであるBasic1を用いて説明する。
Load→_samples→Basic1を選択し、Copyをクリックして頂ければOK。

名前は、Basic1_testとした。名前欄をクリックすれば編集できるようになるハズ。

2. _scriptフォルダにスクリプトを用意

モデルを用意したところで、少しゲーム画面から離れていただきたい。
フルスクリーンでゲームしている方がいたら、OPTION→VIDEO→FullScreen
の順でクリックしてもらいたい。作業が楽になると思う。

準備ができたら、前回トピックでも述べた_scriptフォルダを開いてもらいたい。
おそらく、
"Steam\steamapps\common\MachineCraft\UserData\_scripts"
にあると思う。MachineCraftのインストール場所を変えている人は、MachineCraft
フォルダの傘下を参照してもらいたい。

次に、そのフォルダにある"Empty.cs"ファイルを探してほしい。見つけたら、
そのファイルを同フォルダにコピー&ペーストして、ファイル名は"test.cs"
にしてもらいたい。

以上の作業が終わったら、お待ちかねのスクリプト作成に入る。好きなテキスト
エディタで"ShowString.cs"ファイルを開いてほしい。なお、私はSublimeText
をプログラム作成に使っているが、初心者であればTerapadなどのシンプルな
エディタを使うとよい。

こんなプログラムがすでに用意されているはずだ。

このプログラムは、"開始処理(OnStart関数)"と"更新処理(OnUpdate関数)"において
ゲームのフレーム数を表示するといったもの。今回は"ap.Log~"と"ap.Print~"を
それぞれ削除してもらいたい。

MachineCraftにおいて、プログラムの流れの筋は"OnStart関数"と"OnUpdate関数"
に記述していく。開いたプログラムに書いてある通り、OnStart関数はモデルが
ワールドに入った瞬間のみで実行される関数で、OnUpdate関数はフレーム毎に
何度も実行される関数である。
Arduinoで何かプログラムを書いた人であれば、"setup関数"と
"Update関数"とほぼ同じ立ち位置であると説明したほうが早いかもしれない。

なお今回のプログラム作成は、理解することよりも「とりあえず動かす」ことを
優先したいため、プログラムの意味しているところは適宜省略していく。

今回は、以下に示すプログラムを書いてもらいたい。現段階ではすべておまじないで
良い。ただし注意してもらいたいのは、GetUserName関数の"UserName"を自分
のものに変えておかないといけない。これはゲーム上で他ユーザなどに不正な行為
をさせないための予防措置と、作者は述べている。

つまり、タイトル画面の上部にある自分にユーザ名に差し替えればよい。
私の名前がhenjin0であるため、決してhenjin0と書かないでくださいな。





プログラムを用意できたら、ファイルを保存してもらいたい。
ここで重要なのが、保存時の文字コードだ。必ずUTF-8にすること

3. 1.で用意したモデルにスクリプトを適用

本節では、2節で用意したプログラムを1節のモデルに適用する作業を述べる。

MachineCraftのタイトル画面でBuildをクリックしてBuild画面に遷移してほしい。
画面遷移が終わったら、TABキーを押して、ADVANCEDをクリックしてほしい。
そこでテキストボックスがでてくるから、そこにファイル名(拡張子除く)を
入力してほしい。今回であれば、"test"とだけ入力すればいい。


以上の作業が完了したら、TESTをクリックする。
こんな画面が出てきたら、プログラムの動作は正常だ。




緑文字がap.Log関数、白文字がap.Print関数で記述した内容である。
緑文字の方は、開始直後に表示されて、すぐに消えてしまったハズだ。

ap.Log関数もap.Print関数も、どちらも文字列を表示する関数だが、
表示位置のほかにも表示される寿命が違う。試しにOnStart関数の中に
"ap.Print(3,"OnStart");"と記述すれば、文字列は残り続ける。

こう見ると、ap.Printのみを使っていけば良いようなイメージを持つ
かもしれないが、ap.Print関数は、0~9行しか書けない。それも、勝手に
改行してくれるわけではなく"ap.Print(n,"hogehoge");"とあらかじめに
プログラムで用意しなくてはならない。

そのため、文字列の表示に関しては以上の長短を考えて使ったほうがよさそうだ。

話が脱線してしまったが、プログラムを作るフローとしては以上である。
ちなみに、プログラムがモデルに組み込まれるタイミングはワールドに
出た直後なため、プログラムが用意できたら

TEST→EXIT→プログラム編集→TEST→EXIT→プログラム編集→...

と繰り返しながらデバッグしていけばよい。
次回はapオブジェクト(AutoPilotクラス)について述べていく。

MachineCraftスクリプト機能の基本(その1):スクリプトを書く前に

前回の投稿からのつづき
MachineCraftがとにかく自由度の高いゲームだというのは、前回の記事で
ある程度把握して頂いたと思う。

今回のトピックは、MachineCraftの機能の一つであるスクリプト機能だ。

この機能は読んで字の如くスクリプトが書ける機能なのだが、これによって
マシンの動きをより一層面白くすることができる。

ただし、現段階においてこの機能は「Advanced」な機能で、ドキュメントも
あまり多くない。少なくとも手軽とは言い難いなーと。
Build→ADVANCED→ScriptNameで書いたプログラム(プログラムの格納している
フォルダ)を指定する。現段階では隠し機能みたいな気構えで良いのだろうか?


スクリプトを書いていくうえで、関門になるのがリファレンスの場所である。
関数などのリファレンスは普通であれば本家サイトか何かからリンクできるように
なっているが、Web上で探してもそれっぽいものはなかなか見当たらない。
どこにあるのかというと、インストールした先のファイルにあるのだ。
それも、txtファイルでポツンとある。


私(Ver 2.28)の場合は、"Steam\steamapps\common\MachineCraft\UserData\_scripts"
にあった。そこに"C#(Lua)スクリプト解説.txt"という名前の
テキストファイルがあるはずだ。

おそらく、まだベータ版だから公にする必要がない故の対応だと思うので、
批判する気はないが、もしスクリプトをモデルに適用したいと考えているなら
注意して頂けると幸せだ。

追伸:上記のtxtファイルには、Luaのサポートはもう切るとのことだ。注意すべし。



だいたい2.5年ぶりの更新 MachineCraftについて

タイトル通り、2.5年ぶりの更新です。

研究やグループでのシステム開発などで、完全に手がついていなかったと
言い訳したいけど、正直な話、備忘録を忘れていたというのが現状です。
ごめんなさい。

今回のトピックは以上の謝罪で終わり...ではなく、最近個人的にHotになっている
"MachineCraft"のスクリプト(C#)についても述べていきたい。

MachineCraftというのは、キューブ状のブロックを組み合わせてオレオレな
車、ミリタリーな戦車、キュートなキャラクターなどを作って、みんなでワイワイ
楽しむゲーム。キューブ上のブロックとは言ったけど、実際には直方体や
歪んだ四角錐などもつくることができて、とにかく自由度がパない。

Steamでフリー版が公開されているから、MineCraftなどのクラフトゲ―が
好きな人はぜひともプレイしてほしい。

[WikiのURL]
http://seesaawiki.jp/machinecraft/d/%A5%B2%A1%BC%A5%E0%B3%B5%CD%D7

実際、私も黄金の人生カーを作ったりして楽しんでいる。


次の投稿でモデルに加えられるスクリプトについて話そうと思う。
あと、すっぽかしてごめんなさい。