作成者別アーカイブ: s2kw

[Unity3D][ImageEffect]Kino bloom filterを見る

高橋啓二朗(@_kzr)氏のKino Bloomフィルターの中身をみてみる。

Bloom

Bloom.csとshaderを行ったり来たりしながら見ていく。

void OnRenderImage(RenderTexture source, RenderTexture destination)

MonoBehaviour.OnRenderImage(RenderTexture,RenderTexture)

メインとなる関数。
第一引数がこれまでの結果。第二引数にこの関数で変更した内容を適用してあげなければならない。

適用はGraphics.Blitで行う。

    Graphics.Blit( source , dest );

続きを読む

[Mac]Unityでゲーム開発するマシンに入れておいたほうが良いモノ、設定しておいたほうがいいコト

インストールしておくと幸せになれるアプリケーション

  • Unity3D
    Unityで開発するんだからUnity入れないと!
    フリー版でも十分に開発できる。
  • Xcode
    iPhoe用ビルド出力時やgitのインストールで必要になる。

  • FBX viewer
    デザイナから受け取ったデータを確認するのに必要。

  • Blender
    無料DCCツール。自前でAnimatorの使い方とかを勉強する際に使い方を覚えておくと便利。

続きを読む

[Unity3D]UPDATE()は遅いらしいし

  • UPDATE()を10000回呼ぶ
    Unityのオフィシャルブログの記事を見ていくつか気づいたこと、今後すべきことをメモしておく。

気づいたこと

  • Script Call Optimization を Fast but no Exceptions に変更 という作業で高速化できる
  • Updateは遅い

Script Call Optimization を Fast but no Exceptions に変更

Updateをまま使う場合、 Script call optimazation の項目を設定してあげる必要がある。

メニュー: Edit->Project Settings->Player

ここから設定が可能。

Updateは遅い

Updateやその他のマジックメソッドは、まずUnity側に登録されてその後GameObjectの存在チェックやNullチェック等を経て初めて呼び出される。
そのため、たとえ中身がカラだとしても void Update(){} と記述するだけで呼び出し対象にはなるし、上記のチェック等を経ているために処理の対象になり、少ないとはいえレイテンシーが発生する。

記事中では、この辺が必要無い場合、自前でManagerを作ってManagerのUpdate時に子に対して自前のUpdateを流す仕組みの方が高速であるとしている。
さらにListではなくArrayを使用したほうが効率的だとも述べられている。

自律制御のテストをしやすく子として呼ばれた時もよ動作させやすいやりかた

Manager側は一方的に呼び出すで良いとして、子側はMonobehaviour継承クラスだとしても void Update() 等を記述しない
自律テストをする場合は ChildDriver としてUpdate内で自身に着いた子用コンポーネントを自動取得して自前Updateを呼び出す仕組みにしてテストしたら良いと思われる。

具体的には

マネージャとして以下の様なコンポーネントでUpdate呼び出し。ブログまま。

    public abstract class Manager<ChildType> : MonoBehaviour
        where ChildType : IManagedMember
    {
        protected ChildType[] members;
        protected void Update(){
            int count = members.Length;
            for (var i = 0; i < count; i++) members[i].UnmmanagedUpdate();
        }
    }

呼び出される側はこんな感じでインターフェースを用意。

    public interface IManagedMember{
        void UnmmanagedUpdate();
    }
    public abstract class ManagedMember : MonoBehaviour,IManagedMember {
        public abstract void UnmmanagedUpdate();
    }

独立して子の挙動をテストしたいこ時は子にこれを追加してあげる。

    public class ManagedMemberDriver : MonoBehaviour {
        IManagedMember[] components;
        void Start () {
           this.components = GetComponents<IManagedMember>();
        }
        void Update () {
            int count = components.Length;
            for (var i = 0; i < count; i++) components[i].UnmmanagedUpdate();
        }
    }

あとは必要に応じてManager側には子作りメソッドを用意したりで色々できる。

C#のコードからメッシュを生成するチュートリアル

Polygon from s2kw on Vimeo.

  • コードからポリゴンを生成するチュートリアル。
  • 大まかな流れは以下のとおり
    • Mesh オブジェクトの生成
    • Mesh オブジェクトに頂点情報を渡す
    • Mesh オブジェクトの頂点情報に合わせた三角ポリゴン情報を渡す (この時点で画面には描画される)
    • Mesh オブジェクトにUV情報を渡す
    • Mesh オブジェクトにtangent情報を渡す
  • 書いたコード
  • チュートリアル
  • Unity::Reference::Mesh

続きを読む

CharacterControllerのMoveの1とSimpleMoveの1

nityでのオブジェクトの 移動 方法は三種類あって、必要なコンポーネントも予め用意されている。

  • CharacterController の SimpleMove() を叩く
  • CharacterController の Move() を叩く
  • Rigidbody の velocity の値を変更する

SimpleMoveとMove、velocityもVector3型のパラメータを必要とする。

なので controller.Move( this.transform.forward * this.speed )のように記述することがある。この時の引数として渡す値の Vector3 の magnitude の値の単位は何なのか、ということが気になって夜も眠れないので確認してみた。

確認するために適用した各GameObjectの構成は以下の通り。

続きを読む

SerializeFieldのデフォルトはnullであってnullでない

Unityのエディタ上でAssetを選択するとInspector上にD&Dで設定できるObjectFieldがある。
publicに指定したり、SerializeFieldなどのAttributeを記述するとInspector上に出現し、指定の型に合ったAssetの参照を関連付けすることができるおなじみの仕組み。

ここに何も指定していなかった場合の対応策として null合体演算子 という条件演算子がある。
これで判定して対応しようとすると上手く動かない。

続きを読む

ResportCrashWindow

ReportCrashを起動させない

Macでアプリケーションを操作しているとアプリケーションがクラッシュ(不正終了)することがある。

アプリケーションがクラッシュするとでてくるのが ReportCrash ウィンドウ。

このウィンドウは、ウィンドウ右下のボタンによって閉じ無いと Com + TAB でのアプリケーションの切り替えではでてこ無いし、プロセスにも残り続ける。

Activity Monitor にも上位にランクインするし、マシンも延々と熱くなるので厄介極まりない。

そのうえプロセス上からQuitしても消えてくれ無い。再起動が必要で、再起動後も残り続けることがある。

どうやらアプリケーション自体が巨大であればあるほど ReportCrash もマシンのリソースを奪うようだ。

この ReportCrash を起動させ無い方法がある。

続きを読む

sublime text X git

Sublime Text を git commit のエディタにする

git commit の editor もSublime Textにしようとしたもののすんなり行かなかったのでメモ。

すんなり行かなかった理由は rbenv を入れていたから。

subl をインストール

Ruby Envのディレクトリを~/.rbenv/と命名していたのでここの下にbinをディレクトリを作成する。

続いて次のコマンドを入力することでSublime Textのコマンドラインツールであるsublが入る。

続きを読む

icon

[Unity3d]インスペクタ上にはあるのにスクリプトからでは見つからないプロパティにアクセスする

きっかけ

Trailの色をスクリプトから変更できないか探していたところ、StackOverFlowに以下の様な質問が。

Trail Renderer Colors [C#]

I am creating a Trail Renderer that is modified in script (width, life, material, etc.) I was wondering if there is a way to change the colors array in script as well.

I’ve tried getting the game objects “colors” variable but it says that does not exist even though it is in blue.

This is what I tried:

回答として

The colors array isn’t accessible from the script API, unfortunately.

とあったりするので諦めかけつつスクロールさせると…

続きを読む