Unityで看護師カプセルエージェントの自律移動と障害物回避テスト。NurseWander.cs × Raycastの実装記録
看護師カプセルの自律移動と回避テスト
廊下をパトロールするハコブくんの前に、不規則に動く障害物として看護師さん(オレンジ色のカプセル)を導入しました。病院という予測不能な環境での安全性を検証するため、まずは看護師さんが自律的に歩き回り、ハコブくんがそれを検知して一時停止する動くワイヤーフレームを構築しました。
※薬剤搬送ロボットハコブくんは技術検証用の仮想設定です。 実用化目的ではなく、制御・UIデザイン・HRI(人間とロボットの相互作用)の本質を探求するコンセプトとして定義しています。
看護師さんのランダム歩行ロジックの実装
新しく NurseWander.cs というスクリプトを作成し、看護師カプセルにアタッチしました。廊下の範囲内(Range X, Z)でランダムな目標地点を次々に設定し、秒速 0.5m 程度のゆっくりとした速度で彷徨うように設定しました。
対人衝突回避の自動検証
ハコブくん側のコードは、すでに前方にある Collider(衝突体)」を検知して止まる仕様になっているため、追加の修正なしで動く看護師さんにも反応できるかテストしました。進路を横切る看護師さんを検知した瞬間、即座にブレーキがかかり BRAKE!! が表示されることを確認しました。
動的な進路確保と自動復帰
看護師さんが通り過ぎて進路が空くと、ハコブくんは自らブレーキを解除し、パトロールを再開しました。この「動くものに対する待機と復帰」が実現したことで、静止画のようなシミュレーションから、一気に「生きている現場」に近いワイヤーフレームへと進化させることができました。
実装した「NurseWander.cs」の内容
看護師さんが廊下からはみ出さず、かつハコブくんの邪魔を適度にするように作成したコードです。
C#
using UnityEngine;
public class NurseWander : MonoBehaviour
{
public float speed = 0.5f; // 看護師さんの歩行速度
public float rangeX = 0.8f; // 廊下の横幅方向の移動制限
public float rangeZ = 4.0f; // 廊下の奥行き方向の移動制限
private Vector3 targetPosition;
private float changeTargetTimer = 0f;
void Start()
{
SetNewTarget();
}
void Update()
{
// 目標地点に向かって移動
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
// 目標に到達するか、一定時間(5秒)経過したら次の目標を設定
changeTargetTimer += Time.deltaTime;
if (Vector3.Distance(transform.position, targetPosition) < 0.1f || changeTargetTimer > 5f)
{
SetNewTarget();
changeTargetTimer = 0f;
}
// カプセルが倒れないように回転を固定
transform.rotation = Quaternion.identity;
}
void SetNewTarget()
{
// 廊下のサイズに合わせてランダムな座標を算出
float randomX = Random.Range(-rangeX, rangeX);
float randomZ = Random.Range(-rangeZ, rangeZ);
targetPosition = new Vector3(randomX, transform.position.y, randomZ);
}
}
看護師カプセルの物理・コンポーネント設定
スクリプトを動かす土台として、Unityのエディタ側で以下の設定を確認してください。
Rigidbody の追加と固定: 看護師カプセルに Rigidbody を追加します。
Constraints:
Freeze Rotation XとZにチェックを入れます。これにより、ハコブくんと接触しても看護師さんが倒れなくなります。
Tag または Layer の設定(推奨): 看護師さんに 「Nurse」 という Tag を付けるか、専用の Layer を作成して割り当てます。
これをしておくと、将来的に「壁で止まった時は BRAKE !!」「看護師さんで止まった時は Excuse me」と表示を分けるといった制御が楽になります。
Tag設定方法
Hierarchy で看護師カプセルを選択します。
Inspector の一番上、名前のすぐ下にある 「Tag」(現在は
Untagged)をクリックし、一番下の 「Add Tag...」 を選びます。Tags & Layersという画面が出るので、「+」 を押してNurseと入力して保存します。重要: もう一度 看護師カプセル を選択し、Tag を今作った
Nurseに切り替えます(これで見分けがつくようになります)。
Layer(レイヤー):物理的な「グループ」を決める
レイヤーは、物理演算やカメラ、そして今回のセンサー(Raycast)が「何を無視するか・何に集中するか」を決めるために使います。
設定方法
Inspector の Tag の右隣にある 「Layer」(現在は
Default)をクリックし、「Add Layer...」 を選びます。空いている番号(User Layer 6など)に
Nurseと入力します。もう一度 看護師カプセル を選択し、Layer を
Nurseに切り替えます。
これで何ができるようになる?
ハコブくんのセンサーの設定で、「Nurseレイヤーのオブジェクトだけを無視して進む(あるいはそれだけを検知する)」といった高度なフィルタリングが可能になります。
シミュレーションの動態化。自律移動スクリプト
ハコブくん側の「センサー感度」の微調整
看護師さんは壁と違って動くため、ハコブくんが止まるタイミングが重要です。
Sensor Range の再調整: 壁に対しては
0.8で良くても、動く看護師さんに対しては少し余裕を持って1.0程度に広げると、より「安全に配慮しているロボット」らしく見えます。サイドセンサーの衝突防止: 看護師さんが横から追い越そうとした時に、ハコブくんが急に動いて接触しないよう、
Side Rangeも適切(0.2〜0.3)に設定されているか再度確認します。
作業のポイントと確認結果
物理特性の確認: 看護師カプセルに Capsule Collider が付いていることを確認しました。これにより、ハコブくんの Raycast が「障害物」として正しく認識できるようになっています。
速度のバランス: ハコブくんのパトロール速度(0.3m/s)に対し、看護師さんを 0.7m/s に設定することで、ハコブくんが立ち往生しすぎず、かつ「避けるべき対象」として機能する適切なバランスを追求しました。
動作確認の成果
看護師さんが廊下をゆらゆらと歩き回る様子を確認しました。
ハコブくんが看護師さんに近づいた際、警告音とともに安全に停止することを確認しました。
看護師さんが進路を譲ると、ハコブくんが自動的にパトロールを再開する一連の流れが完成しました。
