Unity-quick-guide
Unity-はじめに
Unityは、2005年に Unity Technologies によって最初にリリースされたクロスプラットフォームゲームエンジンです。 Unityの焦点は、2Dおよび3Dゲームとインタラクティブコンテンツの両方の開発にあります。 Unityは現在、展開用に 20 を超えるさまざまなターゲットプラットフォームをサポートしていますが、最も人気のあるプラットフォームはPC、Android、iOSシステムです。
Unityは、グラフィックス、オーディオ、およびレベル構築ツールのインターフェイスを含む、ゲームの設計と構築のための完全なツールキットを備えており、プロジェクトで作業するために外部プログラムを最小限に使用する必要があります。
このシリーズでは、私たちは-
- Unityのさまざまな基本を使用する方法を学ぶ
- エンジンですべてがどのように機能するかを理解する
- ゲームデザインの基本概念を理解する
- 実際のサンプルゲームの作成と構築
- プロジェクトを市場に展開する方法を学ぶ
さあ始めましょう。
Unity-インストールとセットアップ
Unityでコンテンツを作成するための主な要件は、Unityエンジンと開発環境をダウンロードすることです。 コアエンジンと共に、さまざまなプラットフォームに展開するためのオプションの*モジュール*、およびUnityスクリプトをVisual Studioに統合するためのツールをダウンロードすることもできます。
Unityをインストールするには、https://unity3d.com/get-unity/download [this]にアクセスしてください。
- * Unity +ダウンロードを選択してください。*
次のページで、[個人]の下にある[今すぐ試す]ボタンをクリックします。 これはUnityの無料版で、すべてのコア機能が含まれています。 このシリーズを始めるとき、 Plus または Pro への購入を検討する前に、エンジンの使用方法を学習することをお勧めします。
次のページで、下にスクロールしてクリックし、あなたまたはあなたの会社が年間収入で100,000 USDを超えないことを確認します。 その場合、Unity Freeを試用することはできませんが、Proバージョンの30日間の無料トライアルにサインアップすることができます。
次に、Unityをインストールするための目的のプラットフォームをクリックします。 このシリーズでは、エンジンの Windows バージョンを扱います。 Unityを Ubuntu にインストールすることも可能です。追加のLinuxシステムの詳細については、https://wiki.archlinux.org/index.php/Unity3D [こちら]をご覧ください。
また、https://docs.microsoft.com/en-us/visualstudio/install/install-visual-studio?view = vs-2017 [Visual Studio]の最新バージョンをインストールすることを*強く*お勧めします。 Unityに同梱されている、標準のMonoDevelop IDE上の多くの便利なツール。
インストーラーがダウンロードされたら、Unityでインストールするコンポーネントを選択するメニューが表示されるまで、インストーラーを実行します。
ここで、必要なコンポーネントを選択します。 このシリーズでは、画像に表示されているコンポーネントをインストールします。 この選択には、エンジン自体、エンジンのドキュメント、IDEが含まれます。 Android用のツールと、後でプロジェクトに追加できるアセットのコレクションを作成します。
[次へ]をクリックし、指示とオプションを実行して、Unityをコンピューターにダウンロードしてインストールします。
Unityを開き、次のレッスンで最初のプロジェクトを作成します。
最初のプロジェクトを作成する
Unityは、2Dおよび3Dゲームの両方に等しく適しています。 Unityで作成されたすべてのゲームは、スタートアップ画面から*プロジェクト*として起動します。
新しくインストールしたUnityのコピーを開きます。以下に示すような画面が表示されます-
既存のプロジェクトは、上の画像のようにぼやけた領域に表示されます。
ウィンドウの右上隅に、上記の New アイコンが表示されます。 アイコンをクリックすると、プロジェクト設定画面が表示されます。
ここで、プロジェクトに名前を付け、保存場所を設定し、プロジェクトのタイプを設定し、既存のアセットを追加できます。
とりあえず、最初のプロジェクトに「Hello World!」という名前を付けて、 2D モードに設定します。
[プロジェクトの作成]をクリックして、Unityにプロジェクトのコアファイルを設定させます。 これには、コンピューターの速度、事前に追加されたアセット、プロジェクトの種類によっては時間がかかる場合があります。
エンジンを知る
新しいプロジェクトが作成されてUnityが開くと、次の画面が表示されます-
このウィンドウに表示されているものを簡単に確認してみましょう。 当分の間、私たちは4つの主要な地域に関係しています-
このウィンドウは、*シーン*を作成する場所です。 シーンは、ゲーム内のすべてが行われる*レベル*です。 小さな[ゲーム]タブをクリックすると、プレーヤーから見たゲームのプレビューウィンドウが表示されます。 とりあえず、単純な青色の背景にする必要があります。
この領域は*インスペクター*です。 シーンにオブジェクトがないので、今は空です。 インスペクタがどのように使用されるかについては、後で確認します。
このウィンドウは Scene Hierarchy です。 現在開いているシーン内のすべてのオブジェクトが、その親子階層とともにリストされます。 このリストにオブジェクトをすぐに追加します。
最後に、この領域は Project Assets ウィンドウです。 現在のプロジェクトのすべてのアセットはここに保存され、保持されます。 テクスチャ、フォント、サウンドファイルなどの外部からインポートされたすべてのアセットも、シーンで使用される前にここに保持されます。
次のレッスンでは、Unityでのゲームのワークフローと動作について説明します。
Unityの仕組み
Unityでは、すべてのゲームプレイは*シーン*で行われます。 シーンとは、ゲームレベル、タイトル画面、メニュー、カットシーンなど、ゲームのあらゆる側面が行われるレベルです。
デフォルトでは、Unityの新しいシーンには、 Main Camera というシーンに Camera オブジェクトがあります。 シーンに複数のカメラを追加することは可能ですが、ここではメインカメラのみを扱います。
メインカメラは、*ビューポート*と呼ばれる特定の領域で、表示または「キャプチャ」するすべてをレンダリングします。 この領域に入るものはすべて、プレーヤーに表示されます。
シーンビュー内にマウスを置き、下にスクロールしてシーンビューをズームアウトすると、このビューポートが灰色の長方形として表示されます。 (Altキーを押しながら右クリックしてドラッグすることもできます)。
シーン*自体は、 *GameObjects と呼ばれる*オブジェクト*から作成されます。 GameObjectsは、プレーヤーのモデルから画面上のGUIまで、ボタンや敵から、音源のような見えない「マネージャー」まで、何でもかまいません。
GameObjectsには一連の*コンポーネント*がアタッチされており、シーン内での動作や、シーン内の他のユーザーへの反応を記述しています。
実際、今それを探求することができます。 Scene Hierarchy の Main Camera をクリックして、 Inspector を確認します。 今は空ではありません。代わりに、一連の「モジュール」が含まれます。
GameObjectの最も重要なコンポーネントは、 Transform コンポーネントです。 シーンに存在するオブジェクトには、ゲームワールドまたはその親(存在する場合)に対する位置、回転、スケールを定義する transform があります。
*Add Component* をクリックして目的のコンポーネントを選択すると、追加のコンポーネントをオブジェクトに添付できます。 後続のレッスンでは、*スクリプト*をGameObjectsに添付して、プログラムされた動作を提供できるようにします。
コンポーネントのいくつかの例を考えてみましょう-
- レンダラー-オブジェクトのレンダリングと可視化を担当します。
- Collider -オブジェクトの物理的な衝突境界を定義します。
- 剛体-重量や重力などのリアルタイムの物理特性をオブジェクトに提供します。
- オーディオソース-サウンドを再生および保存するためのオブジェクトプロパティを提供します。
- オーディオリスナー-実際にオーディオを「聴き」、プレーヤーのスピーカーに出力するコンポーネント。 デフォルトでは、メインカメラに1つ存在します。
- Animator -オブジェクトにアニメーションシステムへのアクセスを提供します。
- Light -オブジェクトを光源として動作させ、さまざまな効果をもたらします。
このチャートでは、UnityがGameObjectsを介してシーンに*構成*される様子を確認できます。
次のレッスンでは、最初のGameObjectを作成し、スクリプトに飛び込みます。
Unity-スプライトの作成
- スプライト*は、グラフィックイメージ(*テクスチャ*と呼ばれる)が配置された単純な2Dオブジェクトです。 エンジンが2Dモードの場合、Unityはデフォルトでスプライトを使用します。 3D空間で表示すると、スプライトはZ幅がないため紙のように薄く見えます。
スプライトは、3D空間で回転しない限り、常に垂直にカメラに向きます。
Unityは新しいスプライトを作成するたびに、テクスチャを使用します。 次に、このテクスチャが新しいGameObjectに適用され、 Sprite Renderer コンポーネントがそれにアタッチされます。 これにより、gameObjectがテクスチャで表示され、画面上での表示に関連するプロパティが提供されます。
Unityでスプライトを作成するには、エンジンに*テクスチャ*を提供する必要があります。
最初にテクスチャを作成しましょう。 使用するPNGやJPGなどの標準的な画像ファイルを取得して保存し、画像をUnityの Assets 領域にドラッグします。
次に、画像を Assets から Scene Hierarchy にドラッグします。 マウスボタンを離すとすぐに、リストにテクスチャの名前を持つ新しいGameObjectが表示されます。 また、 Scene View の画面中央に画像が表示されます。
スプライトを作成する際に次の点を考慮しましょう-
- 外部ソースからUnityにドラッグすることにより、 Asset を追加しています。
- このアセットは画像であるため、*テクスチャ*になります。
- このテクスチャをシーン階層にドラッグすることで、テクスチャと同じ名前で、スプライトレンダラーがアタッチされた新しいGameObjectを作成しています。
- このスプライトレンダラーは、そのテクスチャを使用してゲーム内に画像を描画します。
これで、シーンに*スプライト*が作成されました。
次のレッスンでは、持っているスプライトの*修飾子*を見ていきます。
Unity-スプライトの変更
インポートしたばかりのスプライトをさまざまな方法で操作して、外観を変更することもできます。
エンジンのインターフェースの左上隅を見ると、以下に示すようなツールバーがあります-
これらのボタンの機能について説明しましょう。
- *手*ツールは、オブジェクトに影響を与えずにシーン内を移動するために使用されます。
- 次に、 Move ツールがあります。 これは、ゲームの世界でオブジェクトを移動するために使用されます。
- 中央には、ゲームワールド(または親オブジェクト)のZ軸に沿ってオブジェクトを回転させる Rotate ツールがあります。
- *スケーリング*ツールは上に配置されます。 このツールを使用すると、特定の軸に沿ってオブジェクトのサイズ(スケール)を変更できます。
- 最後に、 Rect ツールがあります。 このツールは、 Move と Scaling ツールの組み合わせのように動作しますが、精度が低下する傾向があります。 UI要素を配置する際により便利です。
これらのツールは、プロジェクトの複雑さが増すにつれて価値があります。
Unity-変換とオブジェクトの子育て
始めたばかりのとき、gameObjectの変換が間違いなくその最も重要なコンポーネントである方法について説明しました。 この章では、コンポーネントについて詳しく説明します。 さらに、 Object Parenting の概念についても学習します。
変換には、 position 、 rotation 、 scale の3つの目に見えるプロパティがあります。 これらはそれぞれ、3つの軸に対して3つの値を持っています。 2Dゲームは通常、位置決めに関してはZ軸に焦点を合わせません。 2DゲームでのZ軸の最も一般的な使用は、_parallax_の作成です。
回転プロパティは、ゲームワールドまたは親オブジェクトに対して、オブジェクトがその軸を中心に回転する回転量(度単位)を定義します。
オブジェクトのスケールは、元のサイズまたはネイティブサイズと比較したときのオブジェクトの大きさを定義します。 たとえば、2x2の次元の正方形を考えてみましょう。 この正方形をX軸に対して3倍、Y軸に対して2倍にスケーリングすると、サイズが6x4の正方形になります。
次のセクションでは、 Object Parenting とは何かについて説明します。
オブジェクトの子育てとは
Unityでは、オブジェクトは Hierarchy システムに従います。 このシステムを使用すると、GameObjectは他のGameObjectの「親」になることができます。
GameObjectに親がある場合、ゲームワールドではなく別のGameObjectに関してすべての変換変更を実行します。
たとえば、(10、0、および0)に親が配置されていないオブジェクトは、ゲームワールドの中心から10単位の距離にあります。
ただし、(10、0、0)に配置された親を持つ* gameObjectは、*親の*現在位置を中心と見なします。
GameObjectsは、目的の親にドラッグアンドドロップするだけで親にできます。 「子」オブジェクトは、親オブジェクトの横にある矢印とともに小さなインデントでオブジェクトリストに表示されます。
GameObjectsのペアレント化には多くの用途があります。 たとえば、戦車のすべての異なる部分は、「tank」という名前の単一のGameObjectの下に親を持つ別個のGameObjectである場合があります。 このように、この「タンク」親GameObjectが移動すると、親に従って位置が常に更新されるため、すべてのパーツが一緒に移動します。
後続のレッスンでは、内部資産について説明します。 また、プロジェクトでアセットを作成および管理する方法についても学習します。
Unity-内部資産
オーディオファイル、画像、3Dモデルなどの他のプログラムからインポートする外部アセットに加えて、Unityは Internal アセットの作成も提供します。 Unity内で作成されるこれらのアセットは、作成または変更するために外部プログラムを必要としません。
- 内部*資産のいくつかの重要な例は以下のとおりです-
- シーン-これらは「レベル」として機能します。
- アニメーション-これらには、gameObjectのアニメーションのデータが含まれています。
- 材料-これらは照明がオブジェクトの外観にどのように影響するかを定義します。
- スクリプト-ゲームオブジェクト用に記述されるコード。
- プレハブ-これらはゲームオブジェクトの「青写真」として機能するため、実行時に生成できます。
その他の重要なアセットには、プレースホルダー、スプライト、モデルがあります。 クイックプレースホルダーが必要な場合に使用されるため、後で適切なグラフィックスやモデルに置き換えることができます。
内部アセットを作成するには、アセットフォルダーを右クリックして、*作成*に移動します。
この例では、 Triangle と Square を作成します。
*Sprites* 選択をスクロールして、 *Triangle* をクリックします。
*Square* のプロセスを繰り返します。2つの新しいグラフィックアセットが必要です。
これらの内部資産は、適切なゲームを構築するために重要であるため、これらの内部資産をさらに調査していきます。
Unity-シーンの保存と読み込み
1日の終わりに、かなりの量の作業を終えたら、進捗を保存する必要があります。 Unityでは、Ctrl + Sを押してもプロジェクトは直接保存されません。
Unityのすべてはシーンで発生します。 保存と読み込みも同様です。現在の作業をシーン(.unity拡張子)としてアセットに保存する必要があります。
試してみましょう。 Ctrl + Sを押してシーンに名前を付けると、Assetsリージョンに新しいアセットが表示されます。 これはシーンファイルです。
それでは、新しいシーンを作成してみましょう。 これを行うには、アセットを右クリックして、作成→シーンに進みます。 新しいシーンに名前を付けて、Enterキーを押します。
エディターモード(ゲームがプレイされていないとき)では、シーンをダブルクリックしてエディターに読み込むことができます。 現在のシーンに未保存の変更を含むシーンをロードすると、変更を保存または破棄するように求められます。
最初のスクリプト
画像をインポートしてゲーム内に静止させても、実際にどこにでも行けるわけではありません。 おそらく、素敵な額縁を作るでしょうが、ゲームではありません。
- スクリプト*はUnityでゲームを作成するために不可欠です。 スクリプティングとは、コンポーネントのようにシーン内のGameObjectにアタッチされるコードの*ブロック*を記述するプロセスです。 スクリプティングは自由に使える最も強力なツールの1つであり、優れたゲームを作成したり壊したりできます。
Unityでのスクリプト作成は、UnityScriptとして知られるC#またはUnityのJavaScript実装によって行われます(ただし、2018年のサイクルでは、UnityScriptは非推奨段階にあるため、使用しないことをお勧めします)。 このシリーズでは、C#を使用します。
新しいスクリプトを作成するには、アセットを右クリックして、[作成]→[C#スクリプト]に移動します。 エンジンの上部バーにある[アセット]タブを使用することもできます。
新しいスクリプトを作成すると、新しいアセットが表示されます。 とりあえず、名前はそのままにして、ダブルクリックします。 スクリプトとともにデフォルトIDEが開きます。 それが実際に何であるかを見てみましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
//Use this for initialization
void Start() {
}
//Update is called once per frame
void Update() {
}
}
スクリプト名は、 MonoBehaviour から派生した class として表示されます。 MonoBehaviourとは何ですか? クラスとメソッドの膨大なライブラリです。 Unityのすべてのスクリプトがいずれかの方法から派生するのに役立ちます。 Unityでスクリプトを記述するほど、MonoBehaviourが実際にどれほど便利であるかを実感できます。
先に進むと、戻り値の型を持たない2つのプライベートスクリプト、つまり Start および Update メソッドがあります。 Start メソッドは、これが使用されるgameObjectがシーンでアクティブになっている最初のフレームに対して* 1回*実行されます。
*Update* メソッドは、Startメソッドの後、ゲームのすべてのフレームを実行します。 通常、Unityのゲームは60 FPSまたはフレーム/秒で実行されます。つまり、オブジェクトがアクティブな間、 *Update* メソッドが1秒間に60回呼び出されます。
Unityスクリプトを使用すると、MonoBehaviourクラス全体と、ジェネリックコレクション、ラムダ式、XML解析などのコアC#機能を活用できます。 次のレッスンでは、最初のコードを作成します!
Unity-基本的な動きのスクリプト
このレッスンでは、ユーザーの入力に基づいてgameObjectを上下左右に移動させるコードを記述します。 これにより、Unityスクリプトのワークフローをより簡単に理解できるようになります。
すべてのGameObjectには少なくとも1つのコンポーネント- Transform があることに注意してください。 特別なのは、gameObjectの変換もUnityのスクリプト側の変数として表示されるため、コードを使用して変更できることです。 これは、変換にも制限されません。 Unityのすべてのコンポーネントにはプロパティがあり、スクリプトの変数からアクセスできます。
移動スクリプトから始めましょう。 新しいスクリプトを作成し、「Movement」という名前を付けます。
ここで、スクリプトを開くと、前回のレッスンで見たものと同じものが表示されるはずです。
*speed* という名前のパブリックfloat変数を作成しましょう。 Unityで変数を *public* にすることには大きな利点があります-
- 変数はエディター内で変更可能なフィールドとして表示されるため、コードの値を手動で調整する必要はありません。
public class Movement : MonoBehaviour {
public float speed;
}
他のメソッドに触れずにこのスクリプトを保存すると、Unityでコンパイルされるはずです。
(コンパイル中は、右下のBufferアイコンで確認できます。)
次に、アセットからGameObjectにスクリプトを*ドラッグアンドドロップ*します。 あなたが正しくそれを行う場合、これはあなたがGameObjectのプロパティに表示されるはずです-
速度値は調整可能であり、コード内で常に変更する必要がないため、start()の代わりにupdate()メソッドを使用できます。
ここで、Updateメソッドの目的を考えてみましょう-
- ユーザー入力を確認してください。
- ユーザー入力がある場合は、入力の指示を読んでください。 *速度と方向に基づいてオブジェクトの変換の位置値を変更します。 これを行うには、次のコードを追加します-
void Update() {
float h = Input.GetAxisRaw(“Horizontal”);
float v = Input.GetAxisRaw(“Vertical”);
gameObject.transform.position = new Vector2 (transform.position.x + (h* speed),
transform.position.y + (v * speed));
次に、breifのコードについて説明します。
まず、 h (水平用)という名前の浮動小数点変数を作成し、その値は Input.GetAxisRaw メソッドによって指定されます。 このメソッドは、プレーヤーが上/下/左/右矢印で押したキーに応じて、-1、0、または1を返します。
Inputクラスは、キー入力、マウス入力、コントローラー入力などの形式でユーザーから入力を取得します。 GetAxisRawメソッドは少し理解しにくいので、後で説明します。
次に、gameObjectの位置を、新しい Vector2 を作成して定義された新しい位置に*更新*します。 Vector2は、それぞれ xおよびy 値である2つのパラメーターを取ります。 x値には、オブジェクトの*現在*位置とその*速度*の合計を提供し、キーがその位置に押されるたびにフレームに効果的にいくらかの量を追加します。
このスクリプトを保存し、Unityに戻ります。 Unityは、正常にコンパイルされるとすべてのスクリプトを自動的に更新するので、スクリプトを何度も再添付する必要はありません。
以上で、GameObjectのプロパティの speed の値を0.8に変更します。 これは重要です。値が高いとプレイヤーの動きが速すぎます。
さあ、 Play をクリックして、あなたの最初の小さなゲームを実際に見てください!
矢印キーを押して移動してみてください。 ゲームを停止するには、もう一度[再生]を押します。 速度をリアルタイムで調整することもできるため、常に停止したり開始したりする必要はありません。
次のレッスンでは、剛体と衝突について学習します。
Unity-衝突を理解する
Unityの衝突は、実際のスプライト自体から分離され、個別のコンポーネントとしてアタッチされ、独自に計算されます。 この背後にある原因を学びましょう。
ゲームの*すべて*はGameObjectです。 レベルを構成する個々のタイルでさえ、それ自体がGameObjectです。
すべてのコンポーネントをGameObjectとして考えると、シーンには*何千*ものGameObjectが存在し、何らかの方法で相互作用する可能性があることがわかります。 UnityがすべてのGameObjectにコリジョンを追加した場合、エンジンがそれらのすべてのコリジョンのコリジョンを計算することは実用的ではないと想像できます。
プレーヤーキャラクターが衝突できる単純な「壁」を追加します。 これを行うには、別のスプライトを作成し、Rectツールを使用して拡大します。 また、Sprite Rendererコンポーネントの Color プロパティを介して赤色を与えます。
次に、インスペクターの[コンポーネントの追加]に移動し、「Box Collider 2D」と入力します。 表示される最初のコンポーネントをクリックすると、新しいコンポーネントが表示されます。
GameObjectの周囲に明るい緑の線が表示されます。 これが*衝突境界*です。 これは、衝突可能なオブジェクトの実際の*形状*を定義するものです。
移動可能なGameObjectでも同じことを繰り返します。
もちろん、Unityでの衝突は単なるボックスに限定されません。 それらはさまざまな形とサイズに及ぶことができ、必ずしもオブジェクトのパラメーターのレプリカではありません。
また、多角形の形状をとることもできます。
開発者と設計者が衝突境界で*近似*形状を使用して、コライダーを単純化し、エンジンの不要な計算を回避することは珍しくありません。 コライダーでさまざまな形状やサイズを作成する方法をすぐに学習します。
コリジョン境界が設定されたので、プレイを押して、実際に動作する様子を確認してください。
可動オブジェクトが正常に動作していないことに気付くでしょう。 オブジェクトの動作については、後続の章で説明します。
ユニティ-剛体と物理学
前章の衝突の主な問題はコードにありました。 * GameObjectの位置の値を直接変更します*。 プレイヤーがキーを押している場合、単に位置に値を追加しています。 境界線や他のGameObjectに適切に反応するようにプレーヤーを移動させる方法が必要です。
そのためには、*剛体*とは何かを理解する必要があります。 リジッドボディは、GameObjectが*リアルタイム物理*に反応できるようにするコンポーネントです。 これには、力と重力、質量、抗力、運動量に対する反応が含まれます。
*Add Component* をクリックして、検索フィールドにRigidbody2Dを入力するだけで、RigidbodyをGameObjectにアタッチできます。
Rigidbody2Dをクリックすると、コンポーネントがGameObjectにアタッチされます。 添付されたので、多くの新しいフィールドが開かれたことがわかります。
デフォルト設定では、GameObjectは重力により垂直に*下*に落ちます。 これを回避するには、 Gravity Scale を0に設定します。
ゲームオブジェクトは物理コンポーネントとは関係がないため、ゲームをプレイしても目に見える違いはありません。
問題を解決するために、コードを再度開いて書き直します。
public class Movement : MonoBehaviour {
public float speed;
public Rigidbody2D body;
//Update is called once per frame
void Update() {
float h = Input.GetAxisRaw(“Horizontal”);
float v = Input.GetAxisRaw(“Vertical”);
body.velocity = new Vector2(h *speed, v* speed);
}
}
宣言でRigidbody2Dへの*参照*を作成し、更新コードがオブジェクトの変換ではなくその参照で機能することがわかります。 これは、剛体に移動の責任が与えられたことを意味します。
*body* 参照はNullReferenceExceptionをスローすることが予想されます。何も割り当てていないためです。 ゲームをそのままコンパイルして実行すると、エディターの左下に次のエラーが表示されます
これを修正するために、スクリプトによって作成されたコンポーネントを考えてみましょう。 速度変数で行ったように、パブリックプロパティはUnityで独自のフィールドを作成することに注意してください。
速度を5前後のより高い値に調整し、ゲームをプレイします。
これで衝突が正しく機能するようになりました!
ユニティ-カスタム衝突境界
この章では、カスタム衝突境界について学習します。 また、コライダーのサイズと形状を調整する方法も学びます。
Box Colliderから始めましょう。 Box Collider(2D)には4つの調整可能な側面があり、長方形のような形をしています。 コライダーのコンポーネントで、このボックスをクリックします-
コライダーに4つの「ハンドル」が表示されます。 これらのハンドルをドラッグしてサイズを調整できます。
シンプルな形状の場合、適切な形状を選択すれば、Unityはコライダーの形状に最適な適合を検出します。 たとえば、サークルスプライトでサークルコライダーを選択すると、その半径に一致します。
より複雑な形状の場合、Unityは最もシンプルでありながら最も精巧なコライダー形状を作成しようとします。 そのためには、 Polygon Collider 2D を使用する必要があります。
[コライダーの編集]ボタンをクリックして、コライダーの調整を試します。
プレハブとインスタンス化の理解
オブジェクトのインスタンス化と破棄は、ゲームプレイ中に非常に重要と見なされます。 インスタンス化とは、単に存在させることを意味します。 ゲーム内でアイテムが表示または「スポーン」され、敵が死亡し、GUI要素が消滅し、ゲーム内で常にシーンが読み込まれます。 不要なオブジェクトを適切に取り除く方法と、自分で行うオブジェクトを取り込む方法を知ることは、さらに重要になります。
まず、「プレハブ」とは何かを理解しましょう。 プレハブは、Unityでインスタンス化がどのように機能するかを理解するために重要であると考えられています。
- プレハブ*は、GameObjectの*青写真*に似ています。 プレハブは、ある意味では、シーンが作成されたときに存在していなかったとしても、複製してシーンに入れることができるGameObjectの*コピー*です。言い換えれば、プレハブを使用して*動的にGameObjects *を生成できます。
プレハブを作成するには、目的のGameObjectをシーン階層からプロジェクト Assets にドラッグするだけです。
ここで、GameObjectをインスタンス化するために、スクリプトで* Instantiate()メソッドを呼び出します。 *MonoBehaviour で定義されているこのメソッドは、GameObjectをパラメーターとして受け取るため、どのGameObjectを作成/複製するかがわかります。 また、新しくインスタンス化されたオブジェクトのトランスフォームを変更したり、ペアレント化するためのさまざまなオーバーライドがあります。
*Space* キーが押されるたびに、新しい*六角形*をインスタンス化してみましょう。
*Instantiator* という新しいスクリプトを作成して開きます。 *Update* メソッドで、以下のコードを入力します。
ここでは、 Input クラスの GetKeyDown メソッドを使用して、最後のフレームでプレーヤーが特定のボタンを押したかどうかを確認しています。 チェックを続けたいので、毎秒60回実行される Update に入れます。 GetKeyDownメソッドは、 KeyCode 列挙型(標準キーボード上のすべての可能なキーをリストする)で指定されたキーがそのフレームで押されると、 true を返します。
public class Instantiator : MonoBehaviour {
public GameObject Hexagon;
//Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
Instantiate(Hexagon);
}
}
}
上部のパブリックGameObject宣言は、以前のレッスンでRigidbody2D用に作成したものと同様のスロットを作成します。 ただし、このスロットは prefabs (エディター時)および gameObjects (ランタイム)のみを受け入れます。
スクリプトを保存し、コンパイルさせます。 完了したら、オブジェクト階層の右クリックメニューに移動し、[空の作成]を選択して、新しい*空*のGameObjectを作成します。
このオブジェクトに Instatiator Object などのわかりやすい名前を付け、新しく作成したスクリプトを添付します。 GameObjectに表示されるスロットで、作成したプレハブをドラッグします。
ここでゲームを実行すると、スペースバーを押すと、プレハブの作成に使用したものと同じ新しい六角形オブジェクトが作成されます。 オブジェクト階層で作成されている各六角形を確認できます。 それらがゲームに表示されないのは、当面の間、それらはすべて*正確に*重ねて作成されるためです。
次のレッスンでは、オブジェクト破壊の概念を理解します。
Unity-GameObject Destruction
GameObjectsの破壊は、インスタンス化と同じくらい重要です。 この章では、GameObjectを破壊する方法を学びます。
幸いなことに、GameObjectsを破棄するのは、作成するのと同じくらい簡単です。 破棄するオブジェクトへの参照が必要なだけで、この参照をパラメーターとして* Destroy()*メソッドを呼び出します。
ここで、割り当てられたキーが押されたときに自身を破壊する5つの六角形を作成してみましょう。
*HexagonDestroyer* という新しいスクリプトを作成し、Visual Studioで開きます。 まず、公開の *KeyCode* 変数を作成します。 KeyCodeは標準キーボードのキーを指定するために使用され、そのメソッドのInputクラスはそれを使用します。 以前にRigidbodyとPrefabsで行ったように、この変数をパブリックにすることで、エディターからアクセス可能にできます。 変数を公開する場合、「KeyCode.A」などの値をコードに*ハードコード*する必要はありません。 コードは、必要な数のオブジェクトで柔軟に作成できます。
public class HexagonDestroyer : MonoBehaviour {
public KeyCode keyToDestroy;
//Update is called once per frame
void Update () {
if (Input.GetKeyDown(keyToDestroy)) {
Destroy (gameObject);
}
}
}
メソッドで「gameObject」という名前の変数(小さなg、大文字のO)をどのように使用したかを観察します。 ( GameObject 型の)この新しい gameObject 変数は、このスクリプトが関連付けられているgameObjectを参照するために使用されます。 このスクリプトを複数のオブジェクトにアタッチすると、この変数が関係するときはすべて同じように反応します。
ただし、両者を混同しないでください。
- 大文字のGとOを持つ GameObject は、すべてのGameObjectを包含する class であり、Instantiate、Destroy、およびコンポーネントを取得するメソッドなどの標準メソッドを提供します。
- small gおよび大文字のOを持つ gameObject は、このスクリプトが現在接続されているgameObjectを参照するために使用されるGameObjectの特定の*インスタンス*です。
コードをコンパイルして、Unityに戻りましょう。
次に、新しい六角形のスプライトを作成し、スクリプトを添付します。 次に、階層内のgameObjectを右クリックし、 Duplicate を選択します。 階層に新しいスプライトが作成されます。 *移動*ツールを使用して位置を変更する必要があります。 手順を繰り返して、同様の六角形を作成します。
各六角形をクリックして、スクリプトコンポーネントを確認します。 個々のキーを設定して、そのキーが押されたときにGameObjectがそれ自体を破棄できるようになりました。 たとえば、5つの六角形を作成し、A、S、D、F、およびGキーが押されたときに破壊するように設定します。
複数の六角形に同じキーを設定できます。キーを押すと、すべてが同時に破壊されます。これは、 gameObject 参照の使用例です。この参照を使用すると、スクリプトを使用して個々に設定せずに個々のオブジェクトを参照できます。
同じキーを複数の六角形に設定できます。キーを押すと、すべてが同時に破壊されます。これは、 gameObject 参照の使用例です。この参照を使用すると、スクリプトを使用して個々に設定せずに個々のオブジェクトを参照できます。
GameObjectを破壊しても、オブジェクトが粉砕または爆発するわけではないことを理解することが重要です。 オブジェクトの破棄は、ゲーム(およびそのコード)に関する限り、その存在を単純に(すぐに)停止します。 このオブジェクトとその参照へのリンクは現在切断されており、それらのいずれかにアクセスまたは使用しようとすると、通常エラーとクラッシュが発生します。
Unity-コルーチン
Unityでゲームを作成する場合、コルーチンは最も役立つツールです。 コルーチンが何であるかを理解するために、以下に示すコード行を考えてみましょう。
IEnumerator MyCoroutineMethod() {
//Your code here…
yield return null;
}
通常、Unityで関数(または実際にはC#)を呼び出すと、関数は最初から最後まで実行されます。 これは、コードに関する限り、「通常の」動作と見なすものです。 ただし、関数を意図的に遅くしたり、実行する1秒未満の時間だけ待機させたい場合があります。 コルーチンはまさにそれが可能です。コルーチンは、そのプロセスを完全に一時停止するだけでなく、そのプロセスを*待機*および*タイミング*することができる機能です。
コルーチンがどのように機能するかを理解するための例を考えてみましょう。 1秒間隔で色を赤と青の間で変える正方形を作りたいとします。
まず、スプライトを作成します。 次に、新しいスクリプトを作成し、 ColorChanger という名前を付けます。 このスクリプトでは、スプライトの Sprite Renderer への参照を取得します。 ただし、コンポーネントを取得する別の方法を使用します。 これまでのようにコンポーネントをスロットにドラッグアンドドロップする代わりに、コンポーネント自体を検出するようコードに要求します。
これは、 GetComponent メソッドを介して行われます。このメソッドは、検出した最初に一致するコンポーネントを返します。 オブジェクトごとに使用するスプライトレンダラーは1つだけなので、このメソッドを使用して、毎回レンダラーへの参照を自動的に検出および取得できます。
レンダラーはスプライトを実際に画面上に表示する責任があることに注意してください。 レンダラーには、スプライトのグローバルカラーに影響する color プロパティがあります。これは変更される値です。 *色*の値を公開すると、オペレーティングシステムのデフォルトの色選択プログラムのエディターでそれらを選択できるようになります。
private SpriteRenderer sr;
public Color color1;
public Color color2;
void Start () {
sr = GetComponent<SpriteRenderer>();
StartCoroutine(ChangeColor());
}
IEnumerator ChangeColor() {
while (true) {
if (sr.color == color1)
sr.color = color2;
else
sr.color = color1;
yield return new WaitForSeconds(3);
}
}
ここで、while関数でコルーチン関数をトラップします。
C#でコルーチンを作成するには、 IEnumerator を返すメソッドを作成するだけです。 また、 yield return ステートメントも必要です。 yield returnステートメントは特別です。 Unityに実際にスクリプトを一時停止して次のフレームに進むように指示するものです。
リターンを生み出すために使用できる方法はいくつかあります。その1つは、 WaitForSeconds クラスのインスタンスを作成することです。 これにより、コルーチンは続行する前に実世界の一定の秒数だけ待機します。
コードをコンパイルして、Unityに戻りましょう。 交互の色を選択して、プレイをヒットします。 これで、オブジェクトは3秒間隔で2色を切り替えるはずです。 間隔をパブリック変数にし、色の変更の頻度も調整できます。
コルーチンは、先ほど行ったような timed メソッドに広く使用されています。 さまざまな WaitForX メソッドには独自の用途があります。 コルーチンは、ゲームが同時に実行されている間に、単独で実行される「サイド」プロセスを実行するためにも使用されます。 これは、たとえば、プレーヤーが1つのポイントから開始している間に、大きなレベルのオフスクリーンパーツを読み込む場合に便利です。
Unity-コンソール
コンソールは、 Developer の出力を読み取る場所です。 これらの出力を使用すると、テスト用の追加機能を提供することなく、コードのビットをすばやくテストできます。
デフォルトのコンソールに表示されるメッセージには3つのタイプがあります。 これらのメッセージは、ほとんどのコンパイラ標準に関連している可能性があります-
- エラー
- 警告 *メッセージ
エラー
エラーは、コードの実行を妨げる問題または例外です。
警告
警告は、コードの実行を停止することはありませんが、実行時に問題を引き起こす可能性がある問題です。
メッセージ
メッセージは、ユーザーに何かを伝える出力です。通常、問題を強調することはありません。
コンソールに独自のメッセージ、警告、エラーを出力させることもできます。 そのためには、Debugクラスを使用します。* Debug *クラスはMonoBehaviourの一部であり、コンソールにメッセージを書き込むメソッドを提供します。これは、スタータープログラムで通常の出力メッセージを作成する方法と非常に似ています。
コンソールは、アセット領域の上にあるラベル付きタブで見つけることができます。
コンソールの出力は、エンドユーザーやプレーヤーではなく、*プログラマー*にとってより有用です。
コンソールに簡単なメッセージを書いてみましょう。 これにより、スペースキーが押されたときに通知されます。 このために、パラメーターとして Object を受け取る Log メソッドを使用し、文字列を使用します。
新しいスクリプトから開始するか、既存のスクリプトを変更できます。
void Update() {
if (Input.GetKeyDown(KeyCode.Space))
Debug.Log(“Space key was pressed!”);
}
(もちろんGameObjectにアタッチすることで)このコードを保存、コンパイル、実行し、スペースバーを押してみてください。
注-メッセージがエディターの下部に表示されることに注意してください。
[コンソール]タブをクリックすると、メッセージが印刷されます。
同様に、 LogWarning メソッドを使用して警告を出力し、* LogErro * rメソッドでエラーを出力することもできます。 これらは、後で説明するように、実際に実装しなくても小さなコードをテストするのに役立つことがわかります。
Unity-オーディオの概要
ゲームがオーディオを重視する理由があります。ゲームに美的価値を加えることは非常に重要です。 最初の Pong から、ボールが交互にパドルを打つとビープ音とブープ音が聞こえます。 当時は非常に単純な短い方形波のサンプルでしたが、すべてのビデオゲームの祖父からさらに何を望みますか?
実際の生活では、多くのことがサウンドの知覚方法に影響します。オブジェクトの速度、シナリオの種類、および方向から。
エンジンに不必要な負荷をかける要因はいくつかあります。 代わりに、ゲームでサウンドがどのように機能するかのアイデアを作成し、それを基に構築しようとします。 これは、対処する3つの軸がある3Dゲームで特に顕著になります。
Unityには、オーディオの知覚と再生のための専用コンポーネントがあります。 これらのコンポーネントが連携して、ゲームに自然に感じられる信頼できるサウンドシステムを作成します。
Unityは、リバーブ、ドップラーエフェクト、リアルタイムミキシングとエフェクトなどの便利なツールとエフェクトを提供します。 これらについては、後続の章で学習します。
オーディオコンポーネント
このセクションでは、Unityのオーディオに関連する3つの主要なコンポーネントについて学習します。
AudioSource
AudioSourceコンポーネントは、GameObjectにアタッチしてサウンドを再生する主要なコンポーネントです。 目覚めたときに、ミキサー、コード、またはデフォルトでトリガーされたときに AudioClip を再生します。
AudioClipは、単にAudioSourceにロードされるサウンドファイルです。 .mp3、.wavなどの任意の標準オーディオファイルを使用できます。 AudioClipは、それ自体のコンポーネントでもあります。
AudioListener
AudioListenerは、シーンで再生されているすべてのオーディオを*聴き*、コンポーネントをコンピューターのスピーカーに転送するコンポーネントです。 ゲームの*耳*のように機能します。 聞こえる音声はすべて、このAudioListenerの位置の観点にあります。 適切に機能するためには、シーンにAudioListenerを1つだけ配置する必要があります。 デフォルトでは、メインカメラにはリスナーが接続されています。 リスナーには、設計者が気にする公開プロパティはありません。
オーディオフィルター
AudioSourceの出力またはAudioListenerの取り込みは、Audio Filtersを使用して変更できます。 これらは、リバーブ、コーラス、フィルタリングなどを変更できる特定のコンポーネントです。 特定の各フィルターは、その値を微調整するための公開された値を持つ独自のコンポーネントとして提供されます。
音を鳴らす
クリックすると音が鳴るボタンを作成してみましょう。 開始するには、サークルスプライトを*作成*し、赤にします。
次に、このスプライトに Audio Source を添付しましょう。
オブジェクトがサウンドを再生するためには、オブジェクトを1つ与える必要があります。 この効果音を目的に使用してみましょう。
http://www.orangefreesounds.com/ding-sfx/
効果音をダウンロードし、アセットにドラッグします。
Unityがこのアセットをサウンドファイルとしてインポートすると、自動的に AudioClip に変換されます。 したがって、このサウンドクリップをアセットからスプライトのオーディオソースのオーディオクリップスロットに直接ドラッグできます。
アセットからサウンドクリップをスプライトのオーディオソースのオーディオクリップスロットに直接ドラッグした後、オーディオソースのプロパティで[再生中に再生]の選択を解除することを忘れないでください。そうしないと、ゲームの開始時にサウンドが再生されます。
それでは、コードにジャンプしましょう。 「BellSound」という新しいスクリプトを作成して開きます。
オーディオソースはコードによって制御されるため、最初に参照を取得する必要があります。 前と同じようにGetComponentメソッドを使用します。
public class BellSound : MonoBehaviour {
AudioSource mySource;
//Use this for initialization
void Start () {
mySource = GetComponent<AudioSource>();
}
次に、クリックされているオブジェクトを検出するメソッドを設定しましょう。 MonoBehaviourは、OnMouseDownという名前の必要なメソッドだけを提供します。 このメソッドは、そのgameObjectの collider の範囲でマウスがクリックされるたびに呼び出されます。
コライダーをボタンにまだアタッチしていないので、今すぐアタッチします。
このためにRigidbodyは必要ありません。また、コードでこのコライダーにアクセスする必要もありません。 メソッドが機能するためだけに必要です。
メソッドをテストして、機能するかどうかを確認しましょう。 スクリプトに次のコードを記述し、ボタンに添付します。
void OnMouseDown() {
Debug.Log(“Clicked!”);
}
スクリプトを保存して添付したら、ゲームをプレイします。 ボタンをクリックすると、コンソールにメッセージが表示されます。
これで、サウンドの再生から一歩離れました。 あとは、Audio Sourceインスタンスで Play メソッドを呼び出すだけです。
void OnMouseDown() {
mySource.Play();
}
スクリプトを保存し、ゲームで実行します。 ボタンをクリックすると、サウンドの再生が聞こえるはずです!
注-クリックするたびにピッチが上がるボタンの作成を検討してください。 mySource.pitch とカウンターを使用して、把握できるかどうかを確認してください。
Unity-UIから始める
このセクションでは、UnityのユーザーインターフェイスまたはUI要素の設計プロセスについて学習します。 これには、基本セットアップと、Unityに付属する一般的な要素の概要が含まれます。
UnityでUIを設計するためのワークフローは、これまで行ってきたものとは少し異なるパスに従います。 まず、UI要素は標準のGameObjectではなく、そのまま使用することはできません。 UI要素の設計は異なります。 4:3の解像度で正しく見えるメニューボタンは、正しく設定されていないと、16:9の解像度で引き伸ばされたり歪んだりする場合があります。
UnityのUI要素は、シーンに直接配置されません。 それらは常に Canvas と呼ばれる特別なGameObjectの子として配置されます。 キャンバスは、すべてのUI要素がレンダリングされるシーンのUIの「描画シート」のようなものです。 既存のCanvasなしで Create コンテキストメニューからUI要素を作成すると、自動的に生成されます。
次に、Canvas GameObjectを見て、追加の新しいコンポーネントについて確認します-
上部の Rect Transform には、標準のGameObjectのTransformにはない多くの新しいプロパティがあります。
これは、通常のGameObjectの変換は3D空間の仮想の*ポイント*を記述するのに対して、 RectTransform は仮想の*長方形*を定義するためです。 つまり、四角形の位置、大きさ、向きを正確に定義するための追加のプロパティが必要です。
HeightやWidthなどの長方形の標準的なプロパティと、 Anchors という2つの新しいプロパティを確認できます。 アンカーは、キャンバス内で他のエンティティが「ロック」できるポイントです。 つまり、UI要素(ボタンなど)が右側のCanvasに固定されている場合、Canvasのサイズを変更すると、Buttonが常にCanvasの相対的な right にあることが保証されます。
デフォルトでは、キャンバス領域の形状を変更することはできません。これは、シーンの周囲の比較的*巨大な*長方形になります。
次は Canvas コンポーネントです。 これは、UIの描画方法に関するいくつかの汎用オプションを保持するマスターコンポーネントです。
最初に表示されるオプションは*レンダリングモード*です。 このプロパティは、キャンバスをゲームのビューに描画するために使用されるメソッドを定義します。
ドロップダウンリストには3つのオプションがあります。 後続のセクションでオプションについて学びましょう。
画面スペース-オーバーレイ
このモードは、メニュー、HUDなどの最も標準的なモードです。 UIをシーン内の他のすべての上に、正確にどのように配置するかを、例外なくレンダリングします。 また、画面またはゲームウィンドウのサイズが変更されたときにUIを適切にスケーリングします。 これは、キャンバスのデフォルトのレンダリングモードです。
スクリーンスペース-カメラ
スクリーンスペース-カメラは架空の投影面を作成し、カメラからの距離を設定し、すべてのUIを投影します。 つまり、シーン内のUIの外観は、カメラで使用される設定に大きく依存します。これには、遠近法、視野などが含まれます。
ワールドスペース
ワールドスペースモードでは、UI要素は、ワールドに配置された通常のGameObjectのように動作します。 ただし、これらはスプライトに似ているため、通常はゲーム内のモニターやディスプレイなど、プレーヤーではなくゲームワールドの一部として使用されます。 この性質のため、このモードでCanvas RectTransformの値を直接変更できます。
*Canvas Scaler* は、UI要素のスケールと外観をより明確に調整できるオプションのセットです。これにより、画面のサイズが変更されたときに、UI要素自体を*サイズ変更*する方法を定義できます。 たとえば、UI要素は、画面サイズとの比率に関係なく、同じサイズのままにすることも、*参照解像度*に従ってスケーリングすることもできます。
Graphics Raycasterは、主にUI要素のレイキャスティング(レイキャスティングのUnityドキュメントへのリンク)を扱い、クリックやドラッグなどのユーザー開始イベントが正しく機能するようにします。
ユニティ-ボタン
この章では、UI要素をシーンに挿入して操作する方法を学びます。
- ボタン*から始めましょう。 ボタンを挿入するには、シーン階層を右クリックして、*作成→UI→ボタン*に移動します。 既存のCanvasとEventSystemがない場合、Unityは自動的に作成し、同様にCanvas内にボタンを配置します。
デフォルトのモードである*オーバーレイ*レンダリングモードでは、キャンバスのサイズはカメラのサイズに依存しないことに注意してください。 Game タブをクリックして、これをテストできます。
シーンを再生すると、ボタンが既にマウスがホバリングしていることを検出したり、押されたときに色を変更したりするなどの標準機能を既に持っていることに気付くでしょう。
Buttonには、UIで実際に役立つ機能が必要です。 この機能は、そのプロパティを介して追加できます。
新しいスクリプトを作成して、 ButtonBehaviour と呼びましょう。
public class ButtonBehaviour : MonoBehaviour {
int n;
public void OnButtonPress(){
n++;
Debug.Log("Button clicked " + n + " times.");
}
}
ボタンを押した回数を記録する簡単なメソッドを作成しました。
注-このメソッドはパブリックでなければなりません。それ以外の場合は、ボタンの機能によって通知されません。
空のGameObjectを作成し、このスクリプトをアタッチします。 これは、ボタンがそれ自体では何もしないためです。スクリプトで指定されたメソッドを呼び出すだけです。
次に、ボタンのプロパティに移動して、* OnClick()*プロパティを見つけます。
image:/unity/onclick()_ property.jpg [OnClick()プロパティ]
下部のタブの+アイコンを押すと、新しいエントリがリストに表示されます。
このエントリは、ボタンを押したときに作用するオブジェクト、およびそのオブジェクトのスクリプトのどの関数が呼び出されるかを定義します。 ボタンを押す際に使用されるイベントシステムにより、リストに追加するだけで複数の機能をトリガーできます。
作成した ButtonManager スクリプトを含む空のGameObjectを* None(Object)*スロットにドラッグアンドドロップします。
*No Function* ドロップダウンリストに移動し、 *OnButtonPress* メソッドを探します。 (任意の名前を付けることができます。OnButtonPressは単に標準化された命名規則です。) *ButtonBehaviour* セクションで見つける必要があります。
今すぐゲームをプレイすると、ボタンをテストできます。ボタンを押した回数はコンソールに表示されます。
Unity-テキスト要素
Unityの組み込みのテキストUIは、コミュニティにより構築されたより強力で効率的なアセットに隠れている場合でも、学習者がUIを設計するのに最適な出発点です。
私たちの目的にとって、バニラのText要素は開始するのに十分以上です。
テキストが独自の独自のUI要素であるのは、主にその要素の*ダイナミズム*によるものです。 たとえば、プレーヤーの現在のスコアを画面に印刷するには、通常、*。toString()*メソッドを使用して、表示する前にスコアの数値を文字列に変換する必要があります。
テキストUI要素を挿入するには、シーン階層に移動します。作成→UI→テキスト。
新しいText要素がCanvas領域に表示されるはずです。 そのプロパティを見ると、いくつかの非常に便利なオプションが表示されます。
ただし、何よりも重要なのは*テキストフィールド*です。 そのフィールドにテキストボックスに表示する内容を入力することもできますが、それよりもさらに一歩進めたいと思います。
テキストのフォントを変更するには、まずコンピューターからアセットとして* fontファイル*をUnityにインポートする必要があります。 フォントは、シーン内の何かにアクティブにアタッチする必要はなく、アセットから直接参照できます。
Text要素には、スクリプトを通じてもアクセスできます。これが、動的 UIの重要性が出てくるところです。
前の章のように、コンソールの代わりに、ボタンが押された回数を出力します。ゲーム画面に実際に印刷してみましょう。 そのために、前のレッスンのButtonBehaviourスクリプトを開き、それにいくつかの変更を加えます。
using UnityEngine;
using UnityEngine.UI;
public class ButtonBehaviour : MonoBehaviour {
int n;
public Text myText;
public void OnButtonPress(){
n++;
myText.text = "Button clicked " + n + " times.";
}
}
最初に行った変更は、新しい名前空間参照を追加することでした。 この参照は、UnityのUIコンポーネントを操作するために使用されるため、 UnityEngine.UI を使用する行を追加します。
次に、Textテキスト要素をドラッグアンドドロップできるパブリックText変数を作成します。
最後に、 myText.text を使用して、このUI要素に含まれる実際のテキストにアクセスします。
スクリプトを保存すると、ButtonManagerにText UI要素の新しいスロットが表示されます。 そのText要素を含むgameObjectをスロットにドラッグアンドドロップし、[再生]ボタンを押すだけです。
Unity-スライダー
この章では、このシリーズの最後のUI要素について学習します。 スライダーは、特定の値を最大値と最小値のペアの間で設定する必要がある場合によく使用されます。 これの最も一般的な使用法の1つは、オーディオボリュームまたは画面の明るさです。
スライダーを作成するには、作成→UI→スライダーに移動します。 新しい Slider 要素がシーンに表示されます。
このスライダーのプロパティに移動すると、カスタマイズするためのオプションがたくさんあります。
このスライダーから*ボリューム*スライダーを作成してみましょう。 このためには、ButtonBehaviourスクリプトを開き(ButtonManager GameObjectの名前を変更することもできます。これは、ボタンを管理するだけではないためです)、Sliderへの参照を追加します。 また、コードを少し変更します。
public class ButtonBehaviour : MonoBehaviour {
int n;
public Text myText;
public Slider mySlider;
void Update() {
myText.text = "Current Volume: " + mySlider.value;
}
}
Updateメソッドを使用してmyText.textの値を常に更新する方法を理解します。
スライダーのプロパティで、[Whole Numbers]ボックスをオンにして、最大値を100に設定します。
より見やすい色になるように、プロパティを介してテキストの色を設定します。
Slider GameObjectを新しいスロットにドラッグし、playを押すのと同じ手順に従います。
どのコントロールがどのように機能するかを確認するために、他のUIコントロールも同様に調べて実験することを強くお勧めします。
次のセクションでは、照明、マテリアル、シェーダーについて学習します。
Unity-マテリアルとシェーダー
この章では、マテリアルとシェーダーについて簡単に学習します。 理解を深めるために、現在の2Dプロジェクトではなく、新しい* 3Dプロジェクト*を作成します。 これは、さまざまな変更を確認するのに役立ちます。
新しいプロジェクトを作成したら、階層に移動して右クリックし、* 3Dオブジェクト→キューブ*に移動します。 これにより、シーンの中央に新しいキューブが作成されます。 シーンビューでマウスを右クリックしてドラッグすると、キューブの周囲を見ることができます。 スクロールホイールを使用してズームインおよびズームアウトすることもできます。
次に、キューブをクリックして、そのプロパティを確認します。
一番下のプロパティには、デフォルトマテリアルと*標準*シェーダーが表示されます。
材料とは何ですか?
Unity(および多くの3Dモデリングの側面)では、 Material は、そのマテリアルを使用したオブジェクトの照明に関する情報を含むファイルです。 灰色の球体がマテリアルをどのように示しており、上部からいくらかの光が入っていることに注意してください。
ここで、名前と混同しないでください。マテリアルは、質量、衝突、または一般的な物理学とは関係ありません。 マテリアルは、そのマテリアルを使用して照明がオブジェクトに与える影響を定義するために使用されます。
独自の素材を作成してみましょう。 Assets領域を右クリックし、 Create→Material に移動して、「My Material」などの名前を付けます。
これらの特性は、これまでに研究したものとは異なります。 これは、これらがマテリアルではなく*シェーダー*でプログラムされるプロパティだからです。
マテリアルは、オブジェクトを最初から見えるようにするものです。 実際、2Dでも、照明を必要としない特別な素材を使用しています。 もちろん、Unityはそれを生成し、私たちのためにすべてに適用するので、そこにあることに気付くことすらありません。
シェーダーとは何ですか?
シェーダーは、すべての単一ピクセル*を画面上に描画する方法を定義するプログラムです。 シェーダーは、C#またはOOPS言語でもまったくプログラミングされていません。 これらはGLSLと呼ばれる Cに似た言語でプログラムされており、GPUに直接命令して高速処理を行うことができます。
Unity-パーティクルシステム
パーティクルシステムは、寿命の短い多数のパーティクルを効率的に生成するのに役立ちます。 これらのシステムは、個別のレンダリングプロセスを受けます。数百または数千のオブジェクトがある場合でも、パーティクルをインスタンス化できます。
現在、*粒子*は粒子システムのあいまいな用語です。 *粒子*は、粒子システムによって生成される個々のテクスチャ、マテリアルインスタンス、またはエンティティです。 これらは必ずしもスペースに浮かんでいるドットではありませんが(可能ですが!)、さまざまなシナリオに使用できます。
GameObjectは、パーティクルシステムコンポーネントがアタッチされたパーティクルシステムを管理します。パーティクルシステムでは、設定するアセットは必要ありませんが、必要な効果に応じて異なるマテリアルが必要になる場合があります。
パーティクルシステムを作成するには、Add Component設定でコンポーネント Particle System を追加するか、Hierarchyに移動して、 Create→Effects→Particle System を選択します。 これにより、パーティクルシステムがアタッチされた新しいGameObjectが生成されます。
パーティクルシステムのプロパティを見ると、多くの*モジュール*で構成されていることがわかります。 デフォルトでは、3つのモジュールのみがアクティブです。 Emission、Shape および Renderer 。 他のモジュールは、名前の横にある小さな円をクリックしてアクティブにできます。
一部の値の右側に、小さな黒い矢印が表示される場合があります。 これにより、個々のパーティクルの値をより詳細に制御できます。 たとえば、 Start Size を Random between Two Constants に設定して、ウォーターシステムのような異なるサイズのランダムなパーティクルをレンダリングするようにパーティクルシステムに指示することができます。
Unity-アセットストアの使用
Asset Storeは、ゲームエンジン市場におけるUnityの最大の強みの1つです。多数のアセット、ツール、スクリプト、さらにはダウンロード可能な既製のプロジェクト全体で構成されています。
Asset Storeを使用するには、有効な Unity ID が必要です。 持っていない場合は、Unity Webサイトで作成できます。
Unity IDを作成したら、 Scene View と同じ行の Asset Store タブをクリックします。
ログインすると、右上にユーザー名が表示されるはずです。
この例では、 Survival Shooter Tutorial プロジェクトをインポートします。 そのためには、タブで検索し、Unityによって公開されたアセットをクリックします。
ダウンロードを押して、完了させます。 完了すると、*ダウンロード*ボタンが*インポート*に変わります。もう一度クリックして、現在開いているプロジェクトに新しいアセットをインポートします。
(注-この特定のケースでは、プロジェクト全体をインポートしています。Unityがこれについて警告する場合、必要に応じて新しいプロジェクトを作成するか、既存のプロジェクトを上書きします。 どちらの方法でも構いません。)
新しいウィンドウがポップアップ表示され、インポートしたばかりの新しいアセットのすべてのコンテンツがリストされます。 ダウンロードしたものに応じて、これは単一のファイル、多数のファイル、またはフォルダーとファイルの階層を持つツリー全体になります。 デフォルトでは、 Import をクリックすると、Unityはすべてのアセットコンポーネントをインポートします。 さて、Unityが* Impor * tを実行するためにクリックしてみましょう。
支払いをせずに資産をダウンロードしようとすることは違法であり、常にウイルス、バグ、または更新の欠如の可能性があります。