【Unity】VideoPlayerで 「video unsupported by hardware」のエラーが出た

UnityのVideoPlayerを何気なく使ったところ、エディタ上では動画が再生されるが、実機にビルドすると再生されない問題が出たときの対処方法です。

Codecを変更する

おそらく動画ファイルの設定が問題なのですが、何も考えずに動画をProjectへ入れると、CodecがAutoになっているはずです。 私の動画はmp4というファイル形式でしたので、ここをH264へ変更すると実機でも再生することができました。(iOSとAndorid共に変更)

f:id:albatrus:20210320123525p:plain:w400
CodecをH264に変更する

AAC videos encoded using H.264 or H.265

公式にも記載のあるように、AAC(mp4)はCodecを変更しないと再生できないみたいです。もし、実機で動画が再生できない場合にはまず動画ファイルのCodecを疑ってみるのが良いかもしれません。

docs.unity3d.com

Enumerable.Rangeを調べてみた

とあるListを作成したいときに通常なら次のようなコードを書くとします。

var lists = new List<int>();
for (int i = 0; i < 5; i++)
{
    lists.Add(i);
}

実はこのような記述はLinqを使うと次のように置き換えることができます。

var lists = Enumerable.Range(0, 5).Select(x => x).ToList();

Enumerable

EnumerableはLinqで定義をされている IEnumerableを継承したクラスで利用できる拡張メソッド郡です。 Enumerable クラス (System.Linq) | Microsoft Docs

IEnumerator とは

ここで登場するIEnumeratorとは何でしょうか? このインタフェースはListやDictionayで使われています。

何を定義しているか

IEnumerator で定義されているのは次のメソッドです。

IEnumerator GetEnumerator();

公式によるとこのメソッドは次のように説明されています。

指定した型のコレクションに対する単純な反復処理をサポートする列挙子を公開します。

IEnumerator

GetEnumeratorはIEnumeratorという型が戻り値として定義されています。 次のメソッドが定義されています。

public interface IEnumerator
{
    object Current { get; }

    bool MoveNext();

    void Reset();
}

【Unity】LayoutGroupについて

LayoutGroupについて

LayoutGroupのコンポーネント配下のGameObjectを自動的に配置します。 位置の調整や要素の大きさなど、LayoutGroupの設定項目に合わせてレイアウトします。

種類

LayoutGroupは次の3つ種類が用意されています。

  • Horizontal Layout Group (水平)
  • Vertical Layout Group (垂直)
  • Grid Layout Group (グリッド)

設定項目

Padding

要素の位置関係をPaddingで設定します。

  • Left
  • Right
  • Top
  • Bottom
  • Spacing

Child Alignment

要素の配置位置を設定します。

f:id:albatrus:20210307154114p:plain:w300
Upper Leftの場合
f:id:albatrus:20210307154038p:plain:w300
Middle Centerの場合

Reverse Arrangement

要素の並び順を逆転させます。

Control Child Size

自身のサイズとPaddingの設定に合わせて、要素のLayout Element大きさを変更します。 Layout Element - Unity マニュアル

Use Child Scale

要素のScaleを加味して位置や大きさを調整します。

f:id:albatrus:20210307153115p:plain:w300
Use Child Scaleを使わない場合、Scaleを無視して要素が配置される

f:id:albatrus:20210307153202p:plain:w300
Use Child Scaleを使わう場合、Scaleを加味して要素が配置される

Child Force Expand

要素をFlexible Sizeに合わせて変更を行います。 Flexible SizeとはLayoutGroupコンポーネントがアタッチされているGameObjectのwidthとHeightになります。

f:id:albatrus:20210307152728p:plain:w300
Child Force Expandを使わない場合、Preferred Sizeに要素が配置される

f:id:albatrus:20210307152835p:plain:w300
Child Force Expandを使った場合、Flexible Sizeに合わせて要素が配置されます

できること

実装例

実際にLayoutGroupを使った実装例を紹介します。

