Archive For The “ゲーム” Category

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(持ち上げ編)

By |

Stingray(VRテンプレート)の持ち上げ処理を調べてみる<br>(持ち上げ編)

今回も引き続き、『物を掴む処理』を見ていきます。 次回を含め、覚えることが盛りだくさんです。 画像の中の青い部分は前回にやった『物に触れている間の処理』です。 緑の部分はまだ特に触れてはいませんが、 基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。 ■ 状態のチェック コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。 ここでは、触れている物の状態をチェックし、『持ち上げることができるか』を判定しています。 ◯ Is the Wand Touching an Object? 最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。 この変数は前回の『Physics Trigger』の処理で何かに触れている時にTrueに変更されています。 つまり、『何かに触れているか』をチェックしています。 ◯ check for no pick up in unit data Trueならば今度は変数『touching_unit』の値が持つ『pick_up』のデータと『no』を 『Compare Objects』ノードで比較しています。 『Compare Objects』ノードは、A・Bに渡された値が同じであるかどうかを返します。 まとめると、ここでは 『触れているユニットが持つ持ち上げられる物体かどうかのデータを見て、その内容がnoであるかどうか』 をチェックしています。 ◯ Is the Actor Dynamic? 上記処理で等しくなかった(noではなかった)場合、 『Is Actor Dynamic』ノードの結果がTrueであるかという処理を行っています。 『Is Actor Dynamic』ノードは、『Actor』に指定された物体が動的であるかどうかを返します。 つまり、『持ち上げようとしている物体が動かせるものか』という確認になります。 ここまでの処理で、『物体を持ち上げるまでの確認』が完了しました。 ■ Attach the Object…

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(前準備編)

By |

Stingray(VRテンプレート)の持ち上げ処理を調べてみる<br>(前準備編)

今回からは、前回の最後に登場した『function_pickup』ユニットのユニットフローを見ていきます。 コントローラのユニットフローを見てもわかる通り、 『function_pickup』ユニットには『物を持ち上げる』という処理が実装されています。 早速、function_pickupユニットを見ていきましょう。 アセットブラウザから『vr_steam』->『models』->『functionality_pickup』の中にあるユニットを開きましょう。 なお、画像の赤四角のようなアイコンはユニットフロー単体を表しています。 こちらのアイコンをダブルクリックして開くとユニットエディタとは異なる ユニットフローを編集するための『FlowEditor』が開かれます。 ユニットフロー以外の要素がなく、 ユニットエディタを開く必要がない場合はこちらを開いてもいいかもしれません。 そうして開かれた『functionality_pickup』のユニットフローが以下の画像です。 非常に膨大な処理ではありますが、少しずつ進めていきます。 今回、説明していく箇所は、以下の画像で赤・青・緑の枠の部分です。 ■ 『Set Variables on Spawn』 青色の枠の箇所です。 『Unit Spawned』から始まっていることからわかるかもしれませんが、 ここでは一番最初に行うべき『変数の設定』を行っています。 以下の変数がここで設定されています。 ———————————————— スコープ:型:名前 ———————————————— ローカル:bool:touch_tracker:False ローカル:bool:laser_on:False ローカル:string:my_global_var:wand_extras_1 or 2 グローバル:unit:wand_extras_1 or 2:unit グローバル:bool:keep_my_rotation_and_position:True ———————————————— ■ 『Wand Velocity』 赤色の枠の箇所です。 『Level Update』にて常に行うべき処理が実装されています。 『Get Unit World Position』を使用して自分のワールド座標を取得し、 その結果を変数『wand_current_frame_pos』に設定しています。 変数『wand_current_frame_pos』は現在位置を表しています。 この部分では変数『wand_current_frame_pos』から 変数『wand_last_frame_pos』の値を減算した値に 『Get Last Delta Time』で取得した時間を除算、 その結果をユニットが持つスクリプトデータの『wand_velocity』と…

StingrayVRテンプレートのVR向けノードをまとめてみた

By |

StingrayVRテンプレートのVR向けノードをまとめてみた

Stingrayのビジュアルスクリプティング機能、『Flow』では、 最初のテンプレートの選択によってVRに特化したノードを使用することができるため、 簡易的な物であれば建築分野用のVRデモなどを実装することもできます。 今回は、VR特化のノードについて、用途ごとに以下にまとめてみることにします。 ちなみにSteamVR(HTC Vive)用のノードを例にして挙げていますが、 StingrayにはOculus/GoogleVR/GearVR用のノードもあります。 ただし、どのHMDでも内容はほぼSteamVRと同一の為、割愛します。 最初に注意点ですが、 VR用ノードはStingrayのVRテンプレート実行時に同時に作成されるという仕様のため、 プロジェクト作成時に『VR HTC Vive』テンプレートを選択しないと、下記のノードが使用できません。 (使用するHMDによってテンプレートを選択してください) ※Viveコントローラの入力を取得したい ・SteamVR Button このノードはUpdateピンに接続されたタイミングで 『Controller Index』に設定されたコントローラの 『Button Name』に設定されているボタンが押されたかどうかを取得し、 処理を分岐させています。 ボタンの割り当てはViveの公式ドキュメントを参考にしてください。 (尚、システムボタンだけどういうわけか反応がありませんでした) 『Pressed』は最初にボタンが押された時、 『Held』はボタンを押し続けている時、 『Released』はボタンから指を離した時にそれぞれ呼ばれます。 『Value』は入力の状態を0~1の範囲で返します。 (指を離している時が0、完全に押し込んだ時が1。) 以下はトリガーの入力の範囲をログに出力するサンプルです。 画像のようにノードを接続しています。 ・SteamVR Touch こちらのノードは上述したButtonの『Touch Up』~『Touch Right』までをより詳細にしたノードです。 Buttonの方と同じ、『Pressed』『Held』『Released』の他、 タッチパッドに触れている間呼ばれ続ける『Touched』と タッチパッドから指を離したときに呼ばれる『Untouched』が追加されています。 X/Yは指先が触れている座標を中央を0として1~-1の範囲で返します。 ちなみに、どちらも『SteamVR』->『Input』の中にあります。 ※Viveコントローラに振動を与えたい ・SteamVR Controller Feedback このノードは『Controller Index』に設定されたコントローラに対し、 『Seconds』秒間の振動を与えます。 ただし、0.003999以上の値を設定すると、 強制的に0.003999に合わせられてしまいます。 VRのデモなどで『何かに触れた』という事を表す場合は単体で使用すればよいのですが、 ゲームなどの演出のように、長期的に振動させたい場合は、 画像のように連続で呼ばれるような処理を作る必要があります。 ※HMDの画面をフェードさせたい…

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(一応の最終回)

By |

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(一応の最終回)

この記事は以下のような方を対象としています。 ——————————- ・VR機器を持っていて、UE4でとりあえず使ってみたい方 ・UE4での経験がまだ浅い方 ——————————-     前提のスキルとして ——————————- ・UE4のエディタの操作方法がわかる ——————————- があればOKです。   また、先に前回・前々回の記事を読んでから、この記事を読み始めていただきたいです。   こんにちは、名残惜しいですが『パンチングゲーム制作』は今回で一旦の最終回です。 最後までしっかりやっていきましょう!     さて、前回まででは 『敵のBPの追加』 『敵のパラメータを設定』 『敵の移動処理』 『敵が死亡したら消える処理』 をやってきました。   今回はついに 『攻撃時に敵を死亡させる処理』 『プレイヤーが敵に攻撃する処理』 『レベルそのものの設定』 『プレイ中に敵をスポーンさせる処理』 『出来上がったものを試しにプレイ』 をやっていきます。     11.敵のブループリントを実装しよう!(ラスト) 敵のブループリントもこれで最後です。 これまでに『生存している間、移動する処理』と『死亡したら消える処理』を実装してきました。 そうなると、残っている処理は『生存/死亡を切り替える処理』です。   最初の仕様の通り、生存/死亡が切り替わるタイミングとは『プレイヤーに殴られた時』となります。   プレイヤーに殴られた時に呼び出されるイベントに、生死を切り替える処理を実装しましょう。   もしかしたら忘れている方もいるかもしれませんが、こういう時こそ『BPインターフェイス』を利用します。 画面上の『クラス設定』を選択し、『詳細ウィンドウ』の『インターフェース』→『実装インターフェース』に、初期に作成した『PunchingInterface』を追加しましょう。 これで、殴られたとき用のイベントが追加できるようになります。     ブループリント上で右クリックを行い、これまた最初に作成した『Punching』イベントを追加しましょう。 (インターフェイス追加後にコンパイルしないと表示されないので要注意です) これが殴られた時に呼び出されるイベントです。 あとはこの先に生死を切り替える処理を実装しましょう。 生死を判定している変数とは、そう、『IsAlive』です。 『IsAlive』をFalseに変えてしまえば敵の実装も完了です!…

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(第二回)

By |

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(第二回)

    2017/04/14:記事の文章にあった間違いを修正しました。 トランスフォームの可動性を変更しないと動かせませんね…。 失礼しました。     この記事は以下のような方を対象としています。 ——————————- ・VR機器を持っていて、UE4でとりあえず使ってみたい方 ・UE4での経験がまだ浅い方 ——————————-     前提のスキルとして ——————————- ・UE4のエディタの操作方法がわかる ——————————- があればOKです。   また、先に前回の記事を読んでから、この記事を読み始めていただきたいです。   こんにちは、前回から始まった『パンチングゲーム製作』。 わかりやすく説明できたでしょうか?     さて、前回まででは 『VRテンプレートでのプロジェクト作成』 『不要なBPの削除』 『BPインターフェイスの作成』 をやってきました。   今回は 『敵のBPの追加』 『敵のパラメータを設定』 『敵の移動処理』 『敵が死亡したら消える処理』 を実装していきます。   ガリガリ、というほどではありませんが、 それなりに本格的にBPを弄っていきますので、気を引き締めましょう!     6.敵を追加しよう! ついに敵キャラを作ります。 『新規追加』→『ブループリント クラス』で新しいBPを作成します。 StaticMeshActorを継承しましょう。 球体型の敵にしようと思うので、『BP_Enemy_Ball』と名付けましょう。     7.敵のパラメータを設定しよう! さて、今のままだと何も見えません。 敵の姿を追加していないためです。 敵のBPを開いて、『StaticMeshComponent』の『StaticMesh』を変更し、敵の姿を設定しましょう。…

迷路の自動生成アルゴリズム「穴掘り法」をCoffeeScriptとenchant.jsで実装してみた

By |

迷路の自動生成アルゴリズム「穴掘り法」をCoffeeScriptとenchant.jsで実装してみた

前回のブログで、「enchant.jsでさくっとアルゴリズミックなゲームを作る時なんかに良さそうです。」と書いたCoffeeScriptですが、早速enchant.jsとの組み合わせで、代表的なアルゴリズムである「穴掘り法」(正確には穴掘り法に自分なりの解釈を加えたもの)を実装してみました。 分かったことですが、CoffeeScriptはやっぱりとってもコードが書きやすい。 ネスト(ループの入れ子)が多いところも書きやすい。 JavaScriptはカッコが多い言語なので、CoffeeScriptのようにカッコなしでかけるのは本当に気持ちがいいし、とても捗りますね。 やっぱり、こうしたものをコーディングするには丁度良さそうです。 デモはこちらです。URL : http://mankindinc.jp/programming/enchantjs/1.html 最初に考えたこと コーディングにかかる前に、迷路生成のアルゴリズムを実装する時にどのように組んでいったらいいか、ざっと考えてみました。 ・最初 ・・どれかひとつの座標をランダムで選ぶ(ただし、XYともに偶数偶数) ・・「基点の座標一覧」にそこを追加 ・・掘る ・掘る ・・ランダムに1方向選び、2マス先の座標が掘れるかたしかめる ・・掘れれば、「基点の座標一覧」にそこの座標を追加し ・・1マス先と2マス先を掘る ・掘れなかったら、それ以外の方向の2マス先の座標が掘れるかたしかめる ・・掘れれば、「基点の座標一覧」にそこの座標を追加し ・・1マス先と2マス先を掘る ・それでも掘れなかったら、それら以外の方向の2マス先の座標が掘れるかたしかめる ・・掘れれば、「基点の座標一覧」にそこの座標を追加し ・・・・「基点の座標一覧」から現在の座標を削除し、1マス先と2マス先を掘る ・それでも掘れなかったら ・・「基点の座標一覧」から現在の座標を削除し、 ・・もし「基点の座標一覧」にひとつでもあれば ・・・「基点の座標一覧」からどれかひとつをランダムで選ぶ ・・・その座標で掘る ・・「基点の座標」がもうなかったら ・・・終わり   いよいよ実装へ digという関数はちょっと凝りました。結局、穴掘り法にちょっと変更を加えたものになりました。 numR = 39 numC = 39 posArr = [] pos = [] directions =[[2,0],[-2,0],[0,2],[0,-2]] # 地図生成————————— for row in [0…numR] pos[row] =…

Go Top