C#でEventManager作った

 

作った

そこらじゅうにActionを置くのと、どこからどの機能がコールバック発火して飛んでるのかわからんのが地獄すぎたので作成

GameManagerとかのMono非継承のstaticインスタンスあたりでnewすればUnityでも使えるよ

 

gistec74e89d9f146dd88d1959f3538fc2de

 

いい結果

Actionの宣言の大幅な削減に成功(keyに置き換わった)

EventManagerを全て経由するので、コールバックフローがLogで可視化できる

keyとAddEventとRemoveEventをBaseクラスにロジックとして仕込むことでRemove忘れのnull参照回避ができる

それぞれのActionに対して参照を得る必要がなくなった(最高)

 

悪い結果

keyが多い

引数ないのでカスタマイズ性がない

他の人がこれ使わないでAction追加してキレた

 

まとめ

総合的に見ると結構使いやすい

オーバーヘッドとオブジェクト志向の関係上大型プロジェクトには向かない

 

おわり。

C#のプロパティでスタックオーバーフローする話

 

最近

 

「プロパティの書き方わからない」

「書いたけどなんかアプリ落ちる」

「理由がわからない」

 

と、ジェットストリームアタックを受けたので

一人でも悲しみを減らし、僕の時間も増やすためにバッドノウハウを残します

 

コード

 

まずはこちらをごらんください

gist67a556915426e4d8e9a9f1a7ba4102be

 

一番上

もっとも短縮された形です

変数宣言とgetsetを同時に行っているので、適当にアクセス制限かける時に使えます

セッターをアクセス指定してよく使います

 

真ん中

動きません、アプリが即死します

なんでかというと、「プロパティの中でプロパティを参照する」からです

そのまま無限にプロパティを参照し続けてループします

C#初心者が必ずハマって死ぬのでここを見つけてくれることを祈ります

 

一番下

真ん中の正常に動くように書き直した形です

変数を宣言し、その変数に対してプロパティを作成しています

セッターにコールバックを仕込みたい!など

ロジックを組み込むときはこの形にしましょう

 

終わり

VRZONE-Project i Can-へ行ってきたレポ

おはようございます、こんにちは、こんばんは、初めまして

かせです、ゲーム作ったりしてます

 

さて、巷で最近話題のVRですが、VRZONEなるものが有料でVRアトラクションを展示しているということを聞き、予約を(友人に丸投げ)して自分含めて3人で行ってまいりました

project-ican.com

体験した中から抜粋して、以下レポです

f:id:yutakaseda3216:20160606095053j:plain

入場

予約制のため、入退場に5分ずつの時間が設けられており体験時間は入退場含めて1時間30分

全ては体験できないかなと思っていましたが、思ったよりも人は少なくスムーズに入場できました

 

見た感じだと20人いないくらいだったかな?と思います

 

アトラクションはバナパスポートでの支払いのみ対応とのことで、カードを購入してお金をチャージしました

バナパスポート持ってなかったので300円の+出費)

 

その後アテンドさんの諸注意などの説明を受け入場

すぐそばにロッカーがあり(無料)、荷物を預けることもできたので身軽に体験できるよう配慮されていました

 

さらっと見回しましたが、デバイスは基本的にHTCViveとViveコントローラでした

 

脱出病棟Ω

f:id:yutakaseda3216:20160606095445j:plainf:id:yutakaseda3216:20160606180727j:plain

一番最初に体験したのはこれ、ホラーアトラクションです

 

 

自分は体験時間12分というのが一番最初に気になりました

VRコンテンツを制作したことのある方なら「割と長いな〜」と思うのではないでしょうか

 

次に気になったのが2〜4人で体験できるということだったのですが、マイクを使ってボイスチャットをしながら一緒にゲームができるということらしいです

しかも他の人と協力して何か謎を解いたりして脱出しないといけない!(誰か一人が死んでしまう、時間制限を越えると全員ゲームオーバー)

 

アテンドさんに従って、実際にプレイを始める前に名前とアバター(男性か女性か)をタッチパネルで入力してからViveをかぶってゲームを開始

自分は車椅子に座っていて、周りを見回すと友人たちのアバターが車椅子に座っている

 

・・・だけならよかったんですが、既に血まみれの死体っぽい何かが転がってる

いやもう怖いんですけど・・・

 

友人も「スゲェ!スゲェ!」と壊れたテープレコーダーのように繰り返すばかり、僕も半笑いになりながら車椅子を進めました

 

ゆっくり車椅子が進んで、3人で並んで進む・・・

と思いきや全員が違う道へ分かれる

 

登録順で体験が変わります

