2017年02月11日

GodotEngine3.0 alpha

もう一ヶ月前のことですが、GodotEngine3.0alphaが公開されていました。
このバージョンから、新しいバックエンドとしてOpenGL ES3.0が追加されたようです。2016年は2D機能のアップデートばかりで3D勢は難民状態でしたが、これでまた少しは楽しくなりそうですね。Watchするのが(使え

実はまだバイナリはビルドしてなくて、Githubでソースコードを読んだだけでなので、中身(エディタ)についてはあまり把握していません。今回はとりあえず、3.0おめでとうございますという感じの更新になります。
中身も追々見ていくつもりですが、先にソースだけ読んで中身を想像してみるのも一興かと思いますので、しばらくはソースを読むだけにします。ビルドの準備はしておきますけどね。

https://github.com/godotengine/godot

今現在はアルファ版がGithubで公開されているだけなので、3.0alphaを試してみたい方は、Githubからソースコードを落としてビルドする必要があります。ちょっと面倒ですけどぜひお試しあれ。ビルドに必要なものや手順などは以下のURLにあります。

http://docs.godotengine.org/en/stable/reference/compiling_for_windows.html

私自身、Godotをビルドするのは久しぶりなので、これを読みながら環境構築をしているところです(OS入れ替えたので)。
意外と面倒くさくてやめたくなってますけどねw
もう2017年なんだしPathくらい一発で通ろうぜSConsさん!

posted by gency at 23:37| Comment(0) | GodotEngine

2015年03月07日

Godotの話 第三回 -KinematicCharacter-

3DのKinematicBodyを使ったキャラクター作成方法を紹介します。
KinematicBodyとは、物理演算処理なしに衝突判定処理を行うことができる剛体です。
扱いやすくいろんなジャンルのゲームで使えます。


今回はGodotEngineでキャラクターに当たり判定を実装する方法と、作成したキャラクターをテストプレイで動かすところまでを紹介しようと思います。

ではまず、モデルのエクスポートの説明をざっくりとですがしていきます。
使用するソフトは「Blender」です。
モデルのフォーマットは、今回はアニメーション付きモデルをエクスポートするのでCollada(.dae)を使います。

エクスポータは、Godot公式サイトで配布されているBetterColladaを使います。
Blenderアドオンの導入方法は、環境によって異なるのでここでは説明できません。
各自で環境にあった導入方法を調べていただけると助かります。



tip1.jpg

エクスポートするのはこちらのモデル。
今回はメッシュとアニメーションを同時にエクスポートします。



tip2.jpg

Blenderのエクスポータの設定例。
6つ並んだボタンは、エクスポートするオブジェクトの種類を指定します。
青くなっているものだけエクスポートします。
今回は「Armature」と「Mesh」だけなので、この二つをチェックします。
複数選択する場合は「Shift+左クリック」です。

その下に並んだチェックボックスで詳細な設定を行います。
アニメーションを書き出すには、「Export Animation」と「All Actions」にチェックを入れます。
書き出すアニメーションを限定したいときは「Skip」をチェックしますが、事前にエクスポートしないアニメーションの名前の最後に「-noexp」と付け足しておく必要があります。

「Copy Images」をチェックすると、Godot側でモデルをインポートしたときにテクスチャが設定済みになっているので非常に便利です、オススメ。



tip3.jpg

Godot側のインポート画面。
ここで必須な作業は「Source Scene」と「Target Path」のパスを通すだけです。
いずれも右側にある「..」をクリックして、ファイルまたはフォルダを選択することでパスの設定が可能です。

オプションはすべてデフォルトで問題ないと思います。
詳細が知りたい方はWikiのここを読んでみるといいかもしれません。
ちなみに私は読んでません(マテ
パスだけ通したら「Import&Open」をクリックしてインポートを開始します。


インポートが完了しシーンが開いたら、エディタの右側にある「Scene」タブにてノードを追加していきます。
まずはキャラクターを動かすために必要な「KinematicBody」ノードを作成します。



tip6.jpg

ここでは既存のノードを別のノードに置き換えるという操作をします。
「Spacial」ノードを選択した状態で、上の画像の赤で囲ったアイコンをクリックします。



tip7.jpg

「Create New Node」ウインドウが開いたら、ノード一覧から「KinematicBody」を探して選択し(Searchを使うとラク)、ダブルクリックまたは下の「Create」ボタンをクリックします。
Spacialのアイコンがニコチャン大王に変わっていたらOKです。
名前が「Spacial」のままだと紛らわしいので「Player」などに変えておくと良いです。


次は当たり判定処理に使われる形状データである「CollisionShape」ノードを追加します。
KinematicBody(Player)を選択した状態で、



tip10.jpg

今度は左側のアイコンをクリックします。新たにノードを追加するときはこちらを使います。
以降ノードを追加するまでの手順はKinematicのときと同じです。

CollisionShapeを追加したら、次はインスペクタで「Shape」を作成します。



tip8.jpg

プリミティブな形状として、Box、Capsule、Plane、Sphereなどが用意されています。
この中でキャラクターに適しているのは「Capsule」ですのでこれを使います。
追加方法はCollisionShapeのインスペクタの「Shape」項目の右側にある「null」をクリックして、表示されたメニューから「New CapsuleShape」を選択するだけです。



tip9.jpg

3Dビューポートにカプセルが表示されたら、赤い点をドラッグしてカプセルの形状をモデルに合わせておきます。
移動、回転の操作は、ビューポートのマニピュレータを使うか、インスペクタで数値を直接入力して行います。


これでKinematicBodyのセッティングは完了です。
続いてカメラを設置します。


KinematicBody(Player)の子ノードに「Spacial」を追加し、名前を「target」に変更します。
次に「target」の子ノードに「Camera」を追加し、名前を「camera」に変更してください。



tip14.jpg

ここでの名前変更は、後々重要になりますので、正確に入力しましょう。
入力が済んだらカメラの位置と角度を調整をします。



tip15.jpg

プレビューを見ながらお好きな位置に調整してください。
画像の配置は間違いです。
カメラはプレイヤーの背後(-Z方向)の少し離れた位置に設置してください。
targetの位置は動かす必要はありません。

以上でカメラのセッティングはおしまい。
次はスクリプティングです。


まずはPlayerノードがスクリプトを実行できるように設定します。
KinematicBody(Player)を選択しインスペクタを表示します。
下の方に「Script」という項目があるので、その右側の「null」をクリック。
メニューが表示されたら「New GDScript」を選択します。

これでPlayerノードにスクリプトがセットされました。
そのまま右側の「>」をクリックするとスクリプトエディタに移動できます。

で、ここからスクリプトを編集していきますが、今回は一からスクリプトを書くようなことはしません。
手っ取り早くキャラを動かしたいので、公式で配布されているデモの中にある、「Kinematic Character 3D」のコードを拝借します。



tip16.jpg

まずはデモを立ち上げてください。
Godotは複数起動可能ですので、現在の作業の裏で立ち上げてもOKです。

デモを起動したら、Sceneタブのノード一覧から「cubio」というノードの見つけ右側にあるスクリプトのアイコンをクリックします。
スクリプトエディタが表示されたら「Ctrl+A」で全ての行を選択し、その状態で「Ctrl+C」でコピーします。
そして自分のプロジェクトに戻り、Playerのスクリプトエディタに「Ctrl+V」で貼り付けます。
コピペできたらデモは終了してかまいません。

ではお借りしたスクリプトを変更します。
といってもコードの変更は一行だけで、85行目を削除すれば終わりです。

次に「InputMap」の設定がデフォルトだと動かないので設定を変更します。
左上メニューから「Scene → ProjectSettings → InputMap」と辿ってキーマップを追加していきます。
追加する値は次のとおりです。

move_forward・・・  矢印キー↑
move_backwards・・・ 矢印キー↓
move_left・・・    矢印キー←
move_right・・・   矢印キー→
jump・・・      スペースキー

追加手順はまず上側にあるテキストボックスに「move_forward」と入力し、そのまま「Enter」キーを入力するか右側の「Add」をクリックして新しいパラメータを追加します。
次にキーマップ一覧の一番下に追加された「move_forward」の右側にある「+」をクリックして「Key」を選択します。
「Press a Key」と表示されたら矢印キーの「↑」を入力して「OK」をクリックします。

他のキーも同じ手順でマッピングしていきます。
なお割り当てるキーはカスタマイズしても問題ありません。


ここまでの作業が終わったらシーンを「Ctrl+S」などで保存しておきます。
保存できたら、今回のプレイヤー作成作業は完了です。



▼ワールド作成

プレイヤーキャラの準備はできましたが、この状態ではまだテストプレイで動作確認をすることはできません。
新たにSceneを作成して、プレイヤーが歩くための地面を作成します。

エディター左上メニューの「Scene」から「NewScene」を選択して新しいシーンを開きます。
3Dビューポートに切り替えて、右側のSceneタブにてノードを追加していきます。
追加するノードと親子関係は次のとおりです。



tip18.jpg


DirectionalLightは、デフォルトライトを使う場合は必須ではありません。
というか手違いで追加してしまっただけなので、無視していただけると助かります;
(以降のスクショにもライトが映っていますが、もう撮り直せないのでこのままいきます‥)


追記:
デフォルトライトはゲームには反映されないようなので、シーンには何らかのライトが必須です。
ワールドにDirectionalLightを追加して、デフォルトライトを無効にしておいてください。
デフォルトライトを無効にするには、ビューポートの上にあるメニューの「View」をクリックし、「UseDefaultLight」のチェックを外せばOKです。


StaticBodyは、地面に当たり判定をつけるためのノードです。
CollisionShapeは、先ほど触れましたが当たり判定の形状です。
今回はBoxタイプにしました。
TestCubeはメッシュオブジェクト、ただの見た目です。
地面の記号として使います。


このままでは歩ける範囲が狭すぎるので、StaticBodyをリサイズします。
マニピュレータは大きさの比率を変えられないようなので、インスペクタでリサイズを行います。
StaticBodyのインスペクタで、ScaleのX,Zの値をそれぞれ30〜50くらいにしてみましょう。

で、これをプレイヤーの足場となる適当な位置に移動させますが、その際は必ず「StaticBody」を移動するようにしましょう。
子ノードの方を動かすと、見た目と当たり判定が合わなくなることがあります。
間違って子ノードを動かしてしまうことは、Godotではよくあることなので、オブジェクトのルートを動かすときは注意が必要です。


では、このシーンに先ほど作成したキャラクターを追加します。
キャラクターは、Spacialの子ノードとして追加します。



tip19.jpg

シーンをノードとして追加するときは「+」のアイコンをクリックします。
そして「Open a File」で先ほど保存したキャラクターのシーンを選択します。

キャラクターが追加されたら、TestCubeとの位置関係を確認しておきましょう。
プレイヤーの剛体がTestCubeに埋まっていたら、正常に動作しないかもしれません。



tip17.jpg

ここまで来ればテストプレイを起動してキャラを動かすことができます。
が、その前にエディター左上メニューから「Scene → ProjectSettings → General → main_scene」と辿って、現在のシーンのパスを通しておきます。
「main_scene」に現在のシーンを登録しておけば、プロジェクトを読み込んだ時に自動でこのシーンが開かれるようになります。
またF5キーでゲームを起動したとき、どのシーンからでもmain_sceneを呼び出してゲームを起動することができるようになります。


では、F5キーを押してゲームを起動してみましょう。
矢印キーとスペースキーでプレイヤーを操作できれば成功です。

今回作成したのはプレイヤーキャラの基礎部分のみで、キャラクターらしさはまだありません。
次回はもっとキャラクターらしい動きにしてみようと思います。

では、お疲れ様でした。
posted by gency at 15:17| Comment(0) | GodotEngine

2015年02月17日

Godotの話 第二回 -シェーダー編その1-

Godotのシェーダー言語についてのあれこれ。
今回はマテリアルシェーダー編。

シェーダーの基本的な使い方は公式ドキュメントを参照してください。

一応、ここでも文字だけで補足しておきます。

・シェーダーを適用するメッシュを選択
・インスペクタにて、Mesh項目の右側にある「>」をクリック
・Material項目の「▼」を押下、メニューから「New ShaderMaterial」を選択
・Materialの右側にある「>」をクリック
・Shader項目の「▼」を押下、メニューから「New Shader」を選択
・Shaderの右側にある「>」をクリック

で、テキストエディタが開けば準備完了です。


▼ LightShader

Godotでは、マテリアルシェーダーとして次の3つのシェーダーが使えます。

・VertexShader(VS)
・FragmentShader(FS)
・LightShader(LS)

VSは頂点やUVCoodなどを扱うところ、FSはピクセルの色を計算するところです。
この辺は馴染みがある方も多いかと思います。

では、LightShaderとは何でしょうか。
ちなみに私は初耳。
これは掻い摘んで言うと、LambertやToon、法線マップといった「ライトの影響を受けるシェーダー」を作成するためのものです。
GLSLではライトを参照するシェーダーもFSに書きますが、GodotではLSとして切り離しているんですね。
最初は少し混乱しましたけど、正体が分かってしまえばなんてことはない、という感じでした。


▼LightShaderの例


LIGHT = DIFFUSE


LSの最小コードは1行です。
「DIFFUSE」はFSの出力、「LIGHT」はLSの出力を意味します。
このコードは、マテリアルの設定を「Unshaded」にしたときと同じ見た目になりますが、Unshadedは影の描画を無効にしてしまいます。
一方、LSを使ったこちらの場合は、ちゃんと地面に影を落とすことができます。
実は、実用的なコードだったりします。


一行だけで終わるのもアレなので、ハーフランバートシェーダーも紹介。


float c = dot(NORMAL,LIGHT_DIR);
c = c * 0.5 + 0.5;
c = c * c;
LIGHT = DIFFUSE * c;


とっても短く書けました。

なお、LSで「DIFFUSE」を参照した場合は、FSの記述が必須になります。
FSの例としてメッシュにテクスチャを貼り付けるコードを置いておきます。


uniform texture difftex;
DIFFUSE_ALPHA = tex(difftex,UV);


uniform変数を定義すると、ShaderMaterialに「Param」という項目が追加されます。
その中に「Difftex」という項目(ユーザー定義なので命名は自由、頭文字は自動で大文字に変換される)があるので、そこからシェーダーで参照するテクスチャを読み込みます。


▼作例

godot.jpg

FSとLSを使った作例として、ググっててよく見かける輪郭線シェーダーを作成しモデルに適用してみました。
輪郭線はFSで作成、シェーディングは、先ほど紹介したハーフランバートの改造版をLSで作成しています。
画像だけでは分からないので動画も用意しましたが、いろいろヒドイのでなるべく目を細くして見てください。



今回はちゃんとした動画を作ろうって決めてたのに、なんか前より酷くなってますねw
見せたかったのは、カメラ処理とシェーダーの具合だけなので、それ以外は脳内でフィルタリングしていただきたく・・っても、無理ですよな。


▼ まとめ

Godotのシェーダー言語を使ってみた感想ですが、GLSLに比べて手軽にシェーダーが書ける設計になっていると思います。
少ない行数で記述できるので、メンテも機能拡張も捗りそうです。
この上さらに、プログラムなしでシェーダーが書ける「VisualShaderEditor」なんてものも開発中だそうで。
いろいろ先が楽しみなGodotさんです。
ポストはよ。
posted by gency at 18:59| Comment(0) | GodotEngine