こんにちは、Habr!
このサイクルの
最後の記事 (およびその
前の記事からさらに)から十分な時間が経過したので、戻って、コンピューターゲームの最も陰険で極悪な部分、つまり敵を作る方法を説明するときが来ました。 私は事前に予約します。ここでは、あなたのキャラクターの敵に対する人工知能の作成は考慮しません。 プラットフォームゲームで最も一般的な対戦相手のタイプと、Unityを使用してそれらを実装する方法を見てみましょう。

注意、カットの下にはまだたくさんのgifがあります!
免責事項:この記事に示されているすべてのコードはロールモデルではなく、理想的なコードやその他の架空のものや存在しないものの例です。 この記事で適用されるプラクティスは、特定の問題に対する多くの解決策の1つです。 そして、そうではないかもしれません。行きましょう。 ゲームのヒーローが目標に到達するのを何らかの形で妨げることができる4つの主なタイプのオブジェクトを特定しました。
1)静的(回転のこぎり、「致命的な」ブロックなど)

2)プラットフォーム(スーパーマリオブラザーズのキノコとカメ)の上を歩く

3)飛行(第2レベルのゴーストとゴブリンのカラス)

4)射手(同じマリオの
城からのバウシャ)

ボスはまだ存在しますが、上記のすべてのタイプを組み合わせることができるため、それらについては説明しません。
1)静的な障害。
のこぎりを作りましょう。 このような「敵」を実現するために必要なものは、スプライトのこぎりとそれを回転させるスクリプトだけです。 すぐに言ってやった。
スプライトをシーンにドラッグします。

新しいスクリプトを作成します(通常、非常に簡単です)

そして、次のようなコードをそこに追加します。
using UnityEngine; using System.Collections; public class rotator : MonoBehaviour { public float speed = 0.04f; void Update () { transform.Rotate (new Vector3 (0f, 0f, speed * Time.deltaTime)); } }
パブリック可変速度では、回転速度が設定されます。 正の値は鋸を反時計回りに回転させ、負の値は鋸を時計回りに回転させることに注意することが重要です。
さて、のこぎりとやり取りするために、ある種のコライダーを追加し(これは最も興味深い前の部分で詳細に説明されています)、この状況でオブジェクトタグを適切なものに変更します。
タグは良いことです。 プレイヤーにプレイヤータグ、敵に敵タグ、壁と床のレベルを割り当てることができます。 この簡単な手順の後、たとえば、私たちが遭遇したものをチェックすることは、はるかに簡単になります。 そして、特定のタグを持つオブジェクト(またはシーンにあるすべてのもの)を見つけることができます。 これは次のように行われます。
GameObject someEnemy = GameObject.FindGameObjectWithTag ("Enemy");
FindGameObjectsWithTagメソッドを使用して、指定されたタグを持つすべてのオブジェクトの配列を取得できます-どこも簡単ではありません。
のこぎりに戻って、ゲーム内の敵に新しいタグを作成しましょう。

文字スクリプトで、次のチェックを追加します
void OnCollisionEnter2D(Collision2D col){ if (col.gameObject.tag == "Enemy") Application.LoadLevel (Application.loadedLevel); }
ご覧のとおり、すべてが基本です。衝突をチェックし、遭遇したタグをチェックします。 すべてが悪い場合は、レベルを再起動します。 または命を取ります。 またはそのようなもの。 あなたはプラットフォーマーを演じましたよね?
最終的には次のようになります。

したがって、簡単かつ迅速に、最初の敵を作成しました。これは、もちろん敵ではなく、私たち自身にとってかなりの障害です。 どうぞ
2)歩行、cい、その他の敵がプラットフォーム上を移動する。
準備のできていない読者には、このタイプの敵は最初の敵よりも実装が難しいように思われるかもしれません。 私は急いで安心します-これは全く真実ではありません。 前のケースと同様に、何らかのスプライト、コライダー、スクリプト、およびこれらすべてが移動するプラットフォームが必要です。 剛体2Dのみがこの小さなリストに追加されるため、物理学が敵に作用し、その速度を設定できます。
残念ながら、私は描画する方法がわからず、私の創造的な才能はそのような悪役だけに十分でした:

移動するには、次のスクリプトを使用します
using UnityEngine; using System.Collections; public class walkingEnemy : MonoBehaviour { public float speed = 7f; float direction = -1f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { rigidbody2D.velocity = new Vector2 ( speed * direction, rigidbody2D.velocity.y); }
敵の速度と動きの方向(-1-左、1-右)を設定します。これは、たとえば壁との衝突で変更できます。 その後は簡単です。水平速度を速度と方向の積に等しく設定します。
楽しい事実おもしろい事実-fixedAngleチェックボックスをrigidbody2Dに設定すると、敵はクロールし、削除すると、

「しかし、彼は右に見えますが、左に移動します!」-注意深い読者は気づくでしょう。 これを修正し、動きの方向に応じてスプライトを展開しましょう。
using UnityEngine; using System.Collections; public class walkingEnemy : MonoBehaviour { public float speed = 7f; float direction = -1f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { rigidbody2D.velocity = new Vector2 ( speed * direction, rigidbody2D.velocity.y); transform.localScale = new Vector3 (direction, 1, 1); } }
そして、壁との衝突で展開することを教えます。 これを行うには、レベルでwallタグを使用していくつかの壁を作成し、衝突処理を記述します。 以下がその1つです。
void OnCollisionEnter2D(Collision2D col){ if (col.gameObject.tag == "Wall") direction *= -1f; }
すべてが整ったので、最終結果は次のようになります。

敵に敵のタグを追加するだけで、敵が私たちのキャラクターにとって本当に危険になります。
小計を要約します。 2Dプラットフォーマーで静的とレベルに沿って移動する2種類の「敵」がどのように作成されるかを調べました。 ご覧のとおり、これは非常に簡単で、基本的な実装にかかる時間はごくわずかです。
次のパートでは、他の2種類の敵-飛行と射撃を作成する方法を説明します。
お楽しみに-それは面白いでしょう!
前のシリーズ:
パート1、歩くことを学ぶパート2、失うことを学ぶ物理学を楽しむパート3より便利なリンク
ゲーム開発およびその他のテクノロジーに関するマイクロソフトの仮想アカデミー
コースを受講する
Unityゲームプログラミングの概要刺激的なC#プログラミングUnityを
ダウンロードする無料または試用版のVisual Studioを
ダウンロードするユニバーサルWindows
開発者になるAzureを30日間無料でお
試しください !