前回記事までで近づくと自動追尾してくるキャラクターを完成させました。
前回の記事:
増殖型鬼ごっこRUNゲームの作り方4 敵味方を判定して追尾する機能の作成
今回の記事では前回作成した中立キャラクターの機能追加を行います。 前回の記事: プレイヤーが中立キャラクターに近づくとそのキャラクターがプレイヤーに付いてくるようにしていきます。 所属している集団を見分けるための処理を追加 それではまず、先...
今回の記事では敵キャラクターを作成します。
簡単なAIを組んで敵がマップ内を移動するようにしていきます。
敵の行動パターンを表現するスクリプトの作成
新しく「Enemy.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssetsフォルダーに保存しています。
「Enemy.cs」の内容は次のようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
// Enemy.cs using System.Collections; using System.Collections.Generic; using UnityEngine; class Enemy : CharacterBase { public Map Map; Coroutine _currentCoroutine; public void StartMove() { if (_currentCoroutine != null) { StopCoroutine(_currentCoroutine); } _currentCoroutine = StartCoroutine(MoveCoroutine()); } IEnumerator MoveCoroutine() { var buildingGridSize = Map.GridSize - new Vector3Int(1, 0, 1); var massSize = new Vector3( Map.Size.x / buildingGridSize.x, 1, Map.Size.z / buildingGridSize.z); var start = new Vector3(-Map.Size.x / 2, 0, -Map.Size.z / 2); var oneLoopCount = (Map.GridSize.x * Map.GridSize.z); var offset = new Vector3(1, 0, 1); var rnd = new System.Random(); while (true) { var startXIndex = (int)((transform.position.x - start.x + massSize.x * 0.5f) / massSize.x); var startZIndex = (int)((transform.position.z - start.z + massSize.z * 0.5f) / massSize.z); var nextXIndex = startXIndex; var nextZIndex = startZIndex; var i = rnd.Next(4); switch(i) { case 0: nextXIndex--; break; case 1: nextXIndex++; break; case 2: nextZIndex--; break; case 3: nextZIndex++; break; } nextXIndex = Mathf.Clamp(nextXIndex, 0, Map.GridSize.x-1); nextZIndex = Mathf.Clamp(nextZIndex, 0, Map.GridSize.z-1); var targetPos = new Vector3( start.x + massSize.x * nextXIndex, 0, start.z + massSize.z * nextZIndex ); yield return null; while (true) { var vec = (targetPos - transform.position); vec.y = 0; if (vec.magnitude < 1f) break; Move(vec.normalized * SpeedPerSeconds); yield return null; } } } protected override void Start() { StartMove(); } } |
移動処理周りが複雑ですが、自動生成されたマップをマス目上に分割した時の各点の間を移動する処理になっています。
マップ用のコンポーネントに敵関連の処理を追加
次に「Map」コンポーネントに敵関係の処理を追加していきます。
この講座では簡単に再生したら適当な場所に敵を生成するようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Map.cs 敵関係の処理を追加 //次のものを修正 void Awake() { BuildMap(); InitJoinableCharacter(); InitEnemy(); } //次のものを追加 public Enemy EnemyPrefab; public void InitEnemy() { var buildingGridSize = GridSize - new Vector3Int(1, 0, 1); var massSize = new Vector3( Size.x / buildingGridSize.x, 1, Size.z / buildingGridSize.z); var start = new Vector3(-Size.x / 2, 0, -Size.z / 2); var oneLoopCount = (GridSize.x * GridSize.z); var rnd = new System.Random(); var i = rnd.Next(oneLoopCount); var obj = Object.Instantiate(EnemyPrefab, transform); obj.Map = this; var xIndex = i % GridSize.x; var zIndex = i / GridSize.x; obj.transform.localPosition = new Vector3( start.x + massSize.x * xIndex, 2, start.z + massSize.z * zIndex ); } |
敵プレハブの作成
ここまでで敵関係のスクリプトを作成しましたので、次はGameObject側を作成してきます。
次の手順を行って下さい。
- メニューのGameObject > 空のGameObjectをクリックし新しいGameObjectを作成してください。
- 作成したGameObjectの名前は「Enemy」に変更してください。
- 「Enemy」の子GameObjectとしてメニューのGameObject > 3DObject > Capsule をクリックしGameObjectを作成してください。
- 作成したGameObjectの名前は「Model」にしてください。
- プレハブ化してシーンから削除してください。
「Enemy」のGameObject階層は次のようになっています。
- Enemy : 空のGameObject
- – Model : 3DObject > Cube
これらの設定内容は次のようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Enemyの設定内容 ## Enemy : 空のGameObject - Transformコンポーネント Position : 0, 0, 0 Rotation : 0, 0, 0 Scale : 1, 1, 1 - Enemyコンポーネント <- 追加 SpeedPerSeconds : 4 TeamColor : 赤 - Rigidbodyコンポーネント <- 追加 Mass : 100 // 調節すると他のオブジェクトからの押しやすさを調節できます。 UseGravity : true IsKinematic : false Constraints FreezePosition: x=false y=false z=false Constraints FreezeRotation: x=true y=true z=true - BoxColliderコンポーネント <- 追加 IsTrigger : false Center : 0, 0.5, 0 Size: 1, 2, 1 - SphereColliderコンポーネント <- 追加 IsTrigger : true Center : 0, 0.5, 0 Radius: 1.5 ## Enemy > Model : 3DObject > Capsule - Transformコンポーネント Position : 0, 0.5, 0 Rotation : 0, 0, 0 Scale : 1, 1, 1 - CapsuleColliderコンポーネント <- 削除 |
また、シーンの「Map」にも次の設定を行ってください。
1 2 3 4 |
// Map.cs 敵関係の設定を追加 ## Map - Mapコンポーネント EnemyPrefab : 「Enemy」プレハブ |
ここまでできましたら、再生してみて動作を確認してみて下さい。
敵がマップ上を適当に移動し、他のキャラクターが追従するようになっていたらOKです。
まとめ
今回の記事では敵を作成していきました。
この講座では相手側の集団に所属していても近づいたらこちらの集団になるようにしていますが、もし変更したい場合は改造してみてください。
まとめると以下のようになります。
- 敵用のコンポーネントの作成
- マップに敵関係の処理を追加
- 敵用のプレハブを作成
それでは次の記事に行ってみましょう!
次の記事:
増殖型鬼ごっこRUNゲームの作り方6 敵とプレイヤーのポイント表示UIを作る
前回の記事では敵キャラクタと移動AIを作成しました。 前回の記事: 今回の記事ではプレイヤーや敵の率いている味方の数を表示するUIを作成していきます。 集団の人数を表示する それではプレイヤーおよび敵に所属している人数を表示できるようにして...
コメント