2014年12月14日日曜日

ユニティちゃんディレクター杯 登録してみた



面白そうだったので勢いで製作しはじめたものの、なんやかんやで時間が・・・。


結局締め切り当日にアップロード(汗;


最後の最後まで、ニコニコ動画用エンコードで悩みました。
悩むというか、なかなか思うような高画質にならない。


いや、そもそもビットレート3Mbpsでは激しい動きの動画はきついという感じでしょうか。
(4分間だと最大動画サイズ規定100MBからの逆算でおよそ3Mbps強)

とりあえず(エンコードで)最善は尽くせた・・・と思います。エンコードだけで3日は使い切ってしまったOrz。



お暇な方は是非視聴してみてください


【ユニティちゃんディレクター杯 】ユニティちゃん3人で踊ってもらった


追記:最後の悪あがきで締め切り30分前にギリギリ再エンコ&画質向上版をアップロードできました。(エンコ開始後力尽きて寝落ち>ギリギリで起きたのは内緒w)

【画質向上版 】ユニティちゃん3人で踊ってもらった



今回のCandy Rock Starステージはいろいろと勉強になりました。

いずれ気が向いたらブログにまとめておきたいなとは思います。






ちなみに「これは!?」と思った投稿作品。


【ユニティちゃん】HGベアッガイさんが踊ってみた【3Dキャプチャ】

これはすごいです!。久々にちょっと感動。


父親にも殴られたこともない人 「こいつ・・・動くぞ」

某3倍速い人「ニコニコの技術部はバケモノか」


すごい時代になったもんです。Autodesk のツールもすごいですが、無論使う人のスキルも必須。

正直OculusやMotion Leapよりもこの動画が一番インパクトが大きかったです。


さて、締め切りまで残すところ約10時間、ラストスパート(?)がかかるんでしょうか。




2014年12月12日金曜日

レンズフレアの設定 ~ Unity C#

レンズフレアの設定をC#で行うメモ。


■レンズフレア


2種類いずれかのコンポーネントを使う。
※一応両方設定することも可能。


  • レンズフレアコンポーネント
    ライト等のオブジェクトに付与して使う。
  • Lightコンポーネント
    このコンポーネントのプロパティにもフレアがある。


■Lightコンポーネント

まず「Lightコンポーネント」を使う場合。

Lightオブジェクトをシーンに配置し、選択状態でInspectorを見る。

Lightコンポーネント欄の Flare がNone (Flare) になっている。この状態ではまだフレアは未設定。

Unity Editor上ならここに手動でAssetのフレアをドラッグ&ドロップすれば設定完了。この操作をC#で行えば良い。



○フレアリソース準備


レンズフレアのAssetを用意。
Assets > Import Package > や Assets Store からインポートしておく。


インポートしたフレアはAssets配下の Resources フォルダに配置しておく。
※C#からフレアリソースをLoadする際は、対象を /Assets/Resource/ フォルダ配下に配置しておく。


○フレア設定


シーンに事前に Point Light を配置。ここではObject名 "Point light for Laser"とした。
フレアは "Laser" というものをPoint Lightに設定してみる。

-----
// Get Light object instance.
GameObject go_Pointlight_for_Laser = GameObject.Find("/Point light for Laser");

// Load Flare resource.
Flare fe_LensFlare_Laser = Resources.Load<Flare>("Lens Flares/Laser");

// Set flare to light object.
go_Pointlight_for_Laser.light.flare = fe_LensFlare_Laser;
-----


これで「Lightコンポーネント」の場合は完了。
 

■レンズフレア コンポーネント

次はレンズフレア コンポーネントを使う場合。

シーンに事前に Point Light を配置。前項同様Object名 "Point light for Laser"。
フレアは "Laser" というものをフレアコンポーネントをC#から付与して設定。

-----
// Get Light object instance.
GameObject go_Pointlight_for_Laser = GameObject.Find("/Point light for Laser");
  
// Load Flare resource.
Flare fe_LensFlare_Laser = Resources.Load<Flare>("Lens Flares/Laser");
  
// Add LensFlare component.
LensFlare lf_Pointlight_for_Laser = go_Pointlight_for_Laser.AddComponent<LensFlare>();

// Set flare to LensFlare component.
lf_Pointlight_for_Laser.flare = fe_LensFlare_Laser;
-----

これで完了。

2014年12月10日水曜日

ユニティちゃんディレクター杯 その3

だいたい出来てきて調整段階に突入。


予想通りというか、動画作成に大変手間取り中 Orz。


Youtubeならだいぶ前にAviUtlにて1920x1080で過去アップロードを試してみたこともありますが。

ニコニコ動画はいろいろと大変な様相。

ニコニコ動画のアップロードの制約上、動きの激しい動画ではプレアカにしないと話にならない感じ。


プレアカ前提でいろいろ調べていくと、
(動画時間は4分程度を想定)


  • 最大ファイルサイズは100MBytes。
  • 逆算すると概ねビットレートは3Mbps強が限界。
  • ニコニコ動画側はi420(YUV420)だと良いらしい(DVD世代の非HD仕様)。
  • ここまでの仕様状況を鑑みると動画サイズはワイドなら640x360、スクエアなら512x384程度が限界。
  • ファイルサイズ、動画フォーマットが規定外だと再エンコードされて劣化する。


機会があれば別途この辺はまとめておきたいところですが、とりあえず、

  • アマレココで試す
    →遅かった。XP時代のものなのでしょうがない。
  • アマレコTV(暫定Win7対応版)で60fpsを目指してRGBでHD(1280x720)録画。
    → HDDでは書込が間に合わずコマ落ち発生。
      諸々調整するも玉砕。
    → SSDで強引回避。
  • アマレコTVのタスクスケジュール配分調整
    →たまにコマ落ちの気配を感じたので。CPUパワー不足?
  • AviUtlでMP4にエンコード(640x480化)。
    ニコニコ動画プリセットが使えるところまでやっと環境構築&エンコード。


やっとマシなエンコードができるようになってきたので、キャプチャパラメータ、エンコードパラメータも試行中。


ニコニコ動画ってアップロード制限いろいろと厳しかったんですね;
ほんと制約厳しすぎます;

2014年12月8日月曜日

Google検索エンジンからのアクセス激減


Google検索エンジンからのアクセス激減について。

激減後、復旧したので一応メモ。

巷ではこのような状況は有名なようで、検索するといろいろでてきますね。

正直うちみたいな弱小ブログは関係無いと思っていましたが・・・。




2014/9/6頃から10/25頃までスパっと落ちてますね。
落ちたところでPV数は元々大したことはないのですが、

「え?なんで落ちたんだろう???」


と、気にはなるわけです。


■状況調査

と、いってもだいたいのことは既に多くのサイトに書かれているので既出ですが。

まずはアクセスの流入元の変動を確認。
Google Analytics なら、集客>すべてのトラフィック等で。
Googleウェブマスターツールなら、検索トラフィック>検索クエリ のクエリ数、表示回数等。

うちの場合は従来に比べて極端にすべての数が落ち込んでいました。
自然なアクセス減少とは思いにくいのはほぼ明らか気味。

もしもAdSenseなどでペナルティを受けている場合は、ウェブマスターツールの、

検索トラフィック>手動による対策

に何か表示されるらしいのですが、

「手動によるウェブスパム対策は見つかりませんでした。」

としか表示されていないので特に問題は起きてないようでした。

しかし何かが起こっている(?)のは間違いなさそうです。

■原因調査

はっきり言って特定できませんでした。
特にAdSenseやブログ規約に違反しているわけというわけではなさそうですし。
総合すると単にGoogle検索のアルゴリズムが微変更?か何かで影響を受けていたのかもしれませんが、わかりません。


■対策

原因もわからないまま対策とはおかしな話ではありますが。
とりあえず考えられそうなところに手を入れました。
いろいろやったので覚えてる限りを以下に列挙。


○AdSenseの規約を再確認。

ページを開いたときに、上部の広告で記事本文がが押し下げられてしまうとよろしくないとのこと。
PC画面では大丈夫でもタブレット、スマホ等の画面解像度が小さい場合にこれに該当してしまう場合有らしい。
多分大丈夫そうな気はしましたが念の為ページ最上部のブログ名のフォントサイズを少し小さめにして対応。


○記事のタイトル

同じ単語が複数の記事で多く含まれるのはよろしくないらしい。
10や20記事くらいでは問題ないらしいのですが、一応一部記事のタイトルを修正。

○広告のフィルタ

アダルト系、それに準ずる広告は結構厳しいようです。

元々AdSenseにおいては、宗教、性に関する内容、ギャンブルは当初よりフィルタ済み。
一応これに加えて、リプロダクティブ ヘルスも追加。

i-mobileなどは「強フィルタ」でもアダルト色のものがでる可能性はあるらしいので要注意。
管理ページのフィルタリングボックスで一部の電子書籍コミック系の広告ドメインを追記してフィルタ。

※2014/12現在では「強フィルタ+」というのがあるようで、これでアダルト色を一切排除できる様子。前はコレなかった気がするのですが・・・。



○Google ウェブマスターツール

各項目でエラーがでていないか確認。

  • 検索のデザイン
  •  クロール
    • クロールエラー
      ネット不調でクロールできていない場合が結構あるので(404レスポンスコード)その辺はゆるめに見る。
    • Fetrch as Google
      念の為、「取得」している。
  •  サイトマップ
    • 未登録だったので、登録してみた。
もっといろいろやったような気もしますが、もはや覚えてないのと、どっちしても修正後は改善が見られなかったので・・・。

■結局は

いろいろ対策してみたものの1月以上変化無し。
2ヶ月弱経過で急に元に戻った感じです。

Google検索による表示数が激減していたのは間違いないので、Google先生のご気分次第・・・なんでしょうかねやはり。

結局まじめにコンテンツ=記事を書いているならば、慌てず騒がずじっと地道に記事を増やしつつ待つのが得策なんでしょうかね。



 















2014年12月1日月曜日

パーティクルをいじる ~ Candy Rock Star

公開されているUnityちゃんの「Candy Rock Star」でパーティクルをいじってみたメモ。


(Unity上で既に「Candy Rock Star」が動いてる前提。理解不足などある可能性大なので注意)。



■手動でいじってみる


#1.パーティクルを放出しているオブジェクト

Unity上で再生してHierarchyウィンドウを見てみると Confetti(Clone) というオブジェクトができている。
これがパーティクル放出を担当しているオブジェクト。
(動的生成されているので再生中しかHierarchyウィンドウに現れない)




#2.パーティクルの色を手動で変更

再生を一時停止して、Hierarchyウィンドウ > Confetti(Clone) 配下の オブジェクトParticle System を選択する。
Inspectorウィンドウを見るとパーティクル設定が見える。
色は Start Color をいじれば即再生に反映される。
 


#3.パーティクルを手動でON/OFF


Inspectorウィンドウ上部のオブジェクトParticle Systemを有効/無効のチェックを操作するとパーティクル放出もON/OFF変化する。

 

#4.パーティクルのレイヤ

パーティクル用に設けられたレイヤ名 Particle に Confetti(Clone) は配置されている。
このオブジェクトの子には Directional Light があり、それも同じレイヤにある。
ということは Directional Light を調整すると Particleだけを対象としたライト効果を操作できる。
 

#5.動的生成元


ここまでみてきた Confetti(Clone) の動的生成元(プレハブ)はProjectウィンンドウ内の /Asset/UnityChanStage/Prefabs/Confetti。
(※Confetti (light) というのも見えるがParticle Systemを1つにした軽量バージョンかもしれない?)
変更を加えたい場合はこちらのプレハブを変更すれば再生時に反映される。



■再生時のパーティクル起動


/Asset/UnityChanStage/Prefabs/Confetti の中のスクリプト PropActivator が再生後パーティクルの放出をしている。

これは前述でInspectorから手動でON/OFFした操作をスクリプトから行っているだけ(gameObject.SetActive(true); )。

ただ、動的生成されている点に加え、呼び出しシーケンスが少々複雑であった。

  1. 再生開始
  2. オブジェクト/Stage Director内のスクリプト StageDirector が実行開始。
    StageDirector の Inspector の Prefabs Needs Activation は動的生成するオブジェクトの一覧の配列。ここに Confetti が事前に登録されている。
    スクリプト StageDirector はこの一覧のオブジェクトを(Awake()内から)動的生成する(インスタンス化)。
     
  3. スクリプトPropActivatorvoid ActivateProps() の呼び出し元は?
    動的生成された オブジェクトConfetti(Clone) にはスクリプト PropActivator が入っているが、Start()もAwake()も無い。
    void ActivateProps() のみがあるだけでpublic関数でもない。なので外部からの通常の関数呼び出しは不可能。
    しかしこの関数は再生開始後しっかり呼びだされる。
    つまり「別の方法」で呼び出されている。
     
  4. ブロードキャスト経由で呼び出し。
    スクリプト PropActivator void ActivateProps() を呼び出している箇所はどうやらスクリプト StageDirector 内の void ActivateProps()
    ここからブロードキャストメッセージ経由で呼び出している様子。
    メッセージの送り先オブジェクトは配列 prefabsNeedsActivation(オブジェクト/Stage DirectorのInspectorで見える)を対象に送り付けている。
     
  5. 管理の大元スクリプト StageDirector 内の public void ActivateProps() を呼び出すコードが存在しない。
    ここまでで、オブジェクト/Stage Director 内のスクリプト StageDirector public void ActivateProps() がパーティクルオブジェクト郡へメッセージ経由でオブジェクトの有効化=パーティクル放出開始をしていると見て取れる。
    しかし当のこの関数 public void ActivateProps() をアクセスしている箇所がC#のコード上に存在しない。
    どこから呼ばれているのか?
     
  6. Animation Eventから呼び出されている。
    Hierarchyウィンドウでオブジェクト/Stage Director を選択。
    上部ツールバーのWindows > Animation(又はCTRL-6)。
    これでオブジェクト/Stage Directorに紐ついている(?) Animationの状態が確認できる。
    (まさにBlenderのNLAエディタみたいな感じ?)
    ホイールをまわすと時間スケールを変えて見れる。
    ここから関数ActivateProps()が呼び出される。
     

 ■Animation Event

 上部ツールバーのWindows > Animation(又はCTRL-6)で開くと以下のように見える。


このタイムライン上にイベントを打ち込めるようで、そのイベントから関数呼び出しができるようだ(白い縦棒がイベント)。
白棒にマウスオーバーするとイベントでの呼び出し関数名が見える。

この白棒のある横軸のタイムラインエリアで右クリックAdd Animation Eventでイベント追加&呼び出し関数の指定ができる。
この際当該オブジェクト内スクリプト(複数あれば全部)のpublic関数が候補にでてくる様子。




■まとめ?

たかがパーティクルのON/OFFなので、対象オブジェクトのGameobjectを取得&操作で済みそうだと思ったら、結構複雑なことをしていた。

○BroadcastMessageによる制御

まずBroadcastMessageを使う意味について。
思うに対象オブジェクトとその階層下ならどこに移動しても制御可能なのがメリット・・・だと思われる(相手がpublic関数でなくても呼べる)。
複数Objectに増えてもそのまま対応できる。

結果的に Candy Rock Star では対象オブジェクトそのものにスクリプトが付いているが、開発中にスクリプトを子に移動したりしても呼び出してくれるので、これはちょっと楽かもしれない。

これを Getcomponents() でスクリプトのハンドルを拾う場合は子階層も追跡して拾うことになる
(自前追加実装部分ではこれをやっているが、ちょっと動きを確認したい時はメッセージの方が楽だとは思う。ただメッセージは重いので多用注意ぽい)。

今回の当該箇所はパーティクルの関数呼び出し回数も少ないので、開発中の簡便さでこうなっているのかなと推察。子オブジェクトの1パーティクル/2パーティクル版にもそのまま対応できるし。



○Animation Event

これは・・・めっちゃ便利そうです。
そしてこれに気づく前に、経過時間で各種自前イベント発生&処理を振り分ける機構を既にC#で実装、イベントもほとんど実装し終わってしまったのは内緒・・・(号泣;

パーティクルを先に手をつけとくべきだったか・・・Orz

いやほんとこの機能は便利だと思います。特に Candy Rock Star のような時間進行でイベントが発生するものは。



やはり人のコードを読むのは勉強になりますね。
Candy Rock Star は良い題材だと思います。