さて、前回記事に引き続いて、さっそく敵キャラ(NPCキャラクター)の衛兵がグルグルと何かを護衛している様子をコーディングしていく。
関連記事
では例のごとく、Unity Gemsからの翻訳をどうぞ!
巡回点(waypoint)の追加
ここで紹介するアイデアはシンプルなものでNPCキャラクターの移動に制限をかける。NPCキャラクターが移動出来る範囲をいくつかの地点に限定します。ビルの周りを巡回するだけの監視員を想像すると
いい。ビルの周りに4つの点を配置し、彼の仕事はそこの巡回だと伝え、AからB、BからC、CからD、最後にAに戻った後はAからBと再び続けてもらう。AIとしてベストでないが、この時点では賢いAIは必要ない。
それに加えて巡回点をマニュアル配置するため、もし高度の上下がある場合、地形の高さにあわせて配置する必要ごある。あとの動作はCCに任せるのみだ。
上図では巡回点AおよびBは異なる高さyにある。緑の線はCCが実際に移動するパス(経路)を表す。一定の重力を加えているのでCCがターゲットに向かいつつカーブの通りに移動する。
コードを見ていく前に、頭に入れておくべきこととして、短いグラフではこれで十分であるということだ。この例では巡回点は4つの配列だ。
巡回点には単純にタグをつけて GameObject.FindObjectsWithTag を使用することが可能だ。問題はUnityでは最初にどれが見つかるか、二番目に何が見つかるか保証されるロジックがないということだ。始めてから正しい順番が得られるように微調整するか、またはインスペクタで手動にて割り当てすることが可能だ。
オブジェクトのインスペクタで配列表示されるのでそこでスロットに差し込むのみだ。
手動割り当ての欠点は巡回点が何百とあると作業が煩雑になることだ。ここで別のチュートリアルで見ていくグラフが役立つところだ。ここではシンプルのままにしておこう。
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (CharacterController))]
public class AiScript : MonoBehaviour {
CharacterController _controller;
Transform _transform;
float speed = 5f;
float gravity = 20f;
Vector3 moveDirection;
float maxRotSpeed = 200.0f;
float minTime = 0.1f;
float _velocity;
float range;
// 新しい変数をここに
public Transform[] _waypoint = new Transform[4];
int index;
void Start(){
index = 0; // 0で始める
_controller = GetComponent();
_transform = GetComponent();
range = 4;
}
void Update(){
if((_transform.position-_waypoint[index].position).sqrMagnitude >range){
Move(_waypoint[index]);
animation.CrossFade("walk");
}else NextIndex();
}
void Move(Transform target){
moveDirection = _transform.forward;
moveDirection *= speed;
moveDirection.y -= gravity * Time.deltaTime;
_controller.Move(moveDirection * Time.deltaTime);
var newRotation = Quaternion.LookRotation(target.position - _transform.position).eulerAngles;
var angles = _transform.rotation.eulerAngles;
_transform.rotation = Quaternion.Euler(angles.x,
Mathf.SmoothDampAngle(angles.y, newRotation.y, ref _velocity, minTime, maxRotSpeed), angles.z);
}
//NextIndex は単にindexを増分させ配列の範囲外では0をセット
void NextIndex(){
if(++index == _waypoint.Length) index = 0;
}
}
見ていくと分かる通り、特にすごいテクニックを要するわけではない。NPCは常に往復を続けて、行動は極めて普通だが道行く歩行者としては十分だし、相互作用さえなければ問題ない。次のセクションではもうすこし生命力を足していく。
-----
次回は巡回パターンを変更してもっと動きを足していくぜ!
関連記事
0 件のコメント:
コメントを投稿