タグ別アーカイブ: Unity

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合体演算子 という条件演算子がある。
これで判定して対応しようとすると上手く動かない。

続きを読む

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.

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

続きを読む

[Unity3D][github]Unity3D + github の環境設定

Unityのプロジェクトをgithubで管理する際の必要な情報とお勧めについて。

github側

まずはリポジトリを作成する。
その際にgithubの Add .gitignore: ボタンから、プロジェクトなのかを選択することができるのでUnityを選ぶ。

gitignore

gitのバージョン管理の対象にしたくないもの、除外したいものをディレクトリ単位または、ファイル単位、もしくはファイルの名前の一部を含むもので指定できる。

先のgithubの設定で出来上がった .gitignore ファイルは以下のようになっている。

続きを読む

[Unity3D][NGUI]Atlasをスクリプトで読み込む

NGUIは複数のスプライトのテクスチャを1つのアトラスにまとめて管理する便利な機能がついてる。
ただ、スクリプトで生成したUISprite付きGameObjectにSpriteを割り当てるには先にUIAtlasを渡さなければならない。

スクリプトでどうやるのかしらべたところ、AtlasをInstantiateしてるサンプルを見つけた。
NGUIをスクリプトのみで構築したいので調べてみた

しかしこれだとScene上にPrefab(Clone)た配置されてしまうし、読む都度Cloneが生成されて美しくない。
そのうえ、 Instantiate した PrefabDestroy するとせっかく読んだ Sprite は参照が missing で表示されなくなる。

というわけで色々試した結果、以下のスクリプトで対応できた。

続きを読む

[Unity3D]Instantiate と Awake とか Startが流れるタイミングを把握する

Instantiateされた時にprefabの各GameObject内のAwakeとかStartのタイミングを知っておきたかったので調べた。

  • 親子関係によるAwakeやStartの流れが不明だったので簡単なスクリプトを作成した。
  • スクリプトの主旨としては、出現時にどの状態で出現するのかを理解できるものに、ということで作成した。

プレファブの構造は次の様にした。
続きを読む

[Unity3D][NGUI]ボタンの作り方最小構成

環境

  • Unity3D : 4.5.1f3
  • NGUI : 3.7.4

やること

  • ボタン用のGameObjectを作る … A
  • AにButtonとUILabelかUISpriteをアタッチする
  • AにBoxColliderをアタッチする
  • ボタンを押した時用のスクリプトを書く … B
  • BをAにアタッチする。
  • AにアタッチしたButtonのイベント
  • 実はBはAにアタッチしなくても良い。

続きを読む

[Unity][uniSWF]newしたMovieClipが突然なくなってしまう現象でハマった話

Uniswfを使用しているとプログラム上で動的にMovieClipを生成したくなることがある。
これでちょっと複雑な構造にするだけで意図した動作がなされないことが良くある。

次のコードで例を示す。

    public Vector2 v2Out;
    MovieClip linkage;
    List<MovieClip> c = new List<MovieClip>();
    private void Test(){
        var stage = MovieClipOverlayCameraBehaviour.instance.stage; 
        var a = new MovieClip();
        var im = new MovieClip();
        a.addChild(im);

        var textureA = Resources.Load("images/iconA")  as Texture2D;
        var textureB = Resources.Load("images/iconB")  as Texture2D;
        a.graphics.drawRectUV( 
            texture,
            new Rect(0, 0, 1, 1),
            new Rect(0, 0, textureA.width, textureA.height)
        );
        im.graphics.drawRectUV( // この描画は失われる。
            texture,
            new Rect(0, 0, 2, 2),
            new Rect(0, 0, textureB.width, textureB.height)
        );

        this.linkage.addChild( a );
        c.Add(a);
        a.x = cor.v2Out.x;
        a.y = cor.v2Out.y;

        MovieClipOverlayCameraBehaviour.instance.stage.addChild(this.linkage);
    }
    private void TestMcStructOut(){
        var stage = MovieClipOverlayCameraBehaviour.instance.stage; 
        Debug.Log( "ListCount : " + this.c.Count + " : linkage has :" + this.linkage.numChildren + " : stage has :" + stage.numChildren + " : a's child : " + (this.linkage.getChildAt(0) as MovieClipUtil).numChildren );
    }
    void Update(){
        if(c.Count < 1) Test();
        else{
            //c.ForEach( d => this.linkage.addChild( d ) );
            //c.ForEach( d => d.visible = true );
            c[0].x = v2Out.x;
            c[0].y = v2Out.y;
        }
        TestMcStructOut();
    }

‘Vector2’ 型のメンバ v2Out は描画させたい MovieClip の位置を変更させるためのものとして用意。
Unityを再生中でもMovieClipをぐりぐり動かせる。

Test関数内部で作成しているMovieClipの構造を改めて示すと、

    stage -> linkage -> a -> im

これを実行すると最初のフレームだけ textureA, B の両方が描画され、次のフレームでは im に描画した textureB は消滅している。

状況を整理すると
– linkage はメンバなので次のフレームでは削除される
– a はメンバではないけれども list c で参照を保持している。
– im はメンバでもないし参照を保持していない。
– 消えているのはimだけでaに描画したテクスチャは表示され続けている。

推察1 MovieClip im がメンバじゃないから失われている

im は Test() の中で創られているので関数終了後はUnity上では参照を失っている。
なので自動でガベコレ的なものがuniSWF内で動作しているのであれば参照を保持しておけば大丈夫なはずだと考え、メンバに MovieClip 型の tmpim を追加した。

しかし結果は描画されず。

メンバ変数に格納すると参照をすぐに見いだせる。当たり前だけど参照そのもは破棄はされていないことが確認できた。

    if(tmpim != null) Debug.Log("alright!"); // ここを通る事は無い。

推察2 親子関係だけ外れてしまったのでは?

前項で調べた通り、参照先は失われていなかったので描画対象ではなくなったのではと考え、子の数を調べる関数でチェックを行った。

    private void TestMcStructOut(){
        var stage = MovieClipOverlayCameraBehaviour.instance.stage; 
        Debug.Log( "ListCount : " + this.c.Count + " : linkage has :" + this.linkage.numChildren + " : stage has :" + stage.numChildren );
    }

ここに記述されている ‘numChildren’ が子の数を保持しているプロパティ。
これを回すと最初の ‘Test()’ では linkage.numChildren が 1 だけど次のフレームで記述されたログには 0 になっている。

ここで外れてしまう親子関係だけどうにかするのも手としてはありなのだけどもう一歩踏み込んでみた。

親子関係は破壊されるけれども参照先として’MovieClip’が保持される事が分かったのでこれをもうちょっと掘り進めたら以下のようになる実装になっているということが分かった。

uniSWF_couldnotStoreMovieClip by Kunihiro OHGAKI, on Flickr

その場で ‘new’ した ‘MovieClip’ に ‘addChild’ した孫 ‘MovieClip’ は次のフレームでは親子関係が破棄されている。

まとめ

  • MovieClip をその場で生成する場合はメンバに格納すべき。
  • メンバに格納済の MovieClip でも、さらにその子の MovieClip に描画した場合は親子関係が破棄される。
  • その場で ‘new’ した MovieClip に直接 graphics を記述した場合は問題なく保持される。

対策

List形式とかで生成したやつは全部格納しておき、そこからアクセスするとか。

けっこう色んなパターンを調べてやっとこの結論に至ったのだけれども間違いがあったらご指摘いただきたい。

Unityによる2Dゲーム開発入門 ~プログラミング初心者がゲームを公開する最短コース

おまけ

uniSWFの問題点

  • uniSWFはswf化してからunityに取り込むので何かするにもFlaファイルを開かなければならないのでアプリケーション常に2つ立ち上げっぱなし。
  • さらにflaの素材編集となるとphotoshopも立ち上げなければならない。
  • さらにphotoshopのデータで曲線使ってたりするとillustratorも…
  • ちょっとしたレイアウト調整がGameObjectのInspectorでできない。やれるけど標準的ではない。
  • ソフトウェアレンダリングなので最初の1フレームはデバイスの画面によって拡大縮小された表示が見える。
  • 描画コストが高い。ドローコール減らせない。
  • unityのアップグレードにどこまでついて来れるのやら心配。
  • ドキュメントが完成してない。実は実装済みでドキュメントに記載が無いって事も多々ある。
  • swf作成のお約束が多い。
  • フォントが不自由。
  • フォントサイズも不自由。

uniSWFの使いどころ

  • アニメーション作業がしやすいのでガチャみたいな画面全域で表示しつつ演出過剰にしたい場所では作業を完全に切り分けられるのでオススメ。
  • monoDevelopでソースが見れるのでswfがどういう構造になってるのか勉強になるかも。

演出だけは突出した真価を発揮する。uniSWFをコレからも宜しくお願いします。間違ってもUI全部にuniSWFを使っては行けない!マジで!(涙目)