akyboxブログ

旧AkiIroブログ

Unityでちょっとした初期化などを事前に行う

インスペクタから変更できないSerializeを行う。

Monobehaviorを継承したクラスで、[SerializeField]アトリビュートをつけると、シリアライズできるのは良いのですが、 初めに参照を設定したら後はインスペクタから変更できないようにしておきたい場合もあると思います。 そんな時の対処法の一つです。

void Awake()より早く設定できることや、実行時に(極小ですが)GetConponentしない分有利です。(当然かわりにシリアライズ分のデータはかかるとして)

方針

  • [SerializeField,HideInspector]アトリビュートシリアライズできるけどインスペクタからは見えないメンバをつくっておく。
  • void Reset()によってアタッチした瞬間に参照関係を設定
  • おまけにvoid Awake()に一応Assertを入れてあげる

まずはコード

たとえば同オブジェクトにアタッチされたカメラを取得するなら次のようなコードになります。

using UnityEngine;

public class CameraController : MonoBehaviour {

    [SerializeField,HideInInspector]
    Camera camera_;

    void Reset () {
        camera_ = this.GetComponent<Camera>();
    }
    
    void Awake () {
        Debug.Assert(camera_ != null);
    }
//以下適当なコード
}

ちなみにアタッチするとこんな感じになります。

f:id:AkiIro:20160916034112p:plain

[SerializeField]や[HideInspector]について

アトリビュート全般に関してはテラシュールブログ様がとてもわかりやすい記事をくださっています。 ここで重要なのは

  • [SerializeField]でメンバはシリアライズできる
  • [HideInspector]でメンバはインスペクタ上からは見えなくなる

以上の二点です。

void Reset()について

公式のリファレンスに素晴らしく簡潔にわかりやすく記述してくださっています。 ここで重要なのは

  • void Reset()はエディタ上でスクリプトをオブジェクトにアタッチした際に呼ばれる。

という一点です。

Assertについて

void Awake()内にAssertを書くことで、万が一うまくシリアライズできていない場合にエラーを出してわかるようにしておきます。 Assertは引数がfalseになるとエラーを出してくれて、かつリリース時にはコンパイルされません。(つまりデバッグ中だけ動作する。)

応用について

これを応用して簡易的に事前に計算できるものは事前に計算したりすることが可能です。

とても初歩的かつ地味な内容でしたが、お読みいただきありがとうございました。

Unityで360PanoramaCaptureを使って360度動画をつくってみた話

はじめに

筆者は360度動画からスタートしたので、まず360度動画って何よってところから下のサイトを参考にさせていただきました。 360度映像制作ガイド 今回は360PanoramaCaptureというアセットを使わせていただきました。無料、ありがたいです。 f:id:AkiIro:20160830220413p:plain 普通にUnity上でモデルを動かしてアニメーションをする場合と比べて、 360度動画にするメリットとデメリットを自分なりに列挙すると以下のような感じです。

メリット

  • ツールによってはアーティストが今まで使っていたものが使える(ex.Blender)
  • アーカイブ性が増す
  • 使いまわしやすい
  • ストリーミング可能(Unityでビルトイン対応はしていない)

デメリット

わかったこと

360度動画は普通の動画を曲げている

イメージとして360度動画では一枚の動画を曲げて球に貼り付けています。したがってユーザーから見える画面の画質は元の一枚の動画の画質に左右されます。 例えば元の動画の画質が4000×2000だとしても見えている部分が1/4なら画質は1000×500相当になるようで、画質が低くなりがちです。

Unity上だと再生にQuickTime(2016/8 現在Win版がない)が必要

Unityで真っ当にbuilt-inの機能で動画を再生するにはMovieTextureというものを使うのですが、これの使用にはQuickTimeというプログラムがインストールされている必要があります。現在、Windows版はありません。参考

やりかた

自分なりのやり方なので、他にやり方はたくさんあると思います。 一応このやり方で無料でできます。注意としてMovieTextureを使うためMacが必要です。自分はMacでビルドしてWindowsにOculusを繋いで見ました。今回はテーマから外れますが、作った動画はyoutubeに公開したりもできます。その際は公式のサポートを参考にしてください。 手順としては

  1. 360 Panorama Captureを使ってUnity上でキャプチャ(jpgかpngで出力)。そのあたりは付属のReadMeにしたがって行います。首尾よく大量の画像を手に入れたら次に進みます。
  2. 所望の方法で動画形式に。例えばムービーメーカーとかです。そのあたりはこちらを参考に。
  3. Unity上でMovieTextureを使って再生する。そのあたりはこちらを参考に。

一応作った動画をアップしておきます。 www.youtube.com

2016/09/09追記

黒い穴ができていたのでその解決法を、、 アスペクト比の問題のようなので公式のサポートを参考に 最高画質の4k(3840x2160)で作ったものがこちらになります。


【MMD】UnityでドーナツホールをVR化してみた【VR】

ちなみにこちらはffmpegを使いました。

初心者も初心者ですが参考になれば幸いです。