AYU MAX

プログラミングとか作ったもの

Center CLR Try!開発 #2に参加した

Center CLR Try!開発 #2に参加

先日行われた「Center CLR Try!開発 #2」に参加してきました。

場所は#1とは違う場所で金山駅の目の前でアクセスしやすかったです。 ただし目指すビルが工事中で入り口が見つけづらく数分迷いました。。。(方向音痴なので最初違うビルに行ってしまった)

当日の参加者は3名(MatsuiさんとMatsuokaさんと私)とすごい方お二人とご一緒で少し、いやかなり緊張しましたが、人数が少ないおかげで色々とお話もでき有意義な1日でした。

自分のやったこと

この日はもともと1日Unityで開発中のアプリ制作をやる予定でしたので、それをやりました。

自分の会社の部署の忘年会で使うための景品抽選アプリを作っています。

今までゲーム開発ツールはUnreal Engineをずっと使っていますが、Unityは未経験だったためUnityで今月始めからTryしてみました。 (* Unreal Engineはものすごーく使ってますが、ゲームは作ったことはありません)

ちなみに自分で設定した納期は11月末なので、期間は1ヶ月です。

もうちょっと詳細

UnityのUI機能(UnrealでいうところのUMG)を使って、忘年会参加者登録画面を作っていて、そこにスマホのカメラで撮った写真を登録する機能を作っていました。

カメラ撮影はOS依存のAPI使わなきゃいけなかったらイヤだなあと思っていたのですが、Unityの機能だけであっさりと実現可能!

(事前にアプリにカメラ使用のための許可確認をやってます)

// 実行デバイスに付属のカメラ(最初に複数ある場合は1個め)を取得
var cameraDevice = WebCamTexture.devices[0];

// カメラ映像を投影するテクスチャを作成
cameraTexture = new WebCamTexture(cameraDevice .name, 1280, 720);

// 撮影スタート
cameraTexture.Play();

// カメラ映像をUIに表示(taregetImageはUI上のRawImageの参照)
taregetImage.texture = cameraTexture;

上のコードを実行すると、UI上のRawImageにカメラ映像がリアルタイムで表示されます。 多分カメラ映像を毎フレームRawImageのテクスチャに転送してくれているのだと思います。

今回は静止画を保存したいので、UIのボタンが押されたタイミングで以下のコードを実行して画像データを保存しました。

// その時点でのカメラ画像のピクセルバッファを取得
Color32[] color32 = cameraTexture.GetPixels32();
// カメラ画像を表示するためのテクスチャを作成
var cameraImage = new Texture2D(cameraTexture.width, cameraTexture.height);
// テクスチャにピクセルバッファをコピー
cameraImage .SetPixels32(color32);
cameraImage .Apply();

// カメラの撮影を止める
cameraTexture.Stop();

これでcameraImageにカメラで撮影された画像がテクスチャとして入っているので、これをUIのRawImageに差し込むことで目的の機能が実現できました。

今日やった内容はここまでで、今後はこの取得した画像をサムネイル用に縮小、トリミングしたり、次回起動時にも使えるようにシリアライズしたりしたいと思ってます。

まとめ

  • Unityでスマホのカメラ画像をとれた
  • 少人数のイベントはすごい方とお話できて、とっても有意義
  • ILそろそろ読めるように1歩踏み出すかも