Unityミサイルを発射してみる(1

前回は、その場の思い付きで爆発モーションを作成しました。
なんか、いい感じにできて満足しております。

骨は拾われずに済みましたw

はい、では今回です。
棒人間の見てくれもそろそろ直したいという思いはありますが、お絵描きは時間がかかるもんで、なかなか手が出せません。。
気が向けば、キャラクターの動かし方(もうちょっと細かく)みたいなノリでいければという思いもありつつ。。。。

と、いうことで、前置き長くなりましたね。
じゃぁ、、えーっと?なんだっけ、
ああ、あざらしがミサイルを発射するという処理を考えようかなぁ、と思っております。

前提条件として、
ミサイルはまっすぐしか飛ばない(棒人間を追尾しない
棒人間に当たったら爆発する。
という感じで、、行きたい!(いけるかなぁ、、、

ということで早速ドン!

おさかなミサイル

こういうのは書くの得意です。(適当
ついでに、

ピンク

色違いもちょっとつくっておきます。何に使うか?なんでしょうねぇ(無計画
で、これをUnityに取り込んで、
SpriteEditorなどを利用して、、、え?やりかた?
やり方はこのあたりを参考に。

あぁ、細かく動かすわけではないので、SpriteEditorでスライスするだけにします。
ボーンの設定はしません。
スライス?上のリンクで説明しています(過去の自分へ丸投げ

細かく動かしはしませんが、後ろの炎?は少しだけ動かしたいので、アニメーションもちょこっとだけ設定しました。
(炎部分だけスケールをちょっと変えるくらい

で、オブジェクトの準備は良いですかね?
あ、違うわ。えーっと接触判定もしたいので、数日前のやり方を思い出しながらコライダー2DとRigidbody2Dの設定をしておきましょう。

collider 2dセット(雑

はいはい。いい感じですかね?あとはサイズ感をあざらしに合わせて、、小さくしましょう

発射!(イメージ

ふむふむ、こんな感じですわね。
で、次?次はあざらしを大量発生させたあれと同じです(あれ?
えーっと、ぱたごにあ?ちがう、ぷらせぼ?、、、(ど忘れマジでw
プレハブだ!プレハブ化して、えーっと、、、Resourcesフォルダへ移動しましょう。

詳しくはこちらを参照くださいまし。
(過去の自分、けっこうやってんな。

で、こっからですかね。新しいところ。
次はあざらしが発射するという体にしたいですね、
あと、現在、あざらしは無限増殖ですが、最大容量も決めておきましょう
いったん10匹Maxあたりに。。。
それとそれと、あざらしが向かってくる速度を遅くし、、、
うむうむ、、、
じゃぁ、作業リストアップ

・ピンクアザラシに
 移動スピードを下げる
 ミサイル発射処理を追加する
・ミサイルに
 発射された位置と、棒人間を直線で結んだ線沿いに動く
 カメラの外まで移動したら消滅する
 棒人間に接触したら爆発モーションをつけて、消える
・カメラに
 ピンクアザラシ生成のスピードを下げる
 ピンクアザラシの生成上限を付ける(10匹くらい

ま、ざっとこんなもんですね。
じゃぁ、、、どっからやるよw
いいや、カメラのが軽そうだからカメラから行こ。
はーい、では、カメラの作業をザク―っとやります。

えー(ggrwts
表示されているオブジェクトの数え方にはタグをつけないとできないのかな、、、?
まぁ、これで行きます。

Resourcesフォルダに格納したazarasiプレハブ

Resourcesフォルダの中に格納しているプレハブ「azarasi」ですが、現在、タグの指定がありませんね。
調べたところによると、タグの設定をすると、現在表示されているオブジェクトの計上ができるようなので、これを変更します。

タグ一覧

せっかくなので、タグを作ってみます。タグを追加…をクリックしてっと。。。

ふむふむ

タグのところの右側にある+マークを押せばいけるんじゃなかろうか。。。

おお、なるほど。

azarasiという名前にしてSaveボタンを押しました。

お、できたのか、、、?

あ、この画面では選択できないので、改めて、、
Resourcesフォルダのプレハブ「azarasi」を選択しましょう。

よしよし

で、タグを。。。

azarasiタグがありますね。

azarasiにしましょう。

これでよいかな?

ででで、、
ソースを修正しましょう。

public class cameraMove : MonoBehaviour
{
    GameObject caractorObject;//プレイヤーのオブジェクト
    Vector2 playerIti;//プレイヤー位置
    Vector2 itiMax; //最大位置
    Vector2 itiMin; //最小位置
    Vector2 kameraMin; //カメラ移動最小位置
    Vector2 kameraMax; //カメラ移動最大位置
    float count_time; //時間カウント用
    const float putTime = 1.0f; //時間ごと

えーっと一番下、putTimeがあざらしを何秒ごとに張り付けるか、ってのを指定しているので、こちらを1秒ごとに変更しました。
で、ですね。
もう一点、、

    void Update()
    {
        count_time += Time.deltaTime;
        int azaCnt = GameObject.FindGameObjectsWithTag("azarasi").Length;
        if (count_time > putTime && azaCnt < 10)
        {

こちら、あざらし張り付け処理の条件がif文内になるのですが、
条件にazarasiが10匹以下の時という条件を追加しました。
int azaCnt = GameObject.FindGameObjectsWithTag("azarasi").Length;
このコードはazarasiとタグの付いたゲームオブジェクトの数を取得しています。
さてさて実行!

おらおらー

撮影に苦労しましたw
あざらしが10匹になると、それ以上出てこなくなりました。
あざらしの表示されるタイミングもゆっくり目になったのを確認しましたよ。

さて、、つぎが、あれだな。
あざらしの移動スピードの低下と、
ミサイルの発射処理ですね。
まぁ、現在、ミサイルの動きは実装していないので、その場にミサイルがぽっと出てきてくれれば良いなぁという感じかしら。
ふむぅ、、(長考・・・・・・

ミサイルを口から出したい(w
ふむぅ、、、(調査中。。。
出来なくなさそうではない(否定の否定
えーっと、そうね。どこから説明する?

ま、まずは発射タイミングのハンドリングですが、
カメラに実装しているあざらしさんのぺたぺたタイミングのやり方と同じですね。

public class azarasiMove : MonoBehaviour
{
    GameObject ningen;
    float countTime;
    const float putTime = 5.0f;
    // Start is called before the first frame update
    void Start()
    {
        countTime = 0;
        ningen = GameObject.Find("testScnd");
    }

    // Update is called once per frame
    void Update()
    {
        Vector2 hitoPosi = ningen.transform.position;
        if(hitoPosi.x < transform.position.x)
        {
            transform.localScale = new Vector3(0.5f,0.5f,0.5f);
        }
        else 
        {
            transform.localScale = new Vector3(-0.5f,0.5f,0.5f);
        }
        transform.position = Vector2.MoveTowards(transform.position, hitoPosi,
            1.0f * Time.deltaTime);
        countTime += Time.deltaTime;
        if(countTime > putTime)
        {
            GameObject misairu = (GameObject)Resources.Load("misairu");
            
        }
    }
}

えーっと最初のところに
float countTime;(時間カウント用
const float putTime = 5.0f;(5秒ごとに発射するぞというやつ。
あざらしが10体なので、5秒ごとってことは、まぁ、ざっと0.5秒に1つ発射される、、、、ハズ。。。。
で、

        if(countTime > putTime)
        {
            GameObject misairu = (GameObject)Resources.Load("misairu");
            
        }

ここで、貼り付け処理をします。
で、ですね、貼り付け場所を口元にしたいと。(個人的願望
じゃぁ、事前に口の位置を取得しないといけないということで、、
ドン!

public class azarasiMove : MonoBehaviour
{
    GameObject ningen;
    GameObject kuti;
    float countTime;
    const float putTime = 5.0f;
    // Start is called before the first frame update
    void Start()
    {
        countTime = 0;
        ningen = GameObject.Find("testScnd");
        kuti = transform.GetChild(0).GetChild(0).Find("mouse").gameObject;
    }

    // Update is called once per frame
    void Update()
    {
        Vector2 hitoPosi = ningen.transform.position;
        if(hitoPosi.x < transform.position.x)
        {
            transform.localScale = new Vector3(0.5f,0.5f,0.5f);
        }
        else 
        {
            transform.localScale = new Vector3(-0.5f,0.5f,0.5f);
        }
        transform.position = Vector2.MoveTowards(transform.position, hitoPosi,
            1.0f * Time.deltaTime);
        countTime += Time.deltaTime;
        if(countTime > putTime)
        {
            GameObject misairu = (GameObject)Resources.Load("misairu");
            Instantiate(misairu, kuti.transform.position, Quaternion.identity);
            countTime = 0;
        }
    }
}

コード全量張り直しw
kutiという口元のgameobjectを持っておく場所を作っておいて、
ミサイル貼り付けタイミングで、その位置を使用しております。
口元の取得方法ですが、
kuti = transform.GetChild(0).GetChild(0).Find("mouse").gameObject;
これでいけたらいいのになで、書いております。
以前、オブジェクトの親子関係~という話をちらーっとしたかと思いますが、

azarasiの中身

GetChild(0)っていうのは持っている子要素をとってきます。
azarasiから見るとkaradaです。
で、もう一度、GetChild(0)をすると、さらに子、
なので、karadaの中のbone_1になる、、ハズ、
で、次の、Find("mouse")は,そのbone_1の中から"mouse"という名前のオブジェクトを見つけ出している、、、という風になるはず、、、、

まぁ、やってみるでござる。
じっこー

wwwwwwww

なんか変だw
いや、まぁ理由はわかっている。。
あざらしにもミサイルにもRigidbody2Dをセットしているから、重なることができなくて、表示された瞬間に、あざらしの体の外へ瞬間移動してしまうのだ。。。。
わかっている。。。
ちょっと面白いからこのままにしようw

ちょ、もうこんな時間か、、、
続きは次回とさせてください。
ではでは。

メモ書き
rigitbody2dですね、AddForceで、射出角の出し方を考える。
スピードが何で決まるかがちょっと問題。

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