実務経験5時00分の2019年9月27日ユニティ開発の概要

ます。http://gamerboom.com/archives/76699からの振替

著者:ジョン・ワーナー

Unityは非常に明確かつ簡潔にするために設計されたコンポーネント指向のスタイルのプラットフォームそのうちの1つは多くの理由のために、非常に強力なゲーム開発ツールです。例えば、利用可能一緒に簡単なプロトタイプをつなぎ、いくつかのコードを実行するために一日に入れやすいです。しかし、その多様性に加えて、実際の数年後、私は特にUnityと、行うことが有益な何かを見つけました。

私の新しいゲーム「秋」のために、私は実際には何度も行っています。その結果、開発プロセスを円滑、迅速かつ簡単に、私の最後の試合よりも抜け穴がはるかに少ないです。「秋」の誕生を祝い、そして公共のために、そのキックスターターキャンペーンを上げるために、私は私のお気に入りの設計方法のいくつかを共有するには、この記事を書いています、それはまた、あなたのゲームで便利になることがあります。

1、会社の長期的な資産としてあなたのコード

偉大なプログラマが一度コードを書くとき、あなたはあなたがプロジェクトに従事するようにのみ、その資産の価値に反映されていない考慮に入れる必要があり、私に言った、それはまた、あなたの会社の資産です。たとえば、「秋」で、プレイヤーキャラクターと話をする2つのシステム間の対話が表示されることがあります。

(gamasutraから)Evaluator_Dialogue

(gamasutraから)Evaluator_Dialogue

対話システムは、完全に独立しており、ユニティに少しセットが必要です。私は難なくいずれかのゲームを行うために私の将来の対話システムにこれを置くことができます。単純にそのOnGUI()関数は、対話システムのことができるようになります調整し、理想的には本当にピックで、一見のためのゲームのほとんどに適しています。言うまでもなく、これは多くの時間とお金を節約し、作業効率を向上させます。

覚えている:あなたがコードを書く時間を過ごすつもりなら、あなたはまた、あなたの会社にこれらのコードを作成し、生産プロセスに付加価値をもたらすために方法を考える必要があります。

グローバルクラスのインスタンス変数を使用して2、

そうすることは、特に別の部品と整頓を維持するという点で、私をたくさん助けました。主なアイデアは、このスクリプトのインスタンスにグローバル変数ポイントを設定するには、各スクリプトを与えることですので、あなたは、ラインで検査員の検索スクリプトラインを持たずに、いつでも、そのインスタンスにアクセスすることができます。しくみはこうです:

次のように私のメインDialogueSystem.csスクリプトでは、私は、同じタイプとそれに含まれるクラスで、変数の上に置きます:

パブリック静的DialogueSystemインスタンス。
またはJavaScriptで:
静的VARインスタンス:DialogueSystem。

次に、このスクリプトでアウェイク()関数は、あなただけ書きます:

インスタンス=この;

そして、単純にそのシーンがユニティロードされたときに、シーン内の任意のオブジェクトに添付のスクリプトを入れて、実験のスクリプトは、独自のDialogueSystem.instanceを放棄します。なぜこれが役に立つのですか?それは私が私の対話システムにアクセスしたい場合、私はちょうど記述する必要があることを意味します:

DialogueSystem.instance.SomePublicFunctionName();

Unityは私がDialogueSystemのインスタンスのシーンで関数を呼び出すしたいことを知っているだろう。

注:このアプローチは、与えられたシナリオインスタンスに1つだけのスクリプトが必要です。したがって、そのような対話システムなどの大型部品、のために非常に便利ですが、私は、シーン内のオブジェクトが無効になる可能性があり、あるいは間違って行くためにそれが複数回表示されるようにします。あなたは、このメソッドの実装の手段でより安全に興味を持っているしたい場合は、それについて自分自身をGoogleに。本論文では、もう少しシンプル。

図3に示すように、コールバックを使用して(委任又はMonobheaviour.SendMessage())

あなたはまだ初心者であれば、これはあなたのための少し複雑かもしれません。

