VR、ゲーム制作、プログラミング。Unity とか Oculus Rift とか。

2014年5月25日日曜日

[OculusRift]見習い空賊と天空の少女

「見習い空賊と天空の少女」は、映画のような世界で主人公の少年になって少女を救出しに行く没入型フライトアトラクションです。

ゴーグルに見立てた最新のヘッドマウントディスプレイ OculusRift を身に付け、子供の頃に誰もが一度は憧れた映画のように、飛行機に乗り込み少女の待つ塔へと向かいます。

クライマックスで少女を助け出すには、飛行機の後ろから身を乗り出す「あの姿勢」をリアルでも取らなくてはいけません。あなたは、無事に彼女を助け出すことができるでしょうか?

ギャラリー

(モバイル表示 / YouTube) ※ネタバレあり

体験者の様子 ※ネタバレ控え目、旧バージョン、HMD 同期ズレは別撮りのため

「4 秒で支度しな!」

風を切って進みます

「…どこ見てるんだい」

「パズお!」「シーたん!」

プレイ時間はたった 2 分ほどですが、テーマパークのストーリーライドのような展開にインタラクション性をプラスした本作で、これまでにないアトラクション体験をお楽しみいただけるのではないかと思います。

出展情報


メディア情報


クレジット

モデル
(MMD モデル/ステージついては、各作者氏にメールにて利用許可を頂いております)

BGM
  • 希望~Esperance, 遠い空 (ZIADARA / DAIZ 氏)
  • 女性が舞うような感じの戦 (Ferne Welt / Piro 氏)

SE

ツール

アセット


2014/06/09 : 出展情報更新、メディア情報更新、クレジット追加
2014/10/10 : 出展情報更新
2014/10/24 : 動画を追加
2015/6/3 : ギャラリー、出展情報、クレジットを最新版に合わせて更新

2014年5月21日水曜日

[Unity]iTweenでのパス移動を使う前に知っておいた方がいいこと

Unity で位置や回転などを簡単にアニメーションさせることができるアセット iTween はよく知られています。

iTween ではパスに沿っての移動もできるのですが、ハードに使うにはあまり向いていない面もあるので事前に知っておくといいかもしれません。

良い点
  • そこそこいい感じにポイント間のカーブを描いてくれる
    • ただし接線は編集できないので、完全に意図通りにするのは難しい
  • easing オプションがけっこう豊富
  • 進行方向に向くように回転するオプション orienttopath がある


困った点
  • 速度の調整が非常に困難
    • speed または time パラメータがあるものの、ポイント間の直線距離に依存する=2点間は近いが生成されたカーブは長い場合に意図通りにならない(ただしうろ覚えです)
    • パス移動中に変更できない
  • カーブの接線が変更できないため、一度カーブした後に特に完全な直線を作るのは難しい
    • 前後 2 点までしか影響を受けないようなので、一応点を増やせば直線を作れるが、その前後がふくらんだりする問題の調整に追われる
  • 複数のパスを滑らかに接続するのが非常に困難
    • movetopath オプションを使えば線はつながるが、滑らかなカーブにはならない
  • すでに終了している Tween に対して iTween.Stop() すると例外が発生することがある
    • onComplete を使ってフラグ管理できなくもないが面倒
    • とりあえず try-catch しておけばスクリプトの停止は避けられる
  • iTweenPath でパスはエディタ上で編集できるが、あとで調整はしにくい

上記を知った上でツールの選択をされるのがよいと思います。

2014年5月18日日曜日

[Unity]uState : スクリプトベースのステートマシン

uState は Unity 用のスクリプトベースなステートマシンです。

ダウンロード

uState v0.9.1

過去のバージョン
uState v0.9.0

概要

スクリプトの記述を前提としたステートマシンです。


  • 基本 1 ステート 1 ファイル。100% スクリプトだけでも記述可能
  • パラメータ、遷移条件、各状態での動作などは自由に記述可能
  • 継承による一部改変が容易
といった色気のなさを特徴としています。

使い方 - はじめに

以下、慣れないうちは Examples/00_Common/Scripts にある TemplateStateMachine.csTemplateState.cs をコピーして編集するのがおすすめです。

また、ある程度 C# スクリプトを書くことに慣れた方であれば、これらのファイルやパッケージ内のサンプルを眺めながら以下の説明を読んでいただいた方が理解が早いかもしれません。

使い方 - ステートマシンとステートの作成

ステートマシン作成
  1. 新しい C# スクリプトを作成し、uStateMachine を継承する
    public class MyStateMachine : uStateMachine
    
  2. 作成したスクリプトを適当なオブジェクトに追加する
ステート作成
  1. まず、後の利便性のため、ベースとなるスクリプトを作成しておく
    1. 新しい C# スクリプトを作成し、uStateGeneric<MyStateMachine> を継承する
      public abstract class MyStateBase : uStateGeneric<MyStateMachine>
  2. 実際に利用するステートを作成する
    1. 新しい C# スクリプトを作成し、MyStateBase を継承する
      public class MyState1 : MyStateBase
    2. MyStateMachine を追加したオブジェクトに子オブジェクトを作成し、MyState1 を追加する
    3. インスペクタなどから、MyState1 の State Name を適宜設定する
初期ステートの設定
  1. MyStateMachine の Default State Name を、さきほど設定した MyState1 の State Name にする
これで、状態が 1 つだけで何もしないステートマシンができました。

使い方 - 動作の記述

各ステートでの動作は、以下のメソッドに記述します。
  • OnStateUpdate : 状態遷移判定の前
  • OnStateEnter : ステートに遷移した直後
  • OnStateExit : ステートから遷移する直前
  • OnStateStay : そのステートである間、Update ごとに呼び出される

使い方 - ステートマシンのパラメータ

ステートマシン全体のパラメータは、ステートマシンのスクリプトに public 変数などで通常の MonoBehaviour と同様に記述します。

各ステートではステートマシンに stateMachine フィールドでアクセスできます。

使い方 - 状態遷移

指定時間で遷移する方法と、bool を返す関数の結果で遷移する方法があります。

時間で遷移する場合は、ステートの Exit By Time に時間と遷移先状態名を指定してください。

関数の結果で遷移する場合は、以下のような関数をステートに用意しておき、ステートの Transitions の配列サイズを変更、関数名と遷移先状態名を指定してください。関数は public である必要があり、true が返ったときに遷移します。引数は取れません。

public bool IsParam1Large ()
{
    return stateMachine.param1 > 10; // true for transition and false for not
}

遷移関数は配列の若い番号のものほど優先されます。

使い方 - ステートの初期化をスクリプトだけで行う

ステートの各パラメータはインスペクタからも設定できますが、スクリプトに書いてしまった方が管理が楽になる面もあります。

Monobehaviour の Reset 関数に記述する方法がおすすめです。

using System.Linq; // for Concat()

protected override void Reset ()
{
    base.Reset();

    stateName = "State1";
    exitByTime = new ExitByTime(1.0f, "State2");
    transitions = (new Transition[] {
        new Transition("IsToState3", "State3"),
        new Transition("IsToState4", "State4")
    }).Concat(transitions).ToArray();
}

使い方 - ステートマシンの初期化をスクリプトだけで行う

ステートの生成を含め、全ての初期化をスクリプトで書くことも可能です。

こちらも Monobehaviour の Reset 関数で、パラメータの初期化やステートの生成を行います。

ステートの生成については、利便性のために DestroyAllStates() と CreateStates() が用意されています。

protected override void Reset ()
{
    base.Reset();

    defaultStateName = "State1";

    DestroyAllStates();
    CreateStates(new System.Type[] {
        typeof(State2),
        typeof(State3)
    });
}

使い方 - その他

  • 自分自身と同じステートに遷移できます
    • OnStateExit(), OnStateEnter() が呼び出されます
  • 遷移条件を満たす限り、1 フレーム内で複数ステート先まで遷移可能です
    • ステートマシンの transitionLimit で遷移回数の上限を指定します(デフォルトは 10)
    • 0 にすると無制限になりますが、無限ループにならないよう注意してください
    • ただし、自分自身と同じステートへの遷移は 1 回で止まります

サンプル

パッケージ内のサンプルの説明です。
  • 00_Common : サンプルで共通に使うスクリプトや、スクリプトの雛形があります
  • 01_Signal : 時間で状態遷移する信号機のようなものです。日本以外だとダメそうですね
遷移関数 transitions を使うサンプルがまだありません。すみません。追って追加予定です。

今後の予定

主にスクリプト作成支援系のエディタ拡張などを行い、アセットストアに出すことを検討しています。

その場合でもコア部分(少なくとも v0.9.0 相当)のスクリプトは体験版も兼ねて公開を続けます。ただし、メジャーバージョンアップや仕様上の欠陥が見つかった場合は後方互換性が保障されませんのでご了承ください。


2014/05/20 : v0.9.1 リリース。1 フレーム内の遷移回数制限追加など

2014年5月13日火曜日

[Unity]iTweenでパスの編集を便利にする

Unity で手軽にパス移動できるアセットとして、iTween とそのパスをエディタ上で編集できる iTweenPath は広く知られています。

が、iTweenPath は中間点の挿入/削除パス全体の平行移動/回転/拡大縮小が実質ほぼ不可能で調整がかなり厳しいので、できるやつを書きました。

WayPoint for iTween (GitHub)


使い方はざっくりと、
  1. iTween を入れる。iTweenPath は不要
  2. WayPointPath.cs をつけたオブジェクトを親にする。pathName を適当に決める
  3. WayPoint.cs をつけたオブジェクトを子にする。親の head をこのオブジェクトにする
  4. WayPoint.cs をつけたオブジェクトを複製する。さきほどのオブジェクトの next をこのオブジェクトにする
  5. パス移動は WayPointAgentSample.cs を参考に
です。

エディタ拡張まで作りこんでいないので最初の手動連結はちょっと面倒ですが、あとで楽になると思います。

…iTween も結構クセが強くて、使い込むと色々ハマるので、そのあたりも気が向いたら書こうかなあと。

2014年5月6日火曜日

[OculusRift]Nekolus : バーチャルリアリティで猫と遊ぶ

OculusRift で猫と遊べる、Nekolus (ねこらす) を公開しています。




  • 気ままに歩き回ったり
  • ボールを投げると拾ってきたり
  • 猫じゃらしにむらがったり
  • 増えたり
します。

マンション住まいだったり、仕事で日中世話できなかったり、好きなのに猫アレルギーだったりしても大丈夫!

手軽にプレイできるようにということで、どこにでもあるマウス操作です。といってもクリックだけでポインタは不要。またはキーボードでも可です。


クレジット

[モデル]
Cu Cat (Ts-Time)
Free Furniture Props (Vertex Studio)
Round Carpet (Olof Hagelin)
Speeping bed (Vertex Studio)

[BGM]
Ferne Welt (Piro 氏) [neko]

[SE]
フリー素材 -SpiderWorks-  [猫1, 猫2]

[ツール]
Unity  (ユニティ・テクノロジーズ)
VRGUI  (boone188)


2014/05/06 : 動画追加、クレジット追加
2014/06/09 : クレジット追加
2014/07/12 : Oculus VR Share のリンク追加
2014/07/17 : Oculus VR Share 上でのタイトルを "Nekolus - Cats in the Rift" に変更したことに伴い、リンク先 URL 変更
2014/08/03 : DK2 暫定対応版
2014/10/10 : DK2 対応版