
パート 1⬝パート2
スクリプト「Spawner」
これは、新しいスクリプトを作成するときのコードテンプレートの外観です。
using UnityEngine; public class Spawner : MonoBehaviour { void Start() { } void Update() { } }
クローン作成用のサンプルオブジェクトを格納するパブリック変数を宣言します。
public GameObject spawnObject;
Unityエディターに移動して、スクリプトをSpawnerオブジェクトにドラッグします。

これらのアクションを使用して、スクリプトをオブジェクトにバインドしました。 変数spawnObjectにはpublic修飾子が付いているため、インスペクターウィンドウを介してUnityエディターで直接変更できます。

コードに戻りましょう。 別のパブリック変数を宣言します。 彼女は、新しいクリープが作成されるまでの時間を秒単位で管理します。 プライベートタイマー変数も宣言します。
public float spawnTime = 1f; private float timer = 0;
各フレームで、 タイマー変数はゼロまたは負の値に達するまでデルタ時間だけ値を減らします。 その後、 spawnTime変数の値を取得して、シーンに新しいクリープを作成します。 そして、それはすべて最初からやり直します。
Updateメソッドで上記を実装します 。
timer -= Time.deltaTime; if (timer <= 0) { Instantiate(spawnObject, transform.position, transform.rotation); timer = spawnTime; }
インスタンス化関数は、オブジェクトのコピーを作成し、そのリンクを返します。 このオーバーロードでは、元のオブジェクトへの参照、位置、回転を引数として取り、新しいオブジェクトを挿入します。
すべてのSpawnerスクリプトコードは次のようになります。
using UnityEngine; public class Spawner : MonoBehaviour { public GameObject spawnObject; public float spawnTime = 1f; private float timer = 0; void Start() { } void Update() { timer -= Time.deltaTime; if (timer <= 0) { Instantiate(spawnObject, transform.position, transform.rotation); timer = spawnTime; } } }
クリープ(相手)
プロジェクトを保存し、Unityエディターに移動します。 新しい球体オブジェクトを作成します。 これが私のレッスンでゾッとするようなものです。 ゼルリムの位置。 3つの軸すべてに沿って球体をわずかに減らしましょう。

マテリアルフォルダーで、新しいマテリアルを作成します。 それをエネミーと呼びましょう-「エネミー」。

彼に赤い色を与えます。 マテリアルを球体に移動します。 クリープに命を吹き込むための新しいスクリプトを作成します。

球体の名前をEnemyに変更し、同じ名前のスクリプトをその上にドラッグします。

自尊心のクリープは目標に向かって移動する必要があります
コードに渡します。 Unityエディターでプロジェクトコードの構造が変更されているため、プロジェクトをリロードするか、別のアクションを選択することができます。

再起動を選択し、 敵のスクリプトを開きます。 プライベート変数を宣言します。 ウェイポイントを含むオブジェクトを最初に保存します。 2番目は、現在のウェイポイント(ウェイポイント)の変換を保存するためのものです。
private Transform waypoints; private Transform waypoint;
クリープが実際に到達するまで進むのは、現在のウェイポイントまでです。 その後、彼は次のポイントを選択し、それに向かっていきます。 別の変数を宣言します。
private int waypointIndex = -1;
現在のウェイポイントのシーケンス番号を保存します。 初期値-1を設定します。 なぜそうなのか、さらに調べてください。
Startメソッドで、 WayPointsという名前のステージ上のオブジェクトを検索するコードを記述し、最初のウェイポイントを現在のウェイポイントとして設定します。
waypoints = GameObject.Find("WayPoints").transform; NextWaypoint();
次のウェイポイントを選択する方法を説明します。
void NextWaypoint() { // … }
メソッドの本体で、ポイントのシリアル番号を増やします。
waypointIndex++;
次に、インデックス値がウェイポイントの数以上であるかどうかを確認します。 条件が真の場合、ステージ上のオブジェクトを破棄し、メソッドの実行を中断します。
if (waypointIndex >= waypoints.childCount) { Destroy(gameObject); return; }
ifブロックの後、 ウェイポイント変数を指定されたシリアル番号のウェイポイントに割り当てる必要があります。
waypoint = waypoints.GetChild(waypointIndex);
パブリッククリープ速度変数を追加します。
public float speed = 2f;
Updateメソッドの本体で、現在のウェイポイントにクリープ移動コードを記述します。
Vector3 dir = waypoint.transform.position - transform.position; dir.y = 0;
最初の行は、クリープの方向を見つけます。 2行目はY軸をゼロにし、クリープがほくろや蝶にならないようにします。
メソッドで速度を数回再計算しないように、ローカル速度変数を宣言します。 クリープの動きは、フレームレートに依存してはなりません。
float _speed = Time.deltaTime * speed;
クリープの位置をウェイポイントの方向に移動します。速度の値に等しいステップです。 これを行うために、ステップにローカル速度変数を掛けました。
transform.Translate(dir.normalized * _speed);
次に、条件を設定する必要があります。 ベクトルの長さがステップ長以下の場合、これはウェイポイントを変更する信号です。
if (dir.magnitude <= _speed) NextWaypoint();
その結果、すべてのEnemyスクリプトコードは次のようになります。
using UnityEngine; public class Enemy : MonoBehaviour { public float speed = 2f; private Transform waypoints; private Transform waypoint; private int waypointIndex = -1; void Start() { waypoints = GameObject.Find("WayPoints").transform; NextWaypoint(); } void Update() { Vector3 dir = waypoint.transform.position - transform.position; dir.y = 0; float _speed = Time.deltaTime * speed; transform.Translate(dir.normalized * _speed); if (dir.magnitude <= _speed) NextWaypoint(); } void NextWaypoint() { waypointIndex++; if (waypointIndex >= waypoints.childCount) { Destroy(gameObject); return; } waypoint = waypoints.GetChild(waypointIndex); } }
最後の準備
コードを保存し、Unityエディターに戻ります。 同じ名前のオブジェクトに添付されているSpawner スクリプトは 、クローン作成用のサンプルを指定する必要があります。 サンプルはEnemyプレハブになりますが、これはそうではありません...階層ウィンドウからEnemyオブジェクトをプレハブフォルダーにドラッグして作成してみましょう。 オリジナルはシーンから削除されます。

これで、 spawnObject変数をクリーププレハブに設定して、パターンを設定できます。

Spawnerオブジェクトの衝突を無効にします。

保存して、何が起こったかを確認します。

新鮮な肉が組立ラインを流れて......
より明確にするために、ビデオチュートリアルを見ることができます:
PS:質問や提案がある場合は、動画の下にYouTubeでコメントを残してください。
ハブラーではコメントを読みません。
多くの人が記事とビデオがこのチャンネルのレッスンに似ていることに気づいています 。 一部からそうです。 しかし、私はウェイポイントの配置とレベルの構築のみを借りました。
ご清聴ありがとうございました! 2番目の部分の終わり。