とは言われていたのですが、そういうことかー!

一人で進むのは非常に怖く、進むたびに何かが飛び出してきたり椅子が揺れたり訳のわからないモノに追いかけられたり(ホラーでネタバレはあれかなと思うので伏せます)

 

ホラーに耐性があって、叫んだりしたところを見たことがない友人が叫びました。 

 

他にもいろいろなゲーム要素があり、とても完成度が高かったと思います

特に全員で協力してゴールまでたどり着く、と言う部分でソーシャル感の高いVRコンテンツとしてとても良いものでした

日本でここまで完成度の高い多人数VRコンテンツをやったことがない・・・

ぜひ体験して、叫んでみてください

 

アーガイルシフト

f:id:yutakaseda3216:20160606180925j:plainf:id:yutakaseda3216:20160606181216j:plain

 

女の子が可愛いので神コンテンツです、いい仕事したぞ原田

 

視点で照準を動かすタイプのVRシューティングゲームで、コックピットを模した席に座って操縦桿を握ります

それだけでオタクな育ち方をしてきた自分は高まったのですが、ゲームが開始すると女の子が急に目の前に

おっぱいが目の前に

過度な露出が目の前に

尊い・・・

 

周りを見回すと自分が操縦席に座っていて、周りが格納庫、いわゆるハンガーなのがわかります

そして隣にはさっきのおっぱパートナーの女の子がいて自己紹介をしてくれました

名前は忘れた

 

どうやらこれからこの操縦席ごとロボに乗り込んで発進するみたい

と思っていると、発進シークエンスへ

 

席がガッタンガッタン揺れて

ロボが目の前にいて

高まる

 

ロボに乗り込むと視界が真っ暗に、わちゃわちゃと起動シークエンスのUIが表示され視界が開けます

そしてそのままハンガー下部のハッチが開いて投下されます

周りのロボがどんどん投下されて自分の番が怖い

 

パートナーの子は操縦席で頭をぶつけてるし可愛いとか思ってたら、投下され、浮遊感

席が揺れ、本当に浮いてる感じがしたんです・・・

 

そのまま空中で空を飛ぶ、気持ちいい

感動・・・これは文字だと表しきれないです

 

そんな感動に包まれていた中、前方の機体が突然爆発。襲撃のアラートが

てんやわんやで操縦桿のトリガーを引いて照準を合わせて現れた敵ロボを倒す倒す

何が起きてるかわからん!けど楽しい!

 

 と、現れる敵機をバッサバッサとなぎ倒し(割と撃ち漏らしはしている)

最後に敵拠点を破壊するミッションへ

 

首を振り敵の妨害をうまく避け、拠点に攻撃を打ち込むという内容でした

クリアしてやりましたよ、やったぜ

 

そして、エンディング、to be continued...

続きが気になる・・・!

 

と全体的に夢を叶えられる内容で大満足

完成度も非常に高く、動く割に全く酔わない!ので

ぜひ体験してほしいですね

 

ただ改善してほしい点もちらほらと。

 

・視点で照準を動かすシステム

やはり疲れます(自分でVRSTGを作った時も思った)

短時間はまだいいんですが・・・長時間のプレイには絶対に向かないので何がしかの対策がいりそう

個人で対策をした時はレティクルをかなり大きくして、レティクル内の敵にオート追尾して当たるようにしました(レティクルから外れても照準内で撃った弾は追尾して当たる)

首の動きが少ないので比較的楽です

 

・敵に撃たれる弾を避ける方法がわかりづらい

これは湧いてくる敵に感じました、あるいは避けられないようになっていたのかもしれませんが・・・

3D空間上で自分に向かってくる弾を視認して避けるのって非常に難しいんですよね

アラートを出して、避ける方向も示唆してあげないと多分無理かなと思います

 

・最後のミッションで、いきなり視点を動かして避けるというシステムになる

これは他の体験された方も言っていましたが、突然システムが変わるのでわかりづらいです

直前に説明があれば変わったと思います

 

一人用なので色々見れました

これだけ良い(悪いところとかひねり出さないとないレベル)コンテンツなので、次回作ではもっと良くなることを期待しています

 

 高所恐怖SHOW

f:id:yutakaseda3216:20160606185938j:plain

 

体験する前は別に大丈夫やろ、なんか皆足震えたわーとか言ってるけど大丈夫やろ

って思ってました

 

いやほんと足震える

 

体験の内容は、エレベーターで超高層へ上がり、細い板の先にいる猫を抱えて戻ってくるというもの

見た目はこんな感じ

f:id:yutakaseda3216:20160606190220j:plain

 