可変Textを加味してUIを並べる

次の2つのコンポーネントをアタッチします。 PaddingやChild Alignmentなどは好きなように設定をします。

f:id:albatrus:20210307155227p:plain:w350
Inspector

要素はImage、Text、Imageの順番に配置しています。 (ImageにはLayout ElementコンポーネントをアタッチしてMin Sizeを設定しています)

f:id:albatrus:20210307155320p:plain:w350
要素の配置

Textの文字数を変更しても要素の位置関係はそのままです。(画像ではわかりにくいですが...)

f:id:albatrus:20210307155617p:plain:w350
Textの文字を変えても、Imageの位置関係はそのままです。

パフォーマンス

公式にも書かれていますが、このLayoutGroupはパフォーマンスが良くありません。

自身のレイアウトをダーティとしてマークする UI 要素は、少なくとも GetComponents を 1 つ以上呼び出します。この呼び出しは、まずレイアウト要素から、親の有効なレイアウトグループを検索します。該当するレイアウトグループが見つかった場合は、検索を停止するか、ヒエラルキーのルート階層に到達するかのいずれか早い方で、ヒエラルキー内の Transform を上っていきます。したがって、各レイアウトグループは、それぞれの子レイアウト要素のダーティ化処理に GetComponents の呼び出しを 1 回追加することになり、ネスト化されたレイアウトグループのパフォーマンスを極度に悪化させます。

forpro.unity3d.jp

LayoutRebuilder.MarkLayoutForRebuild

LayoutGroupのコードを見てみると、このメソッドが重い処理のようです。 このメソッドは、OnRectTransformDimensionsChange、OnEnable時にも呼び出されているで、何かしらの更新があったときに、その都度UIの再構築処理が走るのが原因っぽいです。

最後に

処理は重いのは確かなのですが、複雑なUIが実装できるのがLayoutGroupの良いところです。 ですので、使わないと判断するよりも要所要所パフォーマンスを見て使っていくのが個人的には良いと思っています。 例えば3DゴリゴリのSceneでは利用を控えるとか、ほぼUIだけで構成されているのであれば必要に応じて使うなどです。 スマートフォンの性能も年々上がっているので、多少LayoutGroup使ってもそれほど全体のパフォーマンスには影響が出ないというのがこれまでの経験上あります。

【Unity】ContentSizeFitterについて調べてみた

UnityでUIを作っていくときに便利なコンポーネントがあります。 ContentSizeFitterと呼ばれる自動でUIのレイアウトを行ってくれます。 複雑なUIを組みたいときに、このContentSizeFitterを使えば専用のスクリプトを書くことなく実装ができる場合があります。

 

ContentSizeFitter

ContentSizeFitterはUIの横幅と縦の高さをコンテンツのサイズを自動調整してくれます。

使い方

Inspector上から「ContentSizeFitter」と検索をすればコンポーネントが表示されますので、これを必要なGameObject上に追加します。

f:id:albatrus:20210306143754p:plain:w300
InspectorからContentSizeFitterを検索する

設定項目があるのでこちらで必要なタイプを選択します。

f:id:albatrus:20210306144110p:plain
ContentSizeFitterのInspector上の見た目

設定項目

設定項目は2つ

  • Horizontal Fit : 横幅の設定
  • Vertical Fit : 縦の高さの設定

設定できるタイプは3つあります。

  • Unconstrained
  • Min Size
  • Preferred Size

Unconstrainedは特に何も行わないので説明は省きます。

Content Size Fitter - Unity マニュアル

Min Size

Min Sizeは該当のUIの最小サイズに拡縮させます。 普通UIを実装する場合、widthやHeightを触ることはあると思うのですが、最小サイズについては設定するところはないかと思います。 Min Sizeは「Layout Element」というコンポーネントを使って設定をします。

Layout Element - Unity マニュアル

もし「Layout Element」でMin Sizeを設定しなかった場合、ContentSizeFitterを設定するとサイズが0になってしまいますので注意をしてください。

f:id:albatrus:20210306151604p:plain:w300
Horizontal FitでMinSizeを設定した時(Layout ElementでMin Width設定済み)

Preferred Size

Preferred Sizeは該当のUIの推奨幅に拡縮させます。 Preferred SizeもLayout Element」というコンポーネントを使って設定できますが、Textの幅がPreferred Sizeに該当します。

f:id:albatrus:20210306152535p:plain:w200
HorizontalとVerticalをPreferred Sizeした場合

f:id:albatrus:20210306152711p:plain:w200
文字数に応じで幅が自動的に調整されます

仕組み

このContentSizeFitterはどうやってUIを自動生成しているのでしょうか? 簡単ですが中身を少し調べてみました。

サイズの計算

サイズの計算はLayoutUtilityクラスのGetLayoutPropertyメソッドで行われています。 該当のGameObjectにILayoutElementを持つコンポーネントがないかを探し、ある場合にはMin SizeやPreferred Sizeを調べてサイズを計算します。 もしILayoutElementがなければサイズは0になります。

計算タイミング

ContentSizeFitterクラスにあるLayoutRebuilder.MarkLayoutForRebuild()を呼ばれた時にサイズの計算が行われます。

LayoutRebuilder.MarkLayoutForRebuild (transform as RectTransform);

マニュアルによるとサイズの計算タイミングはフレームの最後に行われるみたいです。

再構築は直ちに起こるわけではなく、レンダリングの起こる直前、現在のフレームの最後に発生します。直ちに発生しない理由は、これにより、レイアウトが同じフレームで何度も再構築される可能性があり、パフォーマンスへ悪影響を与えるためです。

このメソッドは次のタイミングで呼び出されます。

  • OnEnable
  • OnValidate
  • Horizontal Fit もしくは Verticel Fitをセットした時
  • OnRectTransformDimensionsChange (RectTransformが変更されたとき)

docs.unity3d.com

最後に

これまであまり調べずにContetnSizeFitterを使っていたので、今回ブログに書くにあたり色々勉強になることが多かったです。 ContentSizeFitterに関しては、LayoutGroupと呼ばれる別のコンポーネントと組み合わせることで複雑なUIを実装できますので、そのあたりは後日またまとめようかと思っています。

はてなブログへ引っ越しをしました

突然ですが、ブログをレンタルサーバー上のWordPressから「はてなブログ」に引っ越ししていました。

引っ越し理由

WordPressでブログを初めて10年位たつのですが、レンタルサーバー上のメンテナンスやWordPressのメンテナンスが段々と辛くなり、HTTPSの対応をしなくてはいけないのにそのやり方がわからないなど、管理上のコストが上がりまくっていました。

そのためここ数年記事を書くモチベーションも薄れてきてしまいました。

はてなブログを選んだ理由

そもそもWordPressでブログを始める際にも、当時のはてなダイアリーを使おうかどうか検討したことがあったのですが、当時は個人事業主をしていたのでHPっぽいページが欲しいなと思っていたので自作のブログを作りました。

現在個人事業主ではなくアプリの開発もできていないこともあり、ブログだけかければ良いので、ブログを書きやすいそうな「はてなブログ(Pro)」を選びました。

おそらく今後各記事に関しては技術よりの部分が多くなりそうなので、「はてなブログ」は個人的に技術記事に強いという相性の良さも考慮しました。

引っ越しで苦労した点

もともとがWorkPressのブログでしたので、Export機能で記事と写真などは簡単に以降ができました。

苦労した点はドメインの移行です。

さくらインターネットで当初WordPressを始めたこともあり、ドメインさくらインターネットで取得していました。これを「はてなブログ」で使うのが大変でした。

自分では解決できなかったので、はてなのCSに何回か問い合わせをして、なんとか移動することができました。

今後

ブログの見た目など現状特にこだわっていないのですが、時間を見てカスタマイズできればしていきたいと思います。

ブログでアウトプット量を増やすのが目的ですので、そのあたりを増やしていきたいと思っています。

 

はてなブログ Perfect GuideBook [改訂第2版]

はてなブログ Perfect GuideBook [改訂第2版]

  • 作者:JOE AOTO
  • 発売日: 2020/07/18
  • メディア: 単行本
 

 

【振り返り】2019年に読んだおすすめ漫画

2019年読んだ漫画振り返り

2019年に色々漫画を読みました。 その中で特に面白いなと思った本をブログに書いていこうと思います。 (ネタバレはしないように気をつけます)

ブルーピリオド

まず一冊目は「ブルーピリオド」です。 主人公が東京藝術大学を目指す話なのです。 油絵や石膏など、よく美術館で見る作品がどういって作られているかなど、美術に関する色々なことを勉強することができます。 次から紹介する作品にも当てはまるのですが、自分が知らない世界のあれこれが書かれている漫画が結構好きです。

ランウェイで笑って

2冊めは「ランウェイで笑って」です。今年アニメ化が予定されています。 ストーリーが良いのはもちろんなのですが、モデル業界と服飾業界について勉強になるので、そのあたり疎い自分にとって勉強になりました。

アクタージュ

3冊めが「アクタージュ」です。 こちらは演劇を題材にした漫画なのですが、少年ジャンプらしく、次から次へとライバルキャラが出てくるのが良いです。 私は主人公よりもライバルキャラである天使こと「百城千世子」が好きですので、そちらサイドで応援をして今読んでします。

五等分の花嫁

作品は知っていたのですがこれまで見ていなかったのですが、とある機会があり一気読みをしたところ面白かったです。 あと1巻で終わってしまうみたいですので、誰が花嫁になるかを楽しみです。(私は4女の「四葉」押しです)

五等分の花嫁(13) (講談社コミックス)
春場 ねぎ
講談社 (2020-01-17)
売り上げランキング: 109

ギャングース

「叩き」と呼ばれる犯罪者集団から金品を巻き上げる主人公の話なのです。 内容自体はフィクションなのですが、監修にその本職の人が関わっているのでとてもリアル感があります。 振り込め詐欺などの犯罪がどういった形で行われているのかなど、裏の知識が学べるかも。 ただ、後半結構話がおっきくなってしまいリアリティがなくなるのが少し残念です。

ギャングース(16) (モーニング KC)
肥谷 圭介 鈴木 大介
講談社 (2017-04-21)
売り上げランキング: 88,223

彼方のアストラ

今年TVアニメ化されていたのですが、コミックを通して読みました。 推理小説的なストーリーで、誰が犯人なのかやことの顛末がどうなるかなど、楽しめます。 巻数も手頃なのでおすすめです。

彼方のアストラ 1 (ジャンプコミックスDIGITAL)
集英社 (2016-07-04)
売り上げランキング: 2,886

映像研に手を出すな!

NHKでアニメ化が予定されているので興味があって読んでみましたが世界観が独特で良かったです。 主役の3人が一つのアニメ作品を作る中でそれぞれの役割を演じているのですが、妥協やこだわりなどがあって、その中で作品が完成されているのを見るとゲームを作ることにも通じているなあと思いました。まだ巻数少ないのも良いです。

映像研には手を出すな! (4) (ビッグコミックス)
大童 澄瞳
小学館 (2019-05-10)
売り上げランキング: 9,432

ジョジョの奇妙な冒険 6部

最後に紹介するのが「ジョジョの奇妙な冒険 6部」です。 ジョジョシリーズはこの6部を含めて全部読んでいるのですが、6部だけは読んでいた当時話しがよくわからなくて序盤で読むのを諦めてしまっていました。 今年に久しぶりの読んでみたところ、一気に読むことができました。 主人公、徐倫がとても魅力的でかつ諦めない姿勢はジョジョシリーズの主人公の中でも一番です。その徐倫が最後にあのような結末を迎えてしまうのはとても辛かったです。 ジョジョは勢いで読まないと行けない漫画だと思うのでぜひ一気読みをしていただければ面白さが伝わるのではないかと思いました。

【振り返り】2019年に遊んだゲーム

2019年遊んだゲーム振り返り

2019年に少ないながら何本かゲームで遊びました。 記憶があるうちに遊んだ順番にブログに書いていこうと思います。

大乱闘スマッシュブラザーズ SPECIAL

去年の年末から正月にかけてやっていたのが、Switchのスマブラです。 これまでスマブラシリーズは一切触ったことがなかったので、新鮮でした。 カービィを主に使っていましたが、ネット対戦では全然勝てなくなってしまったのを気に止めてしまいました。

キングダムハーツ3

2と遊んだのがいつだったのか忘れるくらいにきた続編。 派生作品が出すぎているのもあるのですが、ストーリーがまったくわからなくなっていたのが残念でした。 グラフィックと各ディズニーキャラとのコラボはとても良かったですが、FFシリーズとはまったく絡みがなくなってしまったのがこれまた残念でした。 追加コンテンツもあるみたいですが、おそらくやらないでしょう。

レッド・デッド・リデンプション2

2018年から話には聞いていたのですが、このタイミングで遊んだのが「レッド・デッド・リデンプション2」です。 操作になれるのが大変でしたが、ストーリーも良くとてもおもしろかったです。

レッド・デッド・リデンプション2【CEROレーティング「Z」】 - PS4
ロックスター・ゲームス (2018-10-26)
売り上げランキング: 472

スーパーロボット大戦T

スーパーロボット大戦に出会ったことで、アニメをみるようになりました。 コンシュマでの最新作品の「スーパーロボット大戦T」は久々にやったシリーズ作品でした。 グラフィックは進化したとはいえシステムはほぼ同じだったので遊びやすかったです。

SEKIRO

今年のゲームオブイヤーに輝いた「SEKIRO」ですが、私には合わなかったのでクリアできずに売ってしまいました。 操作が難しいことと、死んだ後のロードが長いため飽きてしまいました。 そもそも死にゲーが合わない気がしましたので、今後は気をつけます。

SEKIRO: SHADOWS DIE TWICE - PS4
フロム・ソフトウェア (2019-03-22)
売り上げランキング: 685

アサシンクリードオデッセイ

アサシンクリードシリーズもこれまでやったことがないシリーズものでしたが、最新作「アサシンクリードオデッセイ」楽しく遊ばせていただきました。 追加コンテンツはやっていないのですが、それ以外はすべてクエストやりました。 いかに気が付かれずに敵を倒すかの戦略をたてるのがとてもおもしろいです。

モンスターハンターアイスボーン

去年一番遊んだといっても過言でもないモンスターハンター・アイスボーンの拡張コンテンツ。 9月に発売したのですが、現在も遊んでします。 武器を一通り使っているのですが、それぞれ遊び方が違い、またモンスターによっても相性のありなしがありがあり、それぞれ楽しいです。 ソロではなくマルチでやっているのですが、マルチのほうが色々なハプニングが起きるので、それがまた面白いです。 モンスターの種類をもって増やしてほしいなと思いつつ、次ぐのアップデートを待っています。

デス・ストランディング

現在進行系で遊んでいるのがデス・ストランディングです。 上記のモンハンが落ち着いてきたので並行して遊んでいます。 残念な点はムービーが長いので、途中スキップをしてしまい話がわからなくなることです。 でもそれ以外はゲームシステムやシェアなどこれまで遊んだことがない要素が新鮮で楽しいです。 風景もとてもキレイなのも良いです。

最後に

有名なタイトルばかりですが、2019年もゲームで楽しませていただきました。 次は「ライザのアトリエ」を買う予定です。話に聞くと評判がよさそうなので楽しみです。