2017-02-11 8 views
0

私は単純なメッセージボックスを作成し、ユーザにメッセージを表示する必要があります。それはプレハブであり、いくつかのことを行います。ほとんどの場合アニメーションはインスタンシエーション時にになります。インスタンス化時にコードを実行するために、私はStart()関数を使用しました。 私は何をメッセージするかを既に知っていたが、Start()の前に実行され、instantiationに実行され、パラメータを取ることができるconstructorのようなものが必要なときに機能しました。 ここでは、インスタンス化してメッセージを設定してすべてを実行できることを十分に認識しています.3行のコードを使用してインスタンス化しますが、別の適切なソリューションがあるかどうか不思議です。私がネット上で見つけたのは、インスタンス化してから何かをすることでした。インスタンシエーション時のユニティパスパラメータ

EDIT:メッセージボックスの

私の呼び出しに表示する:

var timeBox = 
    Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform); 
    var scr = timeBox.GetComponent<MessageBox>(); 
    scr.OnCreated(message); 

OnCreatedは、初期化を行い、アニメーションなので、基本的にすべてを示しています。 しかし、にはがあり、表示する内容を知りたい場合は入力してください。「オンザフライ」でテキスト値を設定する必要はありません。メッセージボックスが表示されていてもテキストが表示されていないときは奇妙なちらつきが表示されますセット。

EDIT2:

最後のパラメータtransformInstantiationで、これはUIスクリプトであるとして、このスクリプトをオンにするCanvasです。このパラメータは、新しくインスタンス化されたGameObjectがその子であることを意味します。

EDIT3:

タイムボックスがmessageBoxのインスタンスだけで、彼らはGameObject sがあります。 メッセージボックスは1つだけです。その目的は、メッセージとともに表示され、0.5秒後にフェードアウトして移動した後です。移動した後、それはそれ自身を破壊する。

+0

簡略化したい3行のコードを表示することは理にかなっています。 – Programmer

+0

十分に公正で、すぐに編集できます。 – agiro

+0

申し訳ありませんがそれは4行です、私はラインを壊しました。 – agiro

答えて

2

これは、関数または拡張メソッドで行うことができます。

この場合、拡張方法がより適切です。

GameObjectの代わりにObjectという拡張オブジェクトを作成します。 GameObjectはObjectから継承するので、この拡張メソッドはObject、GameObject、Transformの両方で機能するはずです。

ExtensionMethodという名前のクラスを作成し、その中に以下のすべてを貼り付けます。

using UnityEngine; 

public static class ExtensionMethod 
{ 
    public static Object Instantiate(this Object thisObj, Object original, Vector3 position, Quaternion rotation, Transform parent, string message) 
    { 
     GameObject timeBox = Object.Instantiate(original, position, rotation, parent) as GameObject; 
     MessageBox scr = timeBox.GetComponent<MessageBox>(); 
     scr.OnCreated(message); 
     return timeBox; 
    } 
} 

使用Start機能で

つだけのラインコールは他のすべてのタスクを処理する必要があります。

public class Test: MonoBehaviour 
{ 
    GameObject messageBox = null; 
    Transform penaltySpawnLoc = null; 
    GameObject penaltyPrefab = null; 

    void Start() 
    { 
     gameObject.Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform, "Hello"); 
    } 
} 
+0

だから、基本的にそれを包みます。私は3行を貼り付けることでいくつかの間違いを犯すかもしれませんが(とにかくコピーの貼り付けは本当に嫌です)良い方法です。ありがとう! – agiro

+0

はい。コピーする必要はなく、GameObject/Transformクラスの一部になっています。あなたのプロジェクトのどのスクリプトからでも、 'gameObject.Instantiate(messageBox、penaltySpawnLoc.position、penaltyPrefab.transform.rotation、transform、" Hello ");'または 'transform.Instantiate(messageBox、penaltySpawnLoc.position、penaltyPrefab.transform .rotation、transform、 "Hello"); '**あなたの' YourOtherClass.Instantiate'の**の代わりに** – Programmer

1

私はメッセージボックスのための工場を使用したいので、

var timebox = MessageBoxFactory.Create(message); 
timebox.Show(); 

とファクトリクラスのようなものは、あなたのセットアップを行うと、メッセージボックスを表示()がある

public static MessageBox Create(string message) { 
    var newTimeBox = Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform); 
    var scr = newTimeBox.GetComponent<MessageBox>(); 
    scr.SetMessage(message); 
    return scr; 

を返します新しいOnCreated()。私はこのパターンが呼び出しコードを減らすのに役立つと思っています。もし私が望むものがどのように作成されるのかを調整する必要があれば、それは共有された工場コードで一箇所にあります。

関連する問題