Viveを被って、手の甲にモーションセンサーを付け、クロックスにモーションセンサーがついたものに履き替えて、命綱をつけて体験します

センサーがあるので手と足を動かすとVR空間内でもちゃんと認識して動きます

 

そしてこの板、揺れるようになってるんですね、少しバランス崩すとカタカタ揺れます

恐る恐る板を渡って、猫を掴むとVR空間内の板が少し割れて落ちます

 

「やめろや!」

叫びました。リタイアを本気で考えました

 

やめるわけにはいかないと思い(友人は二人ともクリアしていた)

ゆっっっっっくり振り向いて帰りました

 

無事生還し、親猫がお出迎えしてくれました

シンプルですが、超怖かったです

 

自分はVRコンテンツを開発していることもあり(OcuFesとかも参加してた)んですが、今まで体験した中で文句なしで一番没入感が高かったです

 

導入でまずエレベーターホールからエレベーターに乗り込むという段階で前に歩き、実際に手と足がついてくることでVR空間を見ているという感覚を無くさせる

板が少し揺れることで本当に下に床はないんだと錯覚する

3Dサウンドでさらに没入感を高める

 

非常にクオリティが高く、素晴らしいと思います

 

VRZONE予約してて楽しみです!という人は絶対にやってみてください

ただ本当に怖いので高いところが苦手な人はオススメしません

 

最後に

抜粋して3つレポしましたが、他のコンテンツも素晴らしいものばかりでした

実際に体験してみてほしいと思います

 

今まで自分は「日本のコンテンツ海外に負けてるよなー、資金面とかでも仕方ないのかなー」とか思ってたんですが印象がまるっきり変わりました

 

今後のGoogleが提供するDaydreamや、PSVR。日本展開が本格的に始まったViveなど・・・

ムーブメントが起きてきたなと思っていて、今後がとても楽しみです!

自分も何か作っていきたいなーと熱が上がりました

 

素人文で長々と書きましたが、最後まで読んでくれた方

ありがとうございました

アデリーペンギンについて

※開発には全く関係ありません

 

皆さんはアデリーペンギンという動物を知っていますか?

とても愛らしい目が特徴の鳥類ペンギン目ペンギン科アデリーペンギン属の一種です。

アデレーペンギンとも呼ばれています。

このペンギンを一目見てから私は心を奪われてしまいました。

まずはこちらの画像をご覧ください。

f:id:yutakaseda3216:20160210104610j:plain

アデリーペンギンです。

艶やかですね。

このような外見をしています。

一緒に暮らしたいですね。

 

生態

アデリーペンギンの生態について紹介します。

このペンギンは南極大陸で繁殖します。

 

南極大陸で繁殖できるのはなんと

皇帝ペンギンアデリーペンギンだけです 。

つまりお姫様なわけです。

可愛いですね。

 

体長は50-70cmくらい、体重は5kgほど。

もてもてと太っているように見えて痩せ型です。

 

これが南極でペタペタと何万匹も歩いているわけです。

飛び込みたいですね。

 

全身が羽毛で覆われていて、寒さに適応した形になっています。

もふりたいですね。

 

成長するときはこのように成長します。

f:id:yutakaseda3216:20160210105800p:plain

最初の方は特徴的な目もともそれほど目立ちません。

成長してくると、目の周りに白いラインの羽毛が生えてきます。

それがあの可愛らしい顔のワンポイントになるわけです。

ひなの状態では、親がとってきた魚を口移しで食べます。

そして、成長して羽毛が生え変わると海に入っていくのです。

 

さて、このようなアデリーペンギンですが

地球温暖化の影響で数を減らしています。

由々しき事態です・・・。

 

そういうことなので皆さんも環境には気を向けていきましょう。 

 

ただ私が言いたいことは一つです。

アデリーペンギンは可愛い

f:id:yutakaseda3216:20160210110437j:plain

終わり

Swiftでカメラで撮ったUIImageをいじった

SwiftのAVFoundation

を使ってカメラで撮った写真を加工する必要があって、いろいろいじっていた

らなぜかうまくいかず、画像が回転したりした

なんでなん

カメラを使って保存したUIImageは向きに応じて自動で回転したり補正される

けど、加工する時CGImageに直すと補正がかかってないからいじるとおかしくなる

詳しい人原因求む

かなり強引に直した

image = UIImage(CGImage:image.CGImage!,scale:1.0,orientation:UIImageOrientation.LeftMirrored)

 

UIGraphicsBeginImageContext(size)

pngImage.drawInRect(CGRectMake(0, 0, size.width, size.height))

pngImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

 

カメラからCaputureしたimageをLeftMirroredで回転

CGRect型のSize(中身はimage.size.widthとかから取得)を指定して強引に元のサイズに戻す

 

もっといい方法があるはずなので模索して追記予定

終わり

UnityのRemoteProfilerを使おう

RemoteProfilerとは

実機上で動作しているUnityアプリケーションの動作状態をEditor上のProfilerで確認出来る

logcat使うよりグラフィカルに見れて割と便利なのでまとめておく

準備

ビルドするときにDevelopmentBuildとAutoconnect Profilerにチェックを入れる

自動ビルドしてると入れそこねてたりする(した)

コード上で書く場合は

BuildOptions opt |= BuildOptions.Development|BuildOptions.ConnectWithProfiler;

とかで指定してBuildPipelineに渡しましょう

 

iOS

iOSはめっちゃ楽です

  1. 実機にipa入れる
  2. PCとUSB接続してアプリ起動
  3. PlatformをiOSにSwitch
  4. Editor上でProfilerタブを開く
  5. Profilerタブの上の方にあるActiveProfilerを開き、端末名を選択する

Android

ちょっとめんどい

  1. 実機にapk入れる
  2. Unityを終了させる(USB接続をUnity起動後にやると認識しない)
  3. PCとUSB接続してアプリ起動
  4. ターミナル起動してadbにパスを通し下記を入力

    adb forward tcp:54999 localabstract:Unity-[bundle]

    [bundle]部分は設定したBundleIdentifier

  5. Unity起動してPlatformをAndroidにSwitch
  6. Profilerタブを開く
  7. Profilerタブの上の方にあるActiveProfilerを開きAndroidPlayerを選択

Unity起動してBuild&Runしても動作しなくて詰まってたら再起動しないと認識しないとか聞いてない(´Д` )

上記で確実に動くはずです

 

終わり

 

                 

UnityEngine.VRについて

UnityEngine.VR

公式でVRがサポートされるようになってから追加された名前空間

割と使うなっていうモノがそろってたのでまとめる

unity5.1.3f1での情報です

 

VRNode

LeftEye,RightEye,CenterEye,Headの4種類がある列挙体

Transformなどを取得する際に必要になる

  • LeftEye

その名の通り左目のノード

  • RightEye

その名の通りry

  • CenterEye

右目と左目の真ん中のノード

  • Head

頭らしい、これはちょっと謎です

 

VRDeviceType

OculusやMorpheusなどの情報が格納されている

何が接続されているかのチェックなどに使用できる

 

InputTracking

  • GetLocalPosition(VRNode)

Nodeで指定した部位のPositionをLocalに変換してVector3で返す

ゲームを作るだけなら大体カメラのポジションとるだけで事足りる・・・( 一一)

  • GetLocalRotation(VRNode)

Nodeで指定した部位のRotationをLocalに変換してQuaternionで返す

オブジェクトの位置補正をしたりするのに使う可能性もあるかも

  • Recenter()

現在の位置をセンターとしてトラッキング位置を初期化する

めっちゃ使う

 

VRDevice

  • GetNativePtr()

VRデバイスシステムのポインタ(IntPtr)を取得する

まず使わないけど自分でVRデバイスシステムをカスタムしたいウィザード級の人向け

  • family

loadされているVRデバイスの名前、string

ロードされているデバイスが一つじゃなかったとき複数返ってくる

複数デバイス持ってないのでどう返ってくるかは検証できない、だれかしてください

  • isPresent

正常にデバイスが動作しているかの真偽値

正常に動作してなかったら再ロードしたりするときに使う

  • model

ロードされてるVRデバイスのモデル名、らしい

あとで調べて追記予定

 

VRSettings

これ便利です

  • enabled

VRデバイスに画面を出力するかどうかの設定

これを使えばゲーム中にHMDを外させたりつけさせたりする事が出来る

ただ、trueからfalseにしたときHMD側に出力されていた映像がそのまま出力され続けてしまう(更新が止まるだけ)

  • loadedDevice

VRdeviceTypeをセットすることで強制的にそのデバイスをロードする事が出来る

逆に今ロードされているデバイスのタイプも取得可能

上記の映像がそのまま出力され続ける状態を回避するために

loadedDeviceにVRDeviceType.Noneをセットすることで映像を消せるんじゃないか??

試します・・・

  • renderScale

いじるとトラッキングの制度が下がるがテクセルとピクセルの比率を変えられる

わからなければいじらない方がいい

  • showDeviceView

メインディスプレイ上にHMDで表示されている画面をミラーリングするかの真偽値

左目の画面しかミラーリングされない

 

おわり

参考

Unity - スクリプトリファレンス: