FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・7並べ』を公開しました。
    Android/iOS https://goo.gl/zsFces

    カテゴリ:Unity > 検証

      このエントリーをはてなブックマークに追加 Clip to Evernote
    C#でスクリプトを書くときは通常クラスごとにファイルを一つ作るでしょう。公式の解説にもあるようにメニューからスクリプトを作り、名前が選択されているときにリネームするのが便利な作り方です。

    Assets->Create->C# Scriptと選べば、プロジェクトブラウザー上にNewBehaviourScriptというスクリプトが追加されます。以下のように追加したタイミングではファイル名が変更できるようになっています。この瞬間だけ名前を変えることで、ファイルの中身にある文字列も一緒に変わります。
    newscript

    うっかりEnterキーなどを押してNewBehaviourScriptのままになってしまった場合は、ファイルのリネームとクラスのリネームは別々に行えば問題ありません。意外と面倒なので、ファイルを消してやりなおした方がおそらく楽です。

    Test.csというファイル名に変更した場合は以下のようなスクリプトができます。

    classのところがTestになっていて、ファイル名と一致しています。 
    ファイル名とクラス名が一致しているとゲームオブジェクトにアタッチできるということが重要です。 なぜそうなのかというとUnityのルールだからです。(C#ではファイル名とクラス名が一致しなくても良いようです。)
    ゲームオブジェクトにアタッチするというのはスクリプトを簡単に呼び出すことができ、Unityでは以下のようにドラッグ&ドロップするだけです。


    GameObjectにTestというコンポーネントが新たに設定されているのがわかると思います。



    ファイル名とクラス名が一致しない場合どうなるかというと、アタッチできません。そのようなスクリプトにはインスペクタ―上に以下のような注意書きが載ります。MonoBehaviourを継承し、かつファイル名とクラス名が一致していないという注意です。これは問題ない場合もあります。(static classとかpartial classとか)

    nomono

    この注意書きが出ているスクリプトをアタッチしてみると、警告ダイアログが出ます。

    errdi

    警告にも書いてあるようにアタッチできないスクリプトということがわかりました。ただし、GUIではできないというのが今回の本題です。

    GUIでの操作は駄目でしたが、スクリプトから
    ファイル名とクラス名が一致しないスクリプトをアタッチすることができます。やり方はAddComponentを使うことです。 

    まずファイル名とクラス名が一致しないMonoBehaviourを継承したクラスを用意します。以下の例はファイル名がNotSame.csであり、クラス名がNotSameScriptというクラスだけのスクリプトです。

    このクラスをアタッチするために次のようなTest.csを用意しました。

    Testスクリプトにはゲームオブジェクトの参照が渡せます。渡した参照のゲームオブジェクトにNotSameScriptをアタッチすることになります。

    こうしてアタッチすると正しく動きます。StartとUpdateしか試していませんが、動いていました。

    fatt

    corratt

    上のように本来アタッチできないスクリプトをアタッチしたところ、アイコンが微妙に変わりました。下の図はアタッチできるTestスクリプトの場合です。コンポーネントの名前の左のアイコンとScriptという枠が違います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Q:コルーチンに渡すメソッドをIEnumeratorでないものにしたらどうなるのか?
    A:実はSendMessageみたいな動きをします。 


    コルーチンを開始するにはStartCoroutineを使って行うのが一般的だと思います。3種類のオーバーロードがあります。メソッドをそのまま渡すIEnumeratorを引数に取るもの、メソッド名を引数に渡すもの、メソッド名とそのメソッドに渡すパラメータを引数にするものです。
    • StartCoroutine(Func1());
    • StartCoroutine("Func2");
    • StartCoroutine("Func3", 3);
    上のように使い方が異なります。今回の記事で取り上げるのは2番目と3番目のメソッド名を渡してやる場合です。
    本来コルーチンはIEnumeratorを返すメソッドとして実装しなければなりません。StartCoroutineの第2、第3の形式では文字列の指定をするだけなので、IEnumeratorを返さないメソッドを指定することができてしまいます。
    正しい使い方ではないのですが、実はちゃんと機能するみたいです。(公式の説明はないが検証してみると問題がなかったという意味です。)
    引数に指定したメソッドの引数は0か1個でないと駄目ですが、引数に合わせた適切なパラメータを渡すようにしてやるとそのメソッドを単に呼び出すようになります。
    内部的に同じかはわかりませんが、SendMessageという機能と何ら変わらない使い方になります。(SendMessageのOptionがない場合と同等でした。)

    以下に検証したときのコードを載せておきます。この機能を使ってみようという人は、ソースをダウンロードするなり、コピーするなりして検証してみると良いと思います。


    へぇーという感じですが、まさしくそれだけです。

    このページのトップヘ