まえがき
Habralumの人々は
Unityにある程度の関心を示したので、この記事を、オブジェクトを扱う主なポイントを強調する一連のチュートリアルで開きます(期間が無期限のサイクルを継続します-誰にとっても有用である場合)
すぐに、入場の基準を下げるために、人生でこのようなことをしたことがない人の期待に話をします。 基本的な機能を実装するのが最も簡単なシューティングゲームが最も簡単なので、それから始めます。 このレッスンでは、地球、空、制御されたキャラクター、空と太陽を見るためのカメラ、および白い立方体で赤いボールを撮影する方法について少し説明します。 だから
行こう...
始めましょう
事前準備
開始するには、Unity自体をオフサイトにダウンロードしてインストール
し、無料価格タグ付きのライセンスを選択します。 UnityProの30日間の試用版をダウンロードできます。
最初の起動時に、プロジェクトウィザードウィンドウが目の前に表示されます(そこで空になります)。

一般的な理解のために、Windowsで「DocumentsAndSettings \ AllUsers \ Documents \ Unity Projects \ Bootcamp Demo」に移動する付属のBootcampDemoを開くことができます。
トレーニングを続けるには、[新しいプロジェクトの作成]タブに移動し、必要な標準のゲームオブジェクトとスクリプトのセットを選択します。 必要になります
- キャラクターコントローラー
- 粒子
- 物理材料
- スクリプト
- スカイボックス
- 地形アセット
- ツリー作成者
そして、そこでのみチェックできるものすべてに注意することができます。 ストックポケットは押さない。

宛先フォルダーを選択し、「作成」をクリックして、遅いインポート処理が完了するまで待ちます。 最後に、実験用の空のフィールドが表示されます。

写真のキャプションについて簡単に説明すると、
プレハブとリソースのインスペクターは 、プロジェクトに追加されたモデル、テクスチャ、サウンド、
プレハブが保存される場所です。オブジェクトはさらに再利用するために保存されます。 つまり モデルを添付した攻撃者のオブジェクトと、その動作を制御するスクリプトを作成しました。各レベルで再度作成する必要はなく、このオブジェクトのすべてのコピーは手動ではなく、個別に変更します。 この場合、プレハブとして保存し、次に敵を配置する必要がある場合は、プレハブをステージにドラッグするだけです。 プレハブを変更すると、そのすべてのコピーが変更されます。
ステージ上
のオブジェクト
の階層は 、現在のレベルのすべてのオブジェクトのリストであり、同時に親子関係を示します。
オブジェクトインスペクターには、現在選択されているオブジェクト(モデル、テクスチャ、プレハブ)のコンポーネントとそのプロパティが表示されます。
魔法のボタンを使用すると、エディターで直接シーンを開始し、バグの主題に追い込み、一時停止してオブジェクトのステータスを確認し、フレームごとに実行して微調整および制御できます。
メイン編集ウィンドウでは、ドラッグアンドドロップのすべての機能を使用して、レベルごとにオブジェクトを配置します。
最初に、デフォルトのシーンにすでにあるものを見てみましょう。 そんなに多くないよね? メインカメラという名前のオブジェクト。階層内の名前をクリックすると、ビューポートコーンとカメラからの眺めのある小さなウィンドウが表示されます。
編集ウィンドウの主なコントロールをすぐに説明します。
- 中央のマウス-カメラを左右に移動します(内側のxy平面上)
- 左クリック-もちろん、オブジェクトを選択します(ただし、BlenderとUnityを切り替えるのは難しい場合があります)
- 右クリック-回転「ヘッド」
- F-選択したオブジェクトを中心に
- Ctrlキーを押しながらオブジェクトをドラッグ-1座標単位の増分でドラッグ
座標について言えば、開発者は、1単位のゲームスペースを1メートルごとに使用することをお勧めします。それに専念することをお勧めします(少なくとも物理学をいじくり回すには)。
約束の地
しかし、羊に戻って、私たちが歩く表面を作ります。 モデルはまだないので、大きな飛行機を作成することができます...しかし、地球、つまり地形を作成します-裸の飛行機よりも色が濃くなります。 これを行うには、メニューで[地形]-> [地形の作成]を選択します。 出来上がり!

繰り返しますが、あまり印象的ではありません。 まず、地形->解像度の設定を使用して、地球のソリッドのサイズを変更します。 デフォルトでは、LengthおよびWidthパラメーターは2000です。 2 kmから2 km。 テスト実行用にはあまり必要ないので、これらのフィールドに500と500を書き込みます-十分すぎるほどです。
次に、テクスチャを地面に割り当てましょう。 これを行うには、(メインウィンドウまたは階層内で)地形を選択し、オブジェクトインスペクターで使用可能なプロパティを確認します。 そこには、テレーンを編集するためのツールがあります(標準的なもの-上昇/下降、スムーズなど)。 すぐに必要な風景の描画を開始できますが、現時点では[地形テクスチャペイント]ブラシのボタンに興味があります。 そして、それが開くタブには、[テクスチャの編集]ボタンがあり、メニューの[テクスチャの追加]をクリックします。

ウィンドウが開き、将来のテクスチャのパラメーターが表示されます。 それらの中から「なし(テクスチャ2d)」という値を持つものを見つけ、これらの単語の右側にあるドットの付いたボールをクリックします。 プロジェクトリソースに既に追加されているものからテクスチャセレクタが開きます。 ところで、プロジェクトにテクスチャを追加するには、プロジェクトフォルダにテクスチャをコピーするだけです-ユニットはそれ自体をすべてピックアップします。 他のすべてのインポートは同じ方法で行われ、プロジェクトからリソースを削除すると、ディスクから物理的に削除されます。
目的のテクスチャ、たとえばGrass(Hill)を選択します。 クリフ(レイヤードロック)など、さらにいくつかのテクスチャを追加し、上記で選択したブラシを使用して、好きなようにペイントできます。 以前の操作の後、次のようになりました。

現在、画面の上部にある[再生]ボタンをクリックすると、ほとんどの場合、背景が青く照らされていない土地が表示されます。 しかし、それは面白くないので、続行する前に、太陽をシミュレートするステージに照明を追加し、青い背景を空に置き換える必要があります。 ライトは、メインメニューのGameObject-> Create other-> Directional lightから追加されます。 次に、図に従って、回転軸上の選択されたオブジェクトの周りのヘルパー矢印を変更するボタンを押します。 これらの軸を引いて、奇妙なことに、照明装置を回転させて、地球がより色付きで強調表示されるようにします。

空が頭の上の青いキャンバスの代わりになるようにするには、スカイボックステクスチャを指定する必要があります(skybox-「sky box」、テクスチャは内側から引き伸ばされる立方体、原則として-空のパノラマ写真、内側からはこれでボールに囲まれているように作成されます)これは、ほとんどのゲームで空が描画される方法です)。 これを行うには、[編集]-> [レンダリング設定]メニューに移動し、「Skyboxマテリアル」プロパティを見つけて、地球のテクスチャで行ったように、右側にドットのある円をクリックします。 プロジェクトで使用可能なマテリアルが表示されます(用語のジャングルに入らないように、マテリアルはテクスチャであり、どのように表示されるかを考慮します-透明になるか、輝くようになります)。 たとえば、sunny2 skyboxのように、skyboxという単語を持つ人を選択します。 素晴らしい、今私たちの埋め立てはより活発に見えます。
管理とカメラ
私は長い間、最初のチュートリアルにスクリプトの解析とカメラとコントロールのゼロからの書き込みを含めるかどうかを考えていました。 それでも、私は今のところ延期することにしました。 今日は、既製のピースからキャラクターを収集するだけです。次のチュートリアルでは、スクリプトの解析を開始します。
実際、Unityキットには、カメラとコントロール用の既製の既に組み立てられたソリューションを提供する2つのゲームオブジェクトが含まれています。 しかし、それらについてはまだ説明しませんので、自分の手で組み立てるインセンティブがあります。 :)
まず、プレーヤーのオブジェクトを作成します。 むしろ、余分なスクリプトを作成しないために、「メインカメラ」の名前を「プレーヤー」に変更します。 カメラを選択したら、メニューから[コンポーネント]-> [物理]-> [キャラクターコントローラー]を選択します。 キャラクターコントローラーは、空間内のオブジェクト(またはキャラクター)の位置を処理するコンポーネントです:その動き、回転、落下、ジャンプ、他のオブジェクトとの衝突。 これはすべて、オブジェクトの移動と衝突のチェックの標準機能に関するこのラッパーの助けを借りずに直接行うことができますが、その後、移動を実装するためのコードが大幅に増加します。 したがって、一般的に、最初のレッスンではコーディングできません:)
<歌詞の余談>
叙情的な余談として、コンポーネントについて話す価値があります。

ステージに表示されるオブジェクトは、ゲームオブジェクトという名前のクラスのインスタンスです。 いわゆる一定量の コンポーネント-次に、それらのクラスのインスタンスです。 各コンポーネントは特定の実用的な機能を実行します。 そのため、各GameObjectにはTransformコンポーネントが必要です。Transformコンポーネントは、現在の座標、回転角度、およびオブジェクトのサイズを3次元空間に格納することを約束します。 さて、同時に、この空間内のオブジェクトの位置でアクションを実行するためのメソッドが含まれています:変位、ターンなど、すなわち エディターでオブジェクトを制御矢印で引くと、その変換の座標が変更されます。
しかし、たとえば、RigidBodyコンポーネントはオブジェクトの物理的動作の処理に関与しています。ショットの銃身が横に倒れて回転したときに表示されるものはすべて、RigidBodyの作業の結果です。 ちなみに、オブジェクトの衝突が決定される3次元モデルを格納するColliderタイプのオブジェクトにオブジェクトを割り当てないと、これは正しく機能しません。 このモデルは表示されませんが、ゲーム中に画面上に表示されるものではなく、外の世界との衝突がチェックされます。
</叙情的な余談>
カメラの周りに、緑の線がクプスラを形成していることがわかります。これにより、プレイヤーとの衝突が計算されます。 カメラはこのカプセルの真ん中にありますが、ベルトに目を向ける必要はありません(状況は異なりますが:))。そのため、キャラクターの頭の領域にカメラを移動する必要があります。 ただし、このカプセルは単一の変換を持つオブジェクトの一部であるため、カメラとは別に動かすことはできません。 幸いなことに、オブジェクトインスペクターでCharacter Controllerで使用可能なプロパティを見ると、パラメーターx、y、zを持つCenterプロパティが表示されます。 つまり、オブジェクトの中心に対してカプセルの中心を移動できます。 y = -0.8に設定し、目の通常の高さを取得します。
プレーヤーを地球の表面の上に置いてPlayをオンにすると、カメラは静止したままになります。 これは、Character Controllerが制御コマンドを処理するだけで、それ自体がイニシアチブをとらないためです。 何をすべきかを説明するには、プレーヤーのスクリプトをドラッグアンドドロップします。このスクリプトは、Standart Assets \ Character Controllers \ Sources \ Scriptsフォルダーのプレハブインスペクターにあり、「CharacterMotor」と呼ばれます。 そのタスクは、Character Controllerメソッドを使用して移動の基本ルーチンを実行することです。重力、ジャンプの動作を実現し、移動の現在の速度と方向を計算します。 レベルを開始すると、プレイヤーのカメラが地面に落ちます-すでに何か。
しかし、まだ静止しています。結局のところ、キーストロークをインターセプトし、CharacterMotorでそれらについて報告するスクリプトがありません。 これは、同じフォルダー内のFPSInputControllerスクリプトによって処理されます。 プレーヤーに投げて起動し、歓声を上げます-W、S、A、Dボタンで歩き、スペースバーでジャンプできます! しかし、私たちは皆、何らかの方法で、左と右の1つの方向に歩を追加して歩きます。 頭をひねって目が見えるところに行くには、そこから別のスクリプト、MouseLookが必要です。 私たちは投げて走り、完全にコントロールします。
これで、変数をいじることができます。 キャラクターモーターと一緒にインストールされたキャラクターコントローラー-重力、最大前進速度、ジャンプ台の高さなどのパラメーターが保存されるのは、彼のプロパティです。 ここに、インスペクターのすべての利点があります。クラスのすべての基本的なプロパティは常に見えているので、コードに進む必要さえありません。
UPD:私の例外的な曲率のおかげで投稿から落ち
た継続:
時折移動するターゲットでの撮影
自分で作った丘を駆け回り、3枚ものテクスチャーで愛情を込めてペイントするのは確かに楽しいです。 しかし、すぐに退屈しました。 したがって、メニューからGameObject-> Create other-> Cubeを選択し、このキューブをプレーヤーの隣の空中に配置し、Transformプロパティで次のScale(x、y、z)パラメーターを指定します。 レベルを実行して、このキューブの機能を確認します。 正直に言うと、絶対に何もありません。 ただし、このキューブを選択したら、Component-> Physics-> Rigidbodyを割り当てます。次回起動すると、まったく異なる画像が表示されます。 キューブは落下し、回転します。段ボールのように見えますが、デフォルトの重量は1 kgです。これはそのようなサイズには十分ではありませんが、まだ触れません。
キューブを選択した状態で、Ctrl + D(オブジェクトを複製)を押し、Ctrlを押しながら、キューブが上下にドラッグされるまでキューブをドラッグします。 これで、まったく同じ2つの完全に同一のキューブができました。 このキューブの手順を15まで繰り返し、バベルの塔の崩壊を見てください。
次に、新しいキューブを作成しますが、リジッドボディを割り当てないでください。 それから、撮影しやすいように平らな表面を作ります。 スケール:150、20、150; どこにでも配置します-主なことは、タワーとプレイヤーを配置することです。 次のようになりました。

次に、武器と弾薬を作成します。 プレハブはカートリッジとして機能します。インスペクターの上部にある[作成]ボタンをクリックし、そこでプレハブを選択することにより、プレハブインスペクターで作成します。 インスペクターでその時点で開かれたフォルダーに新しいプレハブが作成されます。 コンポーネントが存在しないことを象徴する灰色で強調表示されます。 メインメニューで、GameObject-> Create other-> Sphereをクリックし、シーン階層でこのSphereを見つけて、Rigidbodyをハングさせます。 しかし、より美しくするために、先ほどハングさせたこのリジッドボディのプロパティに進み、Massパラメーターを5に変更しましょう。
その後、球体を階層のリストから作成したプレハブにドラッグします。 プレハブが青に変わり、ステージ上の球の名前が青に変わります-これはプレハブのクローンであることを意味します。 プレハブの名前をデフォルト名から、たとえばprefab_bulletに変更します。 美しさのために。 弾丸の準備ができました!
次のステップは、武器を作成することです。つまり、この球体をマウスでクリックして発射するスクリプトを作成します。 プレハブの横に、JavaScriptファイルを作成します:Create-> JavaScript。 たとえば、プレーヤーと呼びます(混乱しないように)。 これをダブルクリックすると、組み込みのスクリプトエディターが開き、ファイルの内容がこれに置き換えられます(まだ分析しません)。
public var bulletImpulse = 300;
public var shootSpeed = 1;
public var bullet : GameObject;
public var lastShotTime : float;
function Start() {
lastShotTime = 0;
}
function Update () {
if (Input.GetKey(KeyCode.Mouse0)) {
if (Time.time>(lastShotTime + shootSpeed)) {
var bull_clone : GameObject;
bull_clone = Instantiate(bullet, transform.position, transform.rotation);
Physics.IgnoreCollision(bull_clone.collider, collider);
bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);
lastShotTime = Time.time;
}
}
}
次に、スクリプトを保存し、作成されたスキームに従って、プレハブウィンドウからプレーヤーを白い平面の中央にドラッグします。 これを選択すると、次のように表示されます...

そして、これは、スクリプトがコンポーネントと同じ方法でオブジェクトに固執することを意味し、それらを同じ方法で管理できます。 むしろ、それらはコンポーネントですが、これは今では不可欠ではありません。 Bulletパラメーターの横にあるドットの付いた円をクリックして、開いたサンプルボックスに球のあるプレハブを見つけることが重要です。 弾丸として選択すると、レベルを安全に実行し、段ボール箱でコアを発射することができます。
もちろん、UFOが私の思考に干渉せず、重要な一歩を逃していなかった場合を除きます。
ふう。
ひれ
私がカバーしなければならないことを十分に詳細にカバーし、重要でない些細なことを繰り返して行かなかったことを願っています。 このチュートリアルはガイダンスのみを目的としていますが、誰かにとって本当に役立つと信じたいと思います。 合理的な批判と次の号への期待を楽しみにしています。 ご清聴ありがとうございました!