読者です 読者をやめる 読者になる 読者になる

【Unity】パトロールスクリプトを作ってみる

Unity

Unityが周りで流行りだしたのでUE4から乗り換えた。
一過性のブームみたいな何かかもしれないけど、それでも同じことしてる仲間がいればモチベになりやすいからとても有り難いのだ。

とはいえ、新しくツールを使い始めようとするとそこそこ勉強も必要になる。
とりあえず3Dゲームだと必要だよなって事でパトロールスクリプトを作ってみる事にした。

目的

Unity上のキャラクターに複数の地点を順々に巡らせるスクリプトを組む。
このような動きは3Dゲームだと割とよくある事で、例えばメタルギアソリッドだったら警備する兵士、ゼルダの伝説なら巡回するモリブリンにこの動きが見られる。

実装

ソースコード

とりあえず素直に実装してみた。
見たまんま配列に入れた地点を巡回する感じのプログラム。遮蔽物などは考慮しない。

using UnityEngine;
using System.Collections;

public class CapsulePatrol : MonoBehaviour {

    //巡回地点。若い順から
    public Vector3[] checkpoints;

    //到達マージン.どれぐらいの範囲で到達したと判定するか
    const float margin = 0.5f;
    const float speed = 1.0f;

    //目的地番号
    private int whereToGo = 0;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (checkpoints.Length == 0)
            return;

        if (checkpoints.Length <= this.whereToGo)
            whereToGo = 0;

        this.transform.position = Vector3.MoveTowards(this.transform.position, checkpoints[whereToGo], speed);

        if (Vector3.Distance(transform.position, checkpoints[whereToGo]) < margin)
            whereToGo++;

	}
}


変数が長くてとてもアレ。


checkpointsの中身はInspectorウィンドウで設定できる。何それ便利。でも気持ちわるっ

f:id:VirtualNoodle:20161003011921p:plain
capsuletypoがあるのう・・・

なんとなくnewとかしなくても良い感じだけどどこでここの処理入ってるんですかねえ・・・
publicにしないと駄目っぽいしなんかのスクリプトが裏にあるのかな?知らんけど。

結果

f:id:VirtualNoodle:20161003012154p:plain
f:id:VirtualNoodle:20161003012138p:plain
f:id:VirtualNoodle:20161003012145p:plain
f:id:VirtualNoodle:20161003012149p:plain

というわけでこの四点を巡回する感じの動きをしてくれた。
ってか早い。遠い。
1.0fって小さい値じゃないっぽい・・・
Unity世界での動きのスケールがイマイチ掴めていないのでその辺は適当に調べなければ。

考察

結構巡回それ自体はお手軽。Inspectorウィンドウさんのおかげで使いまわしやチェックポイントの増設は超楽。
移動方法は単純にチェックポイントの方向に向けて突っ込んでいるだけだから、遮蔽物とかがあるとストップしてしまうだろう。実験してないけど。
その辺はa*とかダイクストラとか使えばいいのかな?
なんて思ったけどぶっちゃけ「巡回」という目的を考えると元々ルートは決まっているのでそんな問題にはそもそもぶち当たりませんね。

あとはなんていうか、フラフラさせたかったり、直線で向かわせたくないかもしれないし、等速で向かわせるのも嫌だったりするかもしれない。
すると、ベジェ曲線とかスプライン曲線とか使って自然な感じに曲げちゃったりすればいいのかな?
思いつくのはこれぐらい。

ブログ、なんとかして動画を利用したいけどUnityだとアレだなぁ。めんどくさいなぁ