2016年12月31日土曜日

今年1年お世話になりました。

まずは今年の反省。。。

当ブログ更新が放置状態(^_^;) 代わりに今までアカウントだけで利用していなかったTwitterがアクティブ化してました。

Twitterだと投稿後、直ぐにレスポンスがあるし意見交流もできるので一方通行にならず、書き込みが続きますね。

しかし、文字数制限で伝えたい事が伝わらないもどかしさや情報が一時的にしか残らないメディアなんで、ブログとの併用は続きそうです。
 └ブログは残したい記事をまとめる感じになるのかな。。。

あと、今年は8月頃にVRに興味を持ち、9月にはゲーミングPCとOculusRiftを手に入れ、10月にはPlaystationVR、12月にはOculusTouchと後半はVR一色になってました。

今もOculusRift用ゲームアプリをリリースすべくUnity3Dでゲーム開発中です。

特にUnity3Dは今まで使ってこなかった事を猛烈に後悔する程に進化してて超便利で素晴らしいツールなんで、今後はゲームアプリについては2D,3D関わらず全てUnity3Dで開発する事になりそうです。

最後になりましたが、今年1年お世話になりました。 来年もよろしく~


では、良いお年を。

2016年10月5日水曜日

Xcode8:'undeclared selector' warning対応

<ワーニング内容>

  • 下記例のように別クラス内のセレクタメソッドを呼び出すコーディングでセレクター名が見つからない場合に発生するコンパイラWarning。
  • // warningエラー発生例
    - (IBAction)togglePreferences:(id)sender
    {
        // Setting画面へ切り替え
        [_canvasScene.layerCanvasMenu performSelector:@selector(tappedSettingButton:) withObject:nil];
    }
    

<対応方法>

  1. コンパイラオプションで無効化
    ・当Warningが大きなお世話であればコンパイラオプションで全体的に無効化する事は可能。
    └ 飛び先不明をコンパイル時にチェック出来る意味が無くなる。
  2. 当Warningをコード回避
    // warningエラー回避コーディング
    - (IBAction)togglePreferences:(id)sender
    {
        // Setting画面へ切り替え
    //    [_canvasScene.layerCanvasMenu performSelector:@selector(tappedSettingButton:) withObject:nil];
        SEL selector = sel_registerName("tappedSettingButton:");
        [_canvasScene.layerCanvasMenu performSelector:selector withObject:nil];
    }
    
    ・一旦、sel_registerName関数でセレクタ変数化して指定する事でWarningチェックを回避。
    └ セレクタ名のタイプミスに対応できない。
  3. 外部参照セレクタをヘッダーファイル定義
    ・呼び出し先クラスのヘッダファイル(上記例:layerCanvasMenu.h)内に外部からの参照(呼び出し)を許可するセレクタメソッドをカテゴリ機能を用いて宣言する。
  4. // ----- 外部参照セレクタ宣言 --------------------------------------------------------------------------
    @interface CanvasMenuLayer(external_selector)
    - (void)tappedSettingButton:(id)sender;
    @end

<所感>

  • セレクタ指定呼び出しでセレクタが存在しない実行時エラーをコンパイル時にチェックできるのはありがたい機能。
    └ エディタのコードアシスト機能でタイプミスも少ないけど、コンパイル時チェックは可能なら実施すべき。
  • 上記「対応方法」として3種類あげていますが、本来のコンパイル時チェックの意味からすると3番めのヘッダーファイル定義での対応方法が良いと思います。


ではまた〜

2016年10月4日火曜日

macOS Sierra非互換:「表示」メニューに「タブバーを表示」項目が自動的に追加される(非表示化対応)

<非互換項目>

  • アプリメニューに「表示」メニューが存在すると自動的に「タブバーを表示」項目が追加表示される。


<状況・対応方法>

  • Sierra用にビルドしただけで自動的に「タブバーを表示」項目が追加され、選択するとタブ表示される機能が実装されています。
  • ゲームアプリですので当然ながら複数ドキュメント画面を開く様な機能はありませんので、「タブバーを表示」項目は表示して欲しくない。
  • 画面インタフェース定義ファイル(xibファイル)とかInfo.plist設定に「タブバーを表示」自動追加を無効化できるプロパティが無いか調べましたが、それらしい設定項目は発見できず。(xibファイルに設定あり:「追記」参照)
  • いろいろと調査した結果、下記のコード対応で「タブバーを表示」項目の自動追加を無効化する事が出来ました。(アプリ起動後の初期処理内にコード記述)


    // メニュー:タブバー非表示
    if ([NSWindow respondsToSelector:@selector(allowsAutomaticWindowTabbing)]) {
        NSWindow.allowsAutomaticWindowTabbing = NO;
    }


