Unity敵に追いかけられてみる(1

こんにちわネタ切れ言いながら頑張ってみます私です。
前回まではカメラ制御についてぼちぼちやってまいりました。

今までやったのは
キャラクターを作る
キャラクターをキーボードで操作する
カメラの動く範囲を制御する。。
ここまで来ました。。
じゃぁ、つぎ、何するかなぁ、と考えたのですが、
まあ、、ゲームで、プレイヤーが操作するキャラクターがいるならば敵を作るべきかな、、、と、おもい。
ま、敵がいるならプレイヤーは追っかけられるのが常と言いますか。

、、その程度で今回の内容を決定しております。
敵キャラ?作るところから?
いやいや、ちょうどいいのがおります。
ほら。

呼んだ?

雑に作り上げられたピンクアザラシです。序盤の敵としてはなかなか適当なキュートさではないでしょうか。

個人的最終着地点目標は最近よく見たゲームの広告であります。
中心にキャラクターがおりまして、その周りから大量の敵が続々発生するやつ。

最終目標
 大量のピンクアザラシに詰められる棒人間
辺りにしておきましょう

まずは追いかけさせるぜ!

仲良しキャラの仲をたがうゼ!(非道

さてさて、まずはピンクアザラシを棒人間に向かって動く処理を作りましょう。
・・・と、ちょっと調べて拍子抜けしております。
なぜなら、二つのオブジェクト間を見て、一定距離動かしてくれる処理ってのがすでにあるんですよ。いやはや。ほんと便利Unity!
その処理ですが、
Vector2.MoveTowardsになります。
調べりゃ出るぜ。
指定する内容は
・動かしたいオブジェクトの現在位置、
・移動先のオブジェクトの現在位置、
・スピード(動く距離
の三つであります。
これらを指定すると、動かしたいオブジェクトの移動先のポイントをVector2形式で返してくれるんですよ。
ほんと便利ぃー
サインコサイン・・・と、呪文を唱えそうになった私はもういらないのね、、、w

ちゃきちゃきコードを書きましょう。
えーっと?azarasiオブジェクトに新しいスクリプト(azarasiMoveにしました)を追加して・・

public class azarasiMove : MonoBehaviour
{
    GameObject ningen;
    // Start is called before the first frame update
    void Start()
    {
        ningen = GameObject.Find("testScnd");
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = Vector2.MoveTowards(transform.position, 
            ningen.transform.position, 3 * Time.deltaTime);
    }
}

ほいほい、これで完成ですよ✨
ほらほら

あざらし、、(圧

ほらほら、どんなに逃げてもあざらしがのしかかってくる(圧

・・・・え?Time.deltaTimeが何かって?
(´∀`*)ウフフ(笑ってごまかしたい
調べますよぉ
えっとですね、「前回フレームからの経過時間」ですって。
・・・・うん。
えーっと、1秒間に60フレームだから・・0.16くらいか?
それに3をかけてますね(どっかから拾ってきたソースだからよくわかってない私。

えーっと?要は、1秒間に進むのを「3」くらいにしたいってことなんですよね。
詳しく説明?(算数の説明がいっちゃんめんどい・・・
1回に動く距離が1/60×3 で、それが1秒60回動くわけですよ。
てことは、1秒に動く距離の計算は。。
1/60×3×60ですね。
で、答えが3になると。(端折り

まぁ、あれですね、最初から「0.02」とか数字を入れるのもありなんですが、
この書き方をすると秒速どんなもんかイメージしやすいっていうメリットがあるんでしょう。
あと、処理が重くなると、フレームごとの時間がちょっとぶれだして、
固定値を入れると動くスピードがガタガタしちゃうのかもしれません。

トラブル発生。。

と。。。ここでですね、なんだかうまく行かない事象に遭遇しております。
なんだ、あざらしが動いたり動かなかったりするのです。
原因がわからんのでちょっと調査してから続きを記述したいと思っております。
原因判明:アニメーションで、オブジェクトの位置を強制的に決めていた
でしたー
(調査時間2時間、、やってらんねぇな! ※指示をしたのは私w)

調査ついでに実装した内容

    void Update()
    {
        Vector2 hitoPosi = ningen.transform.position;
        if(hitoPosi.x < transform.position.x)
        {
            transform.localScale = Vector3.one;
        }
        else 
        {
            transform.localScale = new Vector3(-1,1,1);
        }
        transform.position = Vector2.MoveTowards(transform.position, hitoPosi,
            3.0f * Time.deltaTime);
    }

さてさて、このIF文、何をやっているでしょうか?
答:あざらしが棒人間の左右どちらにいるのかを判断しています。

左右の位置はxで決まっているので、
棒人間のポジションxより、あざらしのポジションxが小さい
 ⇒ アザラシが左側にいる
棒人間のポジションxより、あざらしのポジションxが大きい
 ⇒ アザラシが右側にいる
・・・で、この判断をした後に、何をしているかというと、、、
あざらしの向きを変えています。
前回、棒人間の向きを変えるのにSpriteRendereを使用しましたが。
今回、あざらしさんは複数のオブジェクトを抱えているので、SpriteRendereでは制御できません(いや、できるかもしれん、私が知らんだけかも。
で、どうするかと言いますと、左右の向きであればxのスケールを-1にすることで左右反転することができます。

おまけ
ちなみにフレーム間の時間、どんなもん(時間)か表示してみたんですが、「0.001」とか出てくるんですよねぇ(困惑)
まぁ、後々わかればいいや。
大事なのは「全部まとめてわかろうとしない」です。
算数でも足し算やって、引き算やって、掛け算をやるように、
わかる範囲からちまちまやって最終的に全容を把握できれば良いのですよ。

余談
GoogleでUnity関連の検索をするとき、2Dのときと、3Dの時で動かす処理は全く変わってくるので、マジで検索するときは「2D/3D」忘れないようにするんだよ
(ここまでいろいろ作ってきたけれど、何度も3Dのやり方でやろうとして、失敗している私からのお知らせ。)


・・・おぉ、今回は前置きなしでいけましたなぁ、、
えかったえかった。
ではでは。


この記事が気に入ったらサポートをしてみませんか?