我々はNIS(非対話型のシーケンス)を持っていると仮定し、我々は、いくつかの手順を歩いて停止し、NPCとの対話、そしてとき対話制御の終了は、バックプレーヤーの手にプレイヤーキャラクターをしたいです。この記事の第二の点なので、我々はあなたが単に対話システムをアクティブにするNISスクリプトから次の関数を呼び出すことができることを知っています:

DialogueSystem.instance.SomeFunctionToActivateDialogue()

しかし、対話を停止するときに我々が知っているか、NISスクリプトが戻ってプレイヤーにコントロールを与えることができますか?私たちは、コールバックを使用することができます。我々は最初のDialogueSystem.instance.Whatever()を呼び出すと、我々はそれを呼び出したときに、通知の終わりには、使用できるスクリプトを呼び出す関数パラメータにパラメータを渡すことができます。いくつかのアプローチがあります。私はそれがきれいなので、C#のデリゲートを使用することを好むが、あなたはJavascriptを使用している場合は、それに投票しないように。

デリゲート(C#)と

変数の関数としてそれを指しています。Bが完了するので、関数が機能を呼び出すことができるときの委任を使用し、あなたは、機能A Bへのパラメータとして機能させることができます。ここで私は、デリゲートを実行する方法を詳細に言いたくないが、プロセスは非常に簡単です。

読者が要求されている場合は、私は、より詳細なチュートリアルを書くのが大好きです。

MonoBehaviour.SendMessage(文字列)

Unityはいくつかの使用SendMessage関数コールバック関数を提供し、スクリプトの元関数は、関数の名前で呼び出すことができます。たとえば、私たちは「フー」と呼ばれるスクリプトがあると、それは「FooFunction」機能と呼ばれています。別のスクリプトでは、我々は、この変数は「ourFooVariable」であると仮定すると、私たちのインスタンス変数「foo」というスクリプトを指すようにする必要があります。だから我々は、呼び出すことができます。

ourFooVariable.SendMessage(「FooFunction」);

私たちは別の関数に、スクリプトのインスタンスと機能名を渡すことができますので、私たちは、callbackにこれを使用することができます。例えば、JavaScriptで:

スクリプト
A:----
関数スタート(){
ScriptB.MyFunction(この「MyCallback」)。//「これは」スクリプトAのこのinstane意味
}
{)(関数MyCallbackを
スクリプトBが終了した後、これがトリガーされます//。
}
----
スクリプトB:
----
関数MyFunctionを(コールバック:MonoBehaviour、cbName:文字列){
//いくつかのものはない
// ... ..
//がスクリプトAにコールバック:
callback.SendMessage(cbName)。
}
----

グローバルクラスのインスタンス変数と一緒にコールバックを使用して、我々はあなたが多かれ少なかれ別々の部品を作ることができます。システムの機能に対話するように、「秋」、NISのプレイヤーでは、対話は、単にNIS対話システムを呼び出し、それにコールバックを送信し、解雇されなければなりません。それが終了すると、ダイアログが元NIS、NISにコールバック関数を実行し、そのタスクを完了するために続けています。すべてではない混乱に。インスペクタでは、これらのシステムを一緒に整理する必要はありません。NISは、対話のエンコーダシステムを呼び出す必要はありませんでした。

4スクリプトの失敗を有効に

私たちは、念の対話システムを見てみましょう。対話システムが有効になっている「秋」、では、それは、グラフィカル・ユーザー・インターフェース(GUI)上にプロットされていました。私はそれがダイアログを表示されているかどうかを確認するために、スクリプトチェックに設定されていませんでした。その効果的な実行すると、システムは、独自の対話と失敗を開始することができるためですが、また、最初の午前2時と午前3時からです。

私は私の会話対話システムを有効にすると、コードの最初の行は、システムが独自の対話を開始することです。

this.enabled =はtrue。

対話が終了し、コールバックが送信されると、コードの最後の行は、それ自身の失敗にすることです。

this.enabled = falseは、

そうすることで、対話は、あまりにも多くのシステムリソースを占有し、必要なときにのみ有効になりません。

図5は、常に使用しての使用を避けるために、コルーチンUpdate--(コルーチン)

非常に一般的な設計アプローチは、関数内の簡単なコードのすべてのフレームランニング、一度だけ実行すると、結束を開発することです。例えば、各フレームで、の中及びフェードアウトするCHE方式がある画面外黒かどうかをチェックし、0-1の間の数を移動しています。これは、考慮しなければならないもの、常に、各フレームにそうなります。

スクリプトのために長い時間を待ってから、指示に従って、それについて何かをしたい多くの時間があります。私は最高の時間がコルーチンを使用することがわかりました。

基本的には、コルーチンは、あなたが何かをするためにいくつかのフレーム間の団結を作ることができ、その後、退出完了後。・フェードインとフェードアウトスクリプトは、中または画面のフェードアウトするコルーチンを作成することができ、常に更新する必要があり、そして時に完全に停止するので、更新は常にではありませんしません。

JavaScriptでは、簡単なコルーチンは、次のように:

VAR fadeAlpha:フロート= 0;
機能フェードイン(秒:フロート){
ながら(!fadeAlpha = 1){
fadeAlpha = Mathf.MoveTowards(fadeAlpha、1、Time.deltaTime *(1 /秒))。
産出;
}
}

この機能が起動している場合、それは1にfadeAlpha値は、秒数にそれを教えてくれます。そして、あなたはOnGUI機能では、スクリプトの使用と同様にfadeAlphaことを置くことができます。

統合

私たちは、FadeInOutスクリプトについて考える上でのアイデアのすべてを使用します。私たちは、シーンに入れ、その後インスタンスを1つだけFadeInOutスクリプトを作成し、それを無効にします。スクリプトは、そのアウェイク()関数を実行したときに、スクリプトは静的変数、インスタンスと呼ばれていることを確認し、それが自身のインスタンス変数を設定します。

次に、我々は、上記の機能に似て、このスクリプトのいくつかの機能を作成し、スクリプトを無効にするために、最初の行フェードイン()、フェードアウト(の最後の行)でスクリプトを可能にします。

私たちが望むならば、我々はコールバックシステムを実行することができますが、このスクリプトは単純すぎるかもしれ、コールバックシステムを実行する必要はありません。

我々はフェードアウト、私たちは(1)FadeInOut.instance.FadeOutを呼び出してゲーム画面をしたい場合はその後、試合は第二の後にフェードアウトします。我々はそれが再びフェードインしたい場合は、我々はFadeInOut.instance.FadeIn(1)を呼び出すことができ、ゲームは第二の後にフェードインします。

したがって、我々は、単純なFadeInOut良いスクリプトを作る、それは完全に独立しており、資源を無駄にしない、あなたは、ゲーム内の任意の団結あらゆるシーン、検査官のセットアップなしまたは転送中に配置することができます。

結論

組織を容易にするために、モジュール式のものを作ることは良くありませんが、時間をかけた値を見ることができます。私はまた、このプロセスに貢献する他のデザインパターンがあると言うあえて。私は私の説明が混乱しない願って、あなたがこの記事では、いくつかの物事を見ることを願っています。

「秋」クラウドファンディングの私のサポートを忘れないでください!(:ゲームの状態この記事は再版の連絡先については、いずれの著作権を保持しない転載することを拒否し、コンパイル/gamerboom.comゲームの状態です)

私はユニティ開発者として学んできたトップ5のもの

ジョン・ワーナーによります

Unityは、そのコンポーネント指向のプラットフォームは設計されてきれいで、アクセス可能な方法であること一つは多くの理由のために素晴らしいゲーム開発プラットフォームです。例えば、それは一緒にいくつかのコードをバタンと一日か二日に実行されている簡単な作業のプロトタイプを持っていることは非常に簡単です。しかし、その多様性にもかかわらず、私はUnityと特によく働くいくつかの慣行があることを長年にわたって発見しました。

私の新しいゲームでは、秋には、私はこれらの慣行の多くを取って、それらを組み合わせました。結果はで動作するように迅速かつ簡単になっていて、その私の最後の試合、比較的少数のバグを作成している、非常に滑らかな開発プロセスとなっています。秋の私の発表を祝う支援し、その新しいキックスターターキャンペーンを差し込みやすくするために、私はあなたのゲームであなたを助けるかもしれない私のお気に入りの設計手法の一部を共有するために、この記事を書いています。

あなたがこの記事のうちのいくつかの値を取得する場合は、キックスターターの秋をチェックしてみてください!

1:長期的な会社の資産としてあなたのコードを考えて

偉大なプログラマは、かつてあなたがコードを書くとき、あなたはあなたが取り組んでいるプロジェクトに資産としてではなく、あなたのビジネスに資産としてだけではなく、その値を検討する必要があることを教えてくれました。例えば、秋に、私はアバターを持つ2人のプレーヤー間の会話を表示できる対話システムを持っています:

この対話システムは、完全に独立だとユニティではほとんどセットアップを必要とするように書かれています。私は、非常に少ない作業で、この対話システムを取ると、私がしたい任意の将来のゲームにプラグインすることができます。それだOnGUI()関数の簡単な調整は、基本的に、理論的に箱から出してすぐ、ほとんどの場合、仕事ができる完全に機能的な対話システムが何であるかを再肌でした。言うまでもなく、これは多くの時間と費用、および増加速度を節約言うと、同様の側近にも創造的なプロセスを容易にします。

覚えている:あなたは、コードを書くために時間を投資するつもりなら、あなたは同様にあなたのビジネスと創造的なプロセスに値を追加する必要があります!

2:使用グローバルクラスインスタンス変数

このデザインパターンは、私に私のコンポーネントが別々と清潔に保つのに最も貢献してきました。ここでの考え方は、あなたがどこにもインスペクターのクロスワイヤスクリプトになくても、そのインスタンスにアクセスできるように、それぞれたり、主要なスクリプトのために、あなたは、そのスクリプトの特定のインスタンスを指すグローバル変数を設定することができます。ここではそれは、多かれ少なかれをどのように動作するかです:

私の主なDialogueSystem.csスクリプト内では、私はそれは次のように書かれ、クラスを含むだのと同じ型を持つ上部の変数を、持っています:

パブリック静的DialogueSystemインスタンス。

またはJavaScriptで:

静的VARインスタンス:DialogueSystem。

次に、スクリプトのアウェイク()関数の中で、あなたは、単に書く:
インスタンス=この;

あなたは、単にあなたのシーン内の任意のオブジェクトにこのスクリプトを添付し、ユニティ負荷がその場面、その特定のスクリプトインスタンスがそれにDialogueSystem.instanceを設定しますとき、自己のです。なぜこれが役に立つのですか?まあ、それは私が私のゲーム内のどこからでも、私の対話システムにアクセスしたい場合は、私がしなければならないすべてはタイプであることを意味します。

DialogueSystem.instance.SomePublicFunctionName();

そして、Unityは、私は私のシーンでDialogueSystemスクリプトの特定のインスタンスに関数を呼び出すしたいことを知っているだろう。

重要な注意 - このデザインパターンは、あなたが唯一の特定のシーンで1つのスクリプトのインスタンスを持っていることを意図しています。したがって、このような対話システムなどの大型部品、のために非常にうまく動作しますが、私はシーン内で複数回インスタンス化することができ、オブジェクトに使用しても無駄か問題となる想像します。あなたはこのパターンのより安全な実装に興味がある場合は、Google、「シングルトン」することができます - この記事の実装では、アクセシビリティのために、より簡単です。

3:使用コールバック(代表者またはMonobheaviour.SendMessage())

あなたが初心者なら、この1は、もう少し複雑です。このことを考慮:

私たちは、プレイヤーのキャラクターが、いくつかの手順を歩く停止、NPCとの対話を入力し、[対話が終了した後にプレイヤーに制御を戻したいNIS(非対話型配列)を考えてみましょう。まあ、理由はこの記事のポイント#2の、我々は、単に呼び出すことによって、NISスクリプトから対話システムを活性化させることができることを知っています

DialogueSystem.instance.SomeFunctionToActivateDialogue()

NISスクリプトがプレイヤーに制御を返すか、私たちが望む何かを行うことができるようにしかし、どのように、我々は対話が終了したときに知っていますか?まあ、我々はコールバックを使用することができます。我々は最初のDialogueSystem.instance.Whatever()を呼び出すと、私たちはその機能に最初の場所でそれを呼び出したスクリプトに通知するように仕上がっていますとき、それは使用することができますいくつかのパラメータを渡すことができます。これを行うためのいくつかの方法があります。彼らは少しきれいだから、私は非常に多く、C#で委任を使用して好むが、あなたはJavascriptを使用している場合、彼らはオプションではありませんね。

デリゲート(C#)と

基本的機能を指す変数として代表団を考えます。関数Bが完了すると、その関数Bは関数Aを呼び出すことができるように、デリゲートを使用して、あなたは、パラメータとして関数Bへの関数Aを渡すことができます。私はここでデリゲートを作成の詳細に得ることはありませんが、それはかなり単純なプロセスだと、これが学習を始めるのに良い場所です。

http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

私はいくつかの要求を取得する場合、私は、より詳細なチュートリアルを書くことが幸せになると思います。

MonoBehaviour.SendMessage(文字列)

Unityは、基本的には、関数の名前である文字列を使用して、スクリプト内の関数を呼び出すことができ、そのSendMessage関数を使用して、いくつかのコールバック機能を提供します。たとえば、私たちは「FooFunction」という名前の関数で「foo」という名前のスクリプトを持って言うことができます。別のスクリプト内では、我々は「foo」というスクリプトのインスタンスを指す変数を必要とするだろう、私たちは、変数「ourFooVariable」ことを呼んで言うことができます。私たちは、その後、呼び出すことができます

ourFooVariable.SendMessage(「FooFunction」);

私たちは別の関数へのスクリプトや関数名のインスタンスを渡すことができますので、我々は、コールバックのためにこれを使用することができます。例えば、JavaScriptで:

スクリプト
A:----
関数スタート(){
ScriptB.MyFunction(この「MyCallback」)。//「これは」スクリプトAのこのinstane意味
}
{)(関数MyCallbackを
スクリプトBが終了した後、これがトリガーされます//。
}
----
スクリプトB:
----
関数MyFunctionを(コールバック:MonoBehaviour、cbName:文字列){
//いくつかのものはない
// ... ..
//がスクリプトAにコールバック:
callback.SendMessage(cbName)。
}
----

グローバルクラスのインスタンス変数と一緒にコールバックを使用すると、あなたは多かれ少なかれ独立したコンポーネントを作成することができます。プレイヤーはNISにあり、対話システムをトリガする必要がある場合に秋に、NISは、単に対話システムを呼び出し、それにコールバックを送信し、対話システムの動作として何もしません。それが終了しています場合は、対話システムは、元のNISでコールバック関数を実行し、NISが、その後については行くそれがビジネスです。何もクロス配線する必要はありません。インスペクタで何の仕事は、これらのシステムは、一緒にきれいに再生するために取得する必要はありません。いいえNISのスクリプト作成は、それが彼らのコードでうまく動作させるために対話システムを台無しに必要ありません。それだけで動作します。

4.スクリプトは自分自身を無効にして有効にしましょう。

私たちの対話システムの例に再び戻って見てみましょう。対話システムが有効になっていると秋に、それは、GUIにすべての時間を描画します。私は天気を表示するスクリプトで何の小切手を持っていないか、それが対話を表示する必要がありません、それは単に、常にそれをしません。対話システムは、それが自己だ有効または無効にすることができ、これが原因で、点#2と3のよく働くので、これは動作します。

私は私の対話システムにおける対話を有効にすると、コードの最初の行は、それが自己だ有効にする対話システムのためであります:

this.enabled =はtrue。

対話が完了していると、コールバックが送信された場合には、コードの最後の行は、それが自己だ無効にします。

this.enabled = falseは、

この方法では、対話システムは、資源の方法で多くを取り、それが必要になるまで、単純に、いわば、そこに座って、その口をシャットしません。

5.すべての更新を使用してから離れて取得してください - コルーチンを使用してみてください。

ユニティ開発に非常に一般的なデザインパターンは、それが本当に唯一たまに実行する必要がある場合、すべてのフレームを実行機能に簡単なコードを配置することです。例えば、フレームごとに、天候やない、それは常に、画面の黒作り、その後、それはすべての単一のフレームこれを行い、0と1の間の数を移動する必要がありますをチェック人気のフェードイン・アンド・アウトソリューションは、ありますでも、時間の広大な、広大な、広大な、大多数が、これは全く考慮されている必要はありません。

スクリプトは、時間の長い期間を待ってから、コマンドで徐々に何かをしたい回がたくさんあります。私は、コルーチンは、多くの場合、この現象が発生することが最善の方法であることを見出しました。

ここではコルーチンの簡単なプライマーは団結しています

それが行わだとき基本的に、コルーチンで、あなたは団結が数フレームの上に何かを取得し、終了することができます。代わりに、常に更新していますフェードインとアウトのスクリプトを持つのは、更新が子供の浴室内の蛇口のように常に実行されていないので、単に完了時に停止することになる、またはアウトスクリーンをフェードするコルーチンを作成することができます。

JavaScriptでは、簡単なコルーチンは次のようになります。

VAR fadeAlpha:フロート= 0;
機能フェードイン(秒:フロート){
ながら(!fadeAlpha = 1){
fadeAlpha = Mathf.MoveTowards(fadeAlpha、1、Time.deltaTime *(1 /秒))。
産出;
}
}

この関数が実行されます場合は、それはあなたがそれを言うか今までに何秒以上1にfadeAlphaの値を変更します。その後、OnGUI機能では、上記のリンクでのスクリプトと同様にそのfadeAlpha値を使用します。

すべてを一緒に入れて

これらのアイデアのすべてを使用して、FadeInOutスクリプトを考えてみましょう。私たちは、FadeInOutスクリプトを作成し、シーンにインスタンスを1つだけplunkし、それを無効にします。確認してくださいスクリプトは、インスタンスと呼ばれる静的変数を持っており、スクリプトが実行されるとき、それは目覚めだ()関数は、それが自己だとインスタンス変数を設定します。

次に、我々はそれがフェードイン()の最初の行でスクリプトを有効に、上記のものと同様のスクリプトのいくつかの関数を作成し、)(フェードアウトの最後の行でスクリプトを無効にします。

私たちが望むならば、我々は、コールバックシステムを実装することができますが、このスクリプトは、おそらくそれを正当化するにはあまりにも簡単です。

私たちが今までフェードアウトするゲーム画面をしたい場合はその後、私たちは(1)FadeInOut.instance.FadeOutを呼び出します。そしてゲームは1秒かけてフェードアウトします。我々はそれが再びフェードインしたい場合は、我々は(1)FadeInOut.instance.FadeInを呼び出すことができますし、ゲームは1秒以上に戻ってフェードインします。

この方法では、我々は完全に独立して動作するシンプルなFadeInOutスクリプトを作成した、資源を無駄にしない、ので、今までに何インスペクタでセットアップなしまたはクロス配線と任意の単一のゲームや仕事のあらゆるシーンにポンすることができます。

結論

モジュラービットを作成すると、組織のためにちょうど良いではないですが、それはまた、時間をかけて、自分のための値を作成します。私は補佐官に他のデザインパターンこのプロセスがたくさんあると確信しています。私はあなたがこのうちいくつかの値を持って、私の説明があまりにも混乱はなかったことをことを願っています。あなたが読んで、質問を持っているもの好きなら、コメントを残して、私は応答するために全力を尽くしますしてください。(ソース:gamasutra

 

おすすめ

転載: www.cnblogs.com/LiTZen/p/11595797.html