<追記>

  • 上記タブバー非表示のコード内容からNSWindowクラスのプロパティっぽかったので、xibエディタでWindowプロパティを再度確認すると「Tabbing Mode」があり、初期値は「Automatic」になっています。
  • 多分、この設定を変えればコード記述ではなく設定で変更可能と思われますが、Sierra以前のmacOSへの対応のため今回はコード記述にて対応しました。
xibファイル:Window設定

ではまた〜

2016年9月12日月曜日

Oculus Rift:10日間使ってみた所感

バーチャルリアリティ体験としては新鮮な「驚き」を感じる事が出来ますし、一人称視点のジェットコースターやレースゲームでは開始1分で『酔い』を感じる程です。(^◇^;)

実際の乗り物(船以外)では一度も酔った事が無いのですが、VRでは一瞬で気持ち悪くなる感じを体感できるので、そう言う意味では素晴らしい再現性と没入感を得られてはいるのだと思います。
└VRでは視覚情報と体が感じる加速度等の情報に不整合を感じ『脳』が混乱して酔いを感じるって解説もありました。

しかし、VRコンテンツに慣れるに従って細かい点が気になってきました。 特に実写VR動画では画像が全体的にボヤけていたり、輪郭がハッキリしない箇所も目に付きます。 これはゴーグル内のレンズと眼球の位置が近いために発生する『スクリーンドアエフェクト(網戸効果)』って言う現象によるものかも知れませんが、個人的には視野角を110°に広げているために相対的な解像度が低くなっているように思えました。

現時点で一般個人が入手可能な程度のゲーミングPC(グラボ性能)では完全なVR映像を表示するにはまだまだスペックが足りていないんだと思います。
あと5年程経ってグラボ性能が今より5〜10倍程向上し、Oculus Riftの解像度も4倍向上すれば本当の意味でのVR体験が可能になるのではないかと思います。 そう言う意味ではまだまだ発展途上の技術なんだと言えそうです。

そういう時代が来ればVR技術はVR映像視聴やVRゲームだけではなく、本格的なシミュレーション環境として航空・医療等の分野でも利用される様になっていくと思います。 あとはその時までに使い手のアクションを正確に伝える事のできるポインティングデバイスも揃っていれば理想でしょうね。

来月(10月13日)にはPlayStation VRも発売されます。 昔PlayStation2の発売を契機にBlu-rayディスクが普及したようにPSVR発売で一気にVRが普及し一般化する可能性もありますし、少なくともVRコンテンツは急速に増えるでしょうから今年末から来年に掛けてどれだけVRが浸透して行くのか楽しみであり興味深いですね〜。

とは言え、一式揃えるにはそこそこ費用も掛かる上にプレイエリアの確保やVR開始前準備に手間が掛かるしで、3Dコンテンツよりも敷居が高いのも事実なので一般普及には起爆剤となるようなキラーコンテンツが必要かな。(多分、エロい奴w)

まだVR歴10日程度なのでこれからもVR動向を追っていきたいと思います。

ではまた〜


2016年9月7日水曜日

Oculus Rift:メガネ組み込み加工

Oculus Rift使い始めて一番最初に困ったのがメガネを掛けた状態での装着でした。

購入前にネットでHMD情報を集めた限りではメガネを掛けたままRiftを被れるって記事が多かったと思いましたが、実際にはメガネを掛けた状態での利用は厳しいものがあります。
まず、メガネ正面の幅が14cm以上あるとそもそもRiftゴーグル内に入りませんので、装着自体が困難です。(^_^;)

無理からメガネを押し込んでもゴーグル部分が顔から離れるためか、鼻との隙間から光が入ってきて折角の没入感が削がれて快適とは言えませんし、それよりもメガネの圧迫により鼻が痛くなって長時間の利用も難しいです。
仕方ないのでメガネを止めてコンタクトレンズで利用すれば装着感は最高なのですが、Riftゴーグル内のレンズに目が近づいた状態になるためか、目がかなり疲れます。
  └コンタクトレンズだと老眼気味になり、近く物が見え辛い体質のせい。(歳は取りたくないものですね〜)

そこで、Riftゴーグル内にメガネ自体を組み込んでしまえば使い勝手が良くなるのではとの考えを実践してみる事に。

まずはネットで情報集めをしたところ、同じ悩みを持つ人が多いみたいでいろんな解決策が見つかりました。
特にレンズアダプタを用意して矯正レンズを嵌めたものをゴーグル内に嵌める方法は理想的な解決策と思えましたが、現在進行形のキックスタータープロジェクトで日本から申し込むのも敷居が高そうですし時間も掛かりそうでしたので、今回は見送り。

次にスキューバダイビングとかで使用する水中マスクに度付きレンズを嵌めるフレキシブルなフレームを使う方法が良さ気だったのですが、残念なことに私に合う度数のレンズは扱っていないみたいで却下。

万策尽きてw、結局以下の手順でRiftゴーグル内にメガネを嵌め込む事に成功しました。

①メガネ自体は改造するので安いメガネを購入。(ネット通販で2,700円でした:安過ぎて驚き)
・横幅が狭く(13cm位)でレンズ面積が広いメガネフレームを選択。

②メガネから柄の部分を外す。(ネジを外して分解)

③スポンジゴムを2個切り出す(縦横厚:4×2×1cm)
・加工したメガネフレームはゴーグル内に挟み込んでスポンジ素材の弾性だけで留めるので、やや弾力が強い素材が良いと思います。私はホームセンターの資材コーナーで「NRスポンジゴム」っていうのを購入しました。(価格:285円)

④メガネフレームの側面へ両面テープで貼る

⑤Riftゴーグル内に嵌める
・この時、Riftゴーグル内のレンズとメガネのレンズが擦り合わない様に間隔を開ける。(レンスの傷防止)

如何でしょうか。 結構簡単な工作ですし、Rift本体へは一切加工していないので安全だと思います。

あと、Riftゴーグル内のメガネの位置ですが結構適当でも大丈夫です。
意図した仕組みではないのですが、ゴーグルを装着して押し込んだ時にメガネフレームの鼻当て部分が自身の鼻に当たることで自動的に最適な位置に調整されます。

メガネ代込みで約3,000円で実現できましたので、結構満足しています。

以上

バーチャルリアリティ:「Oculus Rift」購入しました

今年はバーチャルリアリティ元年と記憶される年になると思います。

ハイエンド向けHMDとして「Oculus Rift」,「HTC Vive」製品版がリリースされましたし、コンシューマ向けには「PlayStation VR」も販売されます。
これでVR環境が一気に揃い、本格的なVRコンテンツも増えてくると思います。
└ローエンド向けではスマホVRも安価で体験できる様になりましたね。

取り敢えず、VR体験したくて上画像のような安価なHMDアタッチメントも購入していましたが、VRゲーム開発を見据えて本格的なHMDが欲しくなり、結果として「Oculus Rift」の購入に至りました。

「Oculus Rift」プレオーダー組は出荷が数ヶ月遅れたりで、潤沢に供給できていないと思っていましたが、現在では改善しているようですね。
私は8/27にOculusホームページで直接オーダーしたのですが、8/29出荷→9/2には手元に到着しました。 多分、最短での配送だったと思います。
  └Tips:荷物のトラッキング番号はFedExで追跡できました。
     (Oculus購入履歴ページには配送業者記載が無い)

価格は8月末まで送料無料でしたので、Rift本体価格:¥83,800円でした。
しかし、HMDのみでは機能せず、高機能・高速なグラフィックボード搭載のゲーミングPCが別途必要になります。
VR用にゲーミングPCも新調しましたので、PCが16万円でしたので、HMDと合わせて約25万円の出費となりました。(^^ゞ

<同梱物>

コントローラとしてXbox用のゲームコントローラが入っている事に違和感を感じる人もいるかと思いますが、Oculusの専用ポインティングデバイス(Oculus Touch)はまだ発売になっておらず、今年中の販売(別売)が発表されています。

取り敢えずはここまで。

2016年6月8日水曜日

iOS非互換:'AudioSessionGetProperty' is deprecated: first deprecated in iOS 7.0

<非互換項目>

  • iOS7.0非推奨:'AudioSessionGetProperty'

<コード対応>

// 再生中オーディオ有無取得
UInt32 otherAudioPlaying;
UInt32 propertySize = sizeof(otherAudioPlaying);
  
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying,
       &propertySize,
       &otherAudioPlaying);

// 再生中オーディオ有無取得
BOOL theOtherAudioPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying];

<対応方法>

  • 上記コード例の通り、該当箇所を書き換える。


<所感>

  • 分かり易くなって良い変更。

以上

2016年1月1日金曜日

2016年 謹賀新年!

2016年 明けましておめでとうございます。

旧年中はいろいろとお世話になりました。
本年も変わらぬご支援・ご鞭撻の程よろしくお願い申し上げます。

新年お決まりの今年の抱負を。。。

1.SWIFT言語への移行
 ・新しいことへの挑戦もありますが、現行のObjective C言語の今後を考えるとSwift言語も使える様に
  なっておかないとAppleが急にObjective C言語をサポート外にする事も有り得ない事ではありませ
  んから。。。
  └知っている人や覚えている人は少ないかも知れませんが、初期はアップル開発にJava言語が使え
   たんですよね〜 それがいきなりサポート外になってしまった過去があります。

2.iPad Pro専用アプリ開発
 ・昨年、iPad Proを購入しましたので、Apple Pencil等の固有機能を利用した専用アプリを作成できれ
  ばと考えております。
  └良いアイディアが浮かんでいないのが問題なんですが。。。(^^ゞ


以上、本年もよろしく〜