tag:crieit.net,2005:https://crieit.net/tags/VisualScript/feed 「VisualScript」の記事 - Crieit Crieitでタグ「VisualScript」に投稿された最近の記事 2020-06-26T23:14:59+09:00 https://crieit.net/tags/VisualScript/feed tag:crieit.net,2005:PublicArticle/15984 2020-06-26T22:36:48+09:00 2020-06-26T23:14:59+09:00 https://crieit.net/posts/Godot-NoCode Godotのビジュアル・スクリプトを使ってNoCodeでゲーム作りの基礎 <p>Godotはオープンソースのゲームエンジンです。とりあえず最初の準備だけして動かしてみるだけならUnityやUnreal Engineと比べても最速だと思います。</p> <p>Godotにはビジュアルスクリプトというものがあり、プログラムを書かなくてもビジュアルで処理を書くことができるエディタが備わっています。ちょっと触ってみたためせっかくですのでチュートリアル的に書き残しておきたいと思います。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f815b9064.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f815b9064.png?mw=700" alt="image.png" /></a></p> <p>今回はスプライトという画像オブジェクトを動かす基礎的な部分を解説します。Godot3.2で進めていきます。</p> <h2 id="プロジェクトを作成"><a href="#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90">プロジェクトを作成</a></h2> <p>まずは起動したらプロジェクト一覧が開きます。新規プロジェクトボタンをクリックしてプロジェクトを作成していきます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e46bce3ff.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e46bce3ff.png?mw=700" alt="" /></a></p> <p>フォルダはどこでも構いませんので、空のフォルダを作成して選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e4bcaed06.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e4bcaed06.png?mw=700" alt="" /></a></p> <p>作成すると3Dのからのシーンが表示されます。今回は2Dで試すため2Dシーンを選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e50753eeb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e50753eeb.png?mw=700" alt="" /></a></p> <p>一度Ctrl+Sを実行、もしくはシーンメニューから「シーンを保存」を実行して保存しておきましょう。名前は何でも大丈夫です。</p> <p>こんな感じで2Dのシーンが表示されていればOKです。Node2Dはシーンの一番上の現在は空のオブジェクトです。クリックしてTestScene等、わかりやすい名前に変えてもOKです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e596473d1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e596473d1.png?mw=700" alt="" /></a></p> <p>ひとまずこれでプロジェクトの新規作成と準備が完了です。</p> <h2 id="スプライトを配置する"><a href="#%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B">スプライトを配置する</a></h2> <p>ゲーム画面に画像を表示するためにはスプライトというものを使用します。シーンのノード一覧のプラスボタンからも作成できますが、今回はすでにプロジェクト内にあるGodotのアイコンを使います。アイコンを画面にドラッグして配置するとスプライトが出来上がります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e6ab9f9f5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e6ab9f9f5.png?mw=700" alt="" /></a></p> <p>シーンのノード一覧でも表示されています。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e6e235b37.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e6e235b37.png?mw=700" alt="" /></a></p> <h2 id="スプライトを動かす"><a href="#%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99">スプライトを動かす</a></h2> <p>それでは先程追加したスプライトを動かしていきます。</p> <h3 id="スプライトの座標"><a href="#%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%81%AE%E5%BA%A7%E6%A8%99">スプライトの座標</a></h3> <p>どうやって動かすかというと、スプライトは横軸X、縦軸Yという座標上に配置されています。</p> <p>具体的には、スプライトを選択するとインスペクタにスプライトの詳細情報が表示されます。ここのTransformを選択して開くと、Positionに値が入っているのがわかります。これが現在配置されている座標です。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e77ab033c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e77ab033c.png?mw=700" alt="" /></a></p> <p>試しにこれを直接変更するとスプライトの位置が変わります。これをビジュアルスクリプトを使って変化させることで動かすようにします。</p> <h3 id="スクリプトを追加"><a href="#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0">スクリプトを追加</a></h3> <p>スプライトを動かすためには、スプライトに紐づくビジュアルスクリプトを作成します。先程のインスペクトの一番下に、Scriptという設定欄がありますのでこちらで新規スクリプトを追加します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e8fb97902.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e8fb97902.png?mw=700" alt="" /></a></p> <p>とりあえず今回はすべてデフォルトのままでOKですが、ビジュアルスクリプトを使うため言語だけVisualScriptにしておきます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e97ed6d82.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e97ed6d82.png?mw=700" alt="" /></a></p> <p>作成を実行すると次のようなビジュアルスクリプトの編集画面が開きます。ここに色々と処理を書いていきます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e9cf669d4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5e9cf669d4.png?mw=700" alt="" /></a></p> <h3 id="動かす処理を書いていく"><a href="#%E5%8B%95%E3%81%8B%E3%81%99%E5%87%A6%E7%90%86%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%81%8F">動かす処理を書いていく</a></h3> <p>今回はスプライトをずっと右移動させるスクリプトを書いていきます。「ずっと動かす」という処理は、 <code>_process</code> という関数で行うことができます。まずはこれを配置します。これは元々Godotで定義されているメソッドですので、左下のメンバーという欄の関数という行のプラスボタンの左に変なマークがありますので、これをクリックします。</p> <p>これです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ea8a6030e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ea8a6030e.png?mw=700" alt="" /></a></p> <p>ここにProcess(float)という項目がありますので、これを選択して実行します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5eac57bfe2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5eac57bfe2.png?mw=700" alt="" /></a></p> <p>エディタ上に配置されました。これでまだ何もしませんがずっと処理を繰り返すProcessを定義することができました。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5eb0ae006f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5eb0ae006f.png?mw=700" alt="" /></a></p> <p>実際に何をやるかは、この右矢印につなげて指示していきます。先程話したように、今回はpositionを変更していきます。_processが呼ばれるごとにX座標をプラス1していく処理を書いていきます。</p> <p>positionを変更するためには、Set positionを呼び出します。エディタ上で右クリックすると命令一覧が出てきます。これでpositionで絞り込むと「Positionを設定」という項目が見つかりますので、これを選択して確定します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ebc97e0e7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ebc97e0e7.png?mw=700" alt="" /></a></p> <p>エディタ上に表示されました。処理を実行させるため、_processの矢印とSet positionの矢印をつなげておきます。これで毎フレームSet positionが実行されることになります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ec77c5810.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ec77c5810.png?mw=700" alt="" /></a></p> <p>しかし、まだ何をSetするのかが決まっていません。右移動させるためには何をセットさせればよいかというと、「現在のpositionにXを1足したもの」です。まずは先程と同じ操作で「Positionを取得」を配置します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ece064e89.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ece064e89.png?mw=700" alt="" /></a></p> <p>ちなみに、これの紫の丸マーク同士をつなげて実行してみることも可能です。ただ、取得した値をセットしているだけですのでエラーにはなりませんが進みもしません。これに1を足していきましょう。足すためには <code>Math Add</code> を選択します。これは単なる数学のプラスです。</p> <p>今回は右クリックで作成するのではなく、Get positionの紫マークからドラッグして何もないところで離すと命令の選択ボックスが現れますのでそちらから選択してください。そうしないと型がずれてうまく行かない場合があります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ed6b8e282.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ed6b8e282.png?mw=700" alt="" /></a></p> <p>同じ紫のマークになって繋がっていればOKです。左の2つのマークから受け取った値をプラスし、右のマークから出すという仕組みです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5efc81d00b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5efc81d00b.png?mw=700" alt="" /></a></p> <p>次にGetしたpositionに足すための1が必要になります。この1はただの数値ではなく、座標のXが1であることを表すものである必要があります。Godotでは2Dでの座標は <code>Vector2</code> というクラスを用います。Vector2を新規作成するための <code>Construct Vector 2XY</code> という項目を選択して配置します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ee54352af.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5ee54352af.png?mw=700" alt="" /></a></p> <p>今のところこんな感じになっています。配置すべき命令自体はこれで全てです。次の解説を見る前にちょっとどの様につなげればいいか想像してみてください。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f0441b733.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f0441b733.png?mw=700" alt="" /></a></p> <p>取得したpositionとX=1のVector2を足して、それをSetする、という流れです。</p> <p>答えは下記です。文字で書いたとおりそのままですね。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f0604badb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f0604badb.png?mw=700" alt="" /></a></p> <p>再生ボタンを実行してみましょう。最初だけどのシーンをデフォルトで実行するかを聞かれますので、現在編集しているNode2D.tscnを選択しておきます。名前を変えたり新たにシーンを作っている場合はそちらを適宜選択してください。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f08e6b946.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f08e6b946.png?mw=700" alt="" /></a></p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ふと思い出したのでGodotのVisual Scriptingやってみた。Unreal EngineのBlueprintみたいな感じ。ちなみにこれは配置したスプライトに毎フレームx=1のベクトルを足してるだけのスクリプト。需要あるのかなと思うけど英語だし日本のホビーでは厳しそうかな。 <a target="_blank" rel="nofollow noopener" href="https://t.co/xkcEgJLzCS">pic.twitter.com/xkcEgJLzCS</a></p>— だら🎄サービスづくりひたすら (@dala00) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/dala00/status/1276477795909038080?ref_src=twsrc%5Etfw">June 26, 2020</a></blockquote> <h3 id="GDScriptの場合"><a href="#GDScript%E3%81%AE%E5%A0%B4%E5%90%88">GDScriptの場合</a></h3> <p>ちなみにGDScriptを使った場合はこんな感じです。</p> <pre><code class="python">extends Sprite func _ready(): pass # Replace with function body. func _process(delta): set_position(Vector2(position.x + 1, position.y)) </code></pre> <h2 id="もうちょっと動きを加えてみる"><a href="#%E3%82%82%E3%81%86%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E5%8B%95%E3%81%8D%E3%82%92%E5%8A%A0%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B">もうちょっと動きを加えてみる</a></h2> <p>右に一直線に動くスクリプトが作成できました。これを少し改造して上下にゆらゆら揺れながら動くようにしてみます。具体的にはこんな感じです。</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">さっきのにsinでふよふよを追加してみたけどやっぱちょっとめんどすぎる <a target="_blank" rel="nofollow noopener" href="https://t.co/ZdncBWWg0f">pic.twitter.com/ZdncBWWg0f</a></p>— だら🎄サービスづくりひたすら (@dala00) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/dala00/status/1276483799669305346?ref_src=twsrc%5Etfw">June 26, 2020</a></blockquote> <p>具体的にはどのようにするかというと、先程は(X, Y) = (1, 0)というベクトルを足しましたが、このYの値をゼロではなくsinを使った値を入れることで上下にゆらゆらさせてみます。</p> <h3 id="角度を定義する"><a href="#%E8%A7%92%E5%BA%A6%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B">角度を定義する</a></h3> <p>sinで変動させるためには、sinにわたすための角度が必要となります。毎フレーム10度ずつ増やしていき、それのsinを足していくという形にしたいと思いますので、まずはこの角度を保持しておくための入れ物(変数)を作ります。</p> <p>メンバー欄に変数を作成ボタンがありますのでそちらのプラスをクリックして変数を作成します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f2e5e8229.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f2e5e8229.png?mw=700" alt="" /></a></p> <p>作った変数を右クリックするとメニューが現れますので、「メンバーを編集」を選択します。そして下記のようにTypeとValueを設定します。Valueは単に0にするだけだとnullのままになってしまうため(Godot3.2.1現在)、一度1にしてから0に戻してください。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f3591d4d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f3591d4d6.png?mw=700" alt="" /></a></p> <p>クリックで名前を変更できるためangleに変更しておきましょう。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f3bd08115.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f3bd08115.png?mw=700" alt="" /></a></p> <h3 id="角度を変動させる"><a href="#%E8%A7%92%E5%BA%A6%E3%82%92%E5%A4%89%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B">角度を変動させる</a></h3> <p>さて、次はこれを毎フレーム10ずつ足していきます。これは先程のベクトルを足す処理と同じなので簡単です。変数を操作する処理を追加するためには、この変数欄をドラッグして配置すればOKです。そのままドロップするとGet angleになり、Ctrlキーを押しながらドロップするとSet angleになります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f43ec717a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f43ec717a.png?mw=700" alt="" /></a></p> <p>これで先程と同様にして10を足す処理を入れましょう。こんな感じです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f4b72b7fd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f4b72b7fd.png?mw=700" alt="" /></a></p> <p>プログラムには処理の順番がありますので、先程のSet positionに続くようにSet angleをつなげます。これで_processの呼び出しで各処理が実行されます。</p> <p>さて、次はこのangleを実際に座標移動のために利用していきます。具体的にはangleを使って計算した値をSet positionするベクトルのY座標に入れます。</p> <p>ちなみに掛け算はMath Multiplyです。intになっている場合があるためインスペクタでfloatに変更しておいてください。割り算はMath Devide、sinはSinです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f66dcc0a4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f66dcc0a4.png?mw=700" alt="" /></a></p> <p>最終的にこんな感じになります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f77004415.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ef5f77004415.png?mw=700" alt="" /></a></p> <p>要するに、下記のような計算です。sinによりプラスとマイナスが繰り返されるので上下にふらふらと揺れます。</p> <pre><code class="txt">vector.y = sin(angle * PI / 180) </code></pre> <p>ちなみに記事の最初の画像が全体図です。</p> <h3 id="GDScriptの場合"><a href="#GDScript%E3%81%AE%E5%A0%B4%E5%90%88">GDScriptの場合</a></h3> <p>ちなみにGDScriptは下記になります。</p> <pre><code class="python">extends Sprite var angle = 0 func _ready(): pass # Replace with function body. func _process(delta): var add_y = sin(3.14 * angle / 180) set_position(Vector2(position.x + 1, position.y + add_y)) angle += 10 </code></pre> <p>プログラムが分かる場合はこちらのほうがやはり楽そうですね。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということでビジュアルスクリプトを使った場合の解説をしてみました。Unreal Engineも同じようなBlueprintというものがあります。決しておまけや子ども向けの機能だけとしてあるものではないというイメージです。プログラムにはどうしても抵抗がある場合はそちらで試してみましょう。</p> <p>ちなみにHTML5ビルドもありますので簡単なものならすぐWebに公開できます。ちょっと重いですが。</p> <p><a target="_blank" rel="nofollow noopener" href="https://dala00.github.io/godot-vstest-web/">https://dala00.github.io/godot-vstest-web/</a></p> だら@Crieit開発者