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

はいはい、こんにちは、私です。
以前の記事こちら

記事書いてる時間バイトしたら儲かるんじゃね?とは思えど、家からは出たくありません。(引きこもり思考

前回はミサイル以外の部分(カメラ・ピンクアザラシ)での修正が完了した気がします。
今回はミサイルの動きです。

で、ですね、前回メモ書きで残していた気がします。

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

出典:わたし

一晩寝ながら考えたんですが(?
まぁ、rigitbody.AddForce()で渡すのがVector2と、力の適用方法だけなんですよね。
Vector2って、xとyの座標だけなんだけれどなぁ、、、と。
(ぽくぽくぽくぽく・・・・・💡)
で、ですねザクっと仮説を考えました。(ドキュメントよめw

公式ドキュメントおいとこw
(3Dと2Dでは内容が変わるので注意な。)
addForceって、座標(0,0)と、与えたVector2の座標をつないだ角度に向かって飛ぶってことかしら?
で、強さは中心位置からの距離って感じかしら。。。??

イメージ

こういうことだろうという前提で行きますわ。
じゃぁ、Vector2の座標はどうやって考えるかというと、
発射位置が0,0であった場合は棒人間の位置ですね。
発射位置が1,1で、棒人間が2,1だったら?1,0か、、、
(書きながら考えてるわたし)
じゃぁ、あれだ、
棒人間の座標ー発射位置でいけそうですわ。
ということでどーーーん。。

public class misairuMove : MonoBehaviour
{
    Rigidbody2D ugoki;
    GameObject ningen;
    // Start is called before the first frame update
    void Start()
    {
        ningen = GameObject.Find("testScnd");
        ugoki = GetComponent<Rigidbody2D>();
        Vector2 houkou = (ningen.transform.position - transform.position).normalized;
        ugoki.AddForce(houkou);
    }

    // Update is called once per frame
    void Update()
    {
    }
}

えーっと、棒人間の座標ー自身(ミサイル)のポジションをノーマライズドした値をAddforceでセットしました。
ノーマライズドしたのは0,0からの距離が力だと仮定するなら、一定距離にしておかないとスピードにばらつきが出るから、です。
実行どどーん

wwwwwwwwwww

えーっと。できました!
出来ましたよ!
ちゃんとミサイルが棒人間に向かって飛んでいるようです。
だた!

めっちゃ速い!!!w

音速ですね。w
ちょっと微調整しましょう
おそらく、、

このあたりか、、

ミサイルのこのあたりをメンテかければどうにかなると信じてる。。
ちょっとぼちぼちやってみますね。

ふむふむw

まぁ、いい感じですね。。えーっと質量で速さが変わりました。
おさかなミサイル、質量0.005でちょうど良い感じになりましたよ。
Unityのリファレンスにも書いてますね

重さが大きいほど特定速度まで加速させるのに、より多くの力が必要となります。

UnityDocumentation

スピードにばらつきもなく、なかなかいい結果ではないでしょうか。

次に、問題点が浮上しております。
「あざらしにミサイルが当たってしまう」
ですね。Rigidbody2Dをどちらにも設定しているという理由だと思うので、まぁ、こちらもRigidbody2Dを直せばいけるんじゃなかろうかと
ググってきまーす。

お・・・レイヤーを分ければいいらしいぞ。
レイヤーとは何ぞやと?

タグの横にいますね。

現状、どのオブジェクトもレイヤーはDefaultですね。
だからか、、(なにが?

ああ、せつめい。
えーっと、レイヤーを分けたうえで、
「このレイヤーのオブジェクトとは接触しません」という指示をするとそのオブジェクトとは接触しなくなるという機能があるようです。
うーん、じゃぁ、あざらしにレイヤーつけましょう。

あざらしのインスペクター

ザクザク行くぞ!
レイヤーから「レイヤーを追加」を押すとこんな画面が出ます。

適当に追加している

UserLayer7にazarasiというレイヤーを追加しました。

で?
あざらしをもう一度選択して―
レイヤーから、、、

お、いるいる7:azarasi

じゃあ、これをセットしましょう。ぽち
ん?

末代まで設定しますか?

指定したオブジェクトの中にあるやつら全員に設定しますか?ってことですね。
はい、ですね。はい、子を変更します。ぽちっとな。
で?
おさかなに戻る。
で、インスペクターのRigidbody2Dの、、、

除外レイヤー

LayerOverridesの除外レイヤーにazarasをセット。
で、もう一度実行でごんす。

うむ。よい。

もうひと頑張りですね。
後はあざらしと、ミサイル、どっちが手前にある方がいいか問題だけです。
えー現在、あざらしが前で、ミサイルが後ろをとおっています(スクショが取れねぇw
手前とかの指定はtransformの位置、zで指定できます。
・・・と、思ってたんだがなぁ、、
(なんでドキュメントってこんなに読みにくいんだろう_(´ཀ`」 ∠)_

うーん(どう説明すりゃいいのか困惑中。。
先ほど、レイヤーの話をしましたね、
えーと特定のレイヤーは接触対象外にする操作ができる。みたいなね。
で、そのレイヤーとは別に「ソートレイヤー」というものがありまして、、

こいつらね、

タグは、オブジェクトにつけて、そのタグ名のオブジェクトが何個あるかってのを判定するのに使いましたね。
レイヤーは先述の通り。
で、それとは別にソートレイヤーってのがあります。
これが、、えーなんなん?
まぁ、ざっくりいうと表示順を管理できるようです(困惑

こんな感じにしました。

ソートレイヤーを指定していないものを一番前(一番下が一番前になる様子。
その次に、azarasiソートレイヤー、
最後にbackgroundを指定しました。
で、これをどう使うかと言いますと、、
まずは backgroundから指定しますか。

haikei画像のインスペクター

SpriteRendererの追加設定、ソートレイヤーに指定します。
で、次、プレハブ「azarasi」にソートレイヤーをつけたいのですが、こいつ、たくさんのオブジェクトでできているため、

お、SpriteRendererがない。

azarasiオブジェクトの中のそれぞれのパーツに・・・

ぐぬぬ、、、

azarasiの中のパーツとなるオブジェクト(ボーン以外)を選択して、、
(どうしてもまとめてやっつけたいわたし)

Ctrlキーを押したまま選択すれば複数まとめて選択できるわよ

ソートレイヤーをazarasiにします。

おぉ、できそう。

プレハブに上書きをしまして、
で、、、実行しますと?

あざらしの上におさかなミサイル

でけました( ´ཫ` )
あとは、、、もうひとつ、、、、、、

ミサイルの傾きをどうすりゃいいんだ、、、

えーっと、、えーっと。。。。(しらべるわたし。
oh…みんな数学してる、、(愕然w

試行錯誤中の図w
試行錯誤の図2

数学わかんない。。サインコサインなんて、学校で一時間しかしなかったのに。。。_:(´ཀ`」 ∠):_ …
全ミサイルがケツを向けて飛んでくるのはこの計算式が・・・

Mathfの公式。。
えーっとですね、xとyから角度を取得したいので、
Atan2が使えそうですね。。。(公式見ながら、、
で?返すのがラジアン(?)なので、
ラジアン(?)を角度へ変換するために、、
Atan2で返ってきた値にRad2Degをかけると角度が出るようです、、
だから式はこんな感じ、

 Mathf.Atan2(houkou.y, houkou.x) * Mathf.Rad2Deg

棒人間の位置から、ミサイルの位置をひいて、normalizedした値が入っております。
で、これで返ってくる角度がですね、こんな感じなんです。

こんな感じ

こういった感じの角度が出てしまうんですね、
で、私が書いたおさかなミサイル、左向いた状態が0度ですの。
だから、これを実行すると、おしりが先頭になって飛んでってしまう、、、
ということで、
出てきた結果に-180します。
ソースはこんな感じ。

    void Start()
    {
        ningen = GameObject.Find("testScnd");
        ugoki = GetComponent<Rigidbody2D>();
        Vector2 houkou = (ningen.transform.position - transform.position).normalized;
        float kakudoZ = Mathf.Atan2(houkou.y, houkou.x) * Mathf.Rad2Deg -180;
        transform.rotation = Quaternion.Euler(0f,0f,kakudoZ);
        ugoki.AddForce(houkou);
    }


で、実行どーん。

おお、ちゃんと飛んでるw

なんだか説明が雑多になってしまいました。。。
後で、見直して書きなおそ。。

つぎは、、、ミサイルが棒人間に当たったら爆発するんだ・・・
行けるかなぁ、
ではでは。。

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