Unityミサイルを発射してみる(2
はいはい、こんにちは、私です。
以前の記事こちら
記事書いてる時間バイトしたら儲かるんじゃね?とは思えど、家からは出たくありません。(引きこもり思考
前回はミサイル以外の部分(カメラ・ピンクアザラシ)での修正が完了した気がします。
今回はミサイルの動きです。
で、ですね、前回メモ書きで残していた気がします。
一晩寝ながら考えたんですが(?
まぁ、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からの距離が力だと仮定するなら、一定距離にしておかないとスピードにばらつきが出るから、です。
実行どどーん
えーっと。できました!
出来ましたよ!
ちゃんとミサイルが棒人間に向かって飛んでいるようです。
だた!
めっちゃ速い!!!w
音速ですね。w
ちょっと微調整しましょう
おそらく、、
ミサイルのこのあたりをメンテかければどうにかなると信じてる。。
ちょっとぼちぼちやってみますね。
まぁ、いい感じですね。。えーっと質量で速さが変わりました。
おさかなミサイル、質量0.005でちょうど良い感じになりましたよ。
Unityのリファレンスにも書いてますね
スピードにばらつきもなく、なかなかいい結果ではないでしょうか。
次に、問題点が浮上しております。
「あざらしにミサイルが当たってしまう」
ですね。Rigidbody2Dをどちらにも設定しているという理由だと思うので、まぁ、こちらもRigidbody2Dを直せばいけるんじゃなかろうかと
ググってきまーす。
お・・・レイヤーを分ければいいらしいぞ。
レイヤーとは何ぞやと?
現状、どのオブジェクトもレイヤーはDefaultですね。
だからか、、(なにが?
ああ、せつめい。
えーっと、レイヤーを分けたうえで、
「このレイヤーのオブジェクトとは接触しません」という指示をするとそのオブジェクトとは接触しなくなるという機能があるようです。
うーん、じゃぁ、あざらしにレイヤーつけましょう。
ザクザク行くぞ!
レイヤーから「レイヤーを追加」を押すとこんな画面が出ます。
UserLayer7にazarasiというレイヤーを追加しました。
で?
あざらしをもう一度選択して―
レイヤーから、、、
じゃあ、これをセットしましょう。ぽち
ん?
指定したオブジェクトの中にあるやつら全員に設定しますか?ってことですね。
はい、ですね。はい、子を変更します。ぽちっとな。
で?
おさかなに戻る。
で、インスペクターのRigidbody2Dの、、、
LayerOverridesの除外レイヤーにazarasをセット。
で、もう一度実行でごんす。
もうひと頑張りですね。
後はあざらしと、ミサイル、どっちが手前にある方がいいか問題だけです。
えー現在、あざらしが前で、ミサイルが後ろをとおっています(スクショが取れねぇw
手前とかの指定はtransformの位置、zで指定できます。
・・・と、思ってたんだがなぁ、、
(なんでドキュメントってこんなに読みにくいんだろう_(´ཀ`」 ∠)_
うーん(どう説明すりゃいいのか困惑中。。
先ほど、レイヤーの話をしましたね、
えーと特定のレイヤーは接触対象外にする操作ができる。みたいなね。
で、そのレイヤーとは別に「ソートレイヤー」というものがありまして、、
タグは、オブジェクトにつけて、そのタグ名のオブジェクトが何個あるかってのを判定するのに使いましたね。
レイヤーは先述の通り。
で、それとは別にソートレイヤーってのがあります。
これが、、えーなんなん?
まぁ、ざっくりいうと表示順を管理できるようです(困惑
ソートレイヤーを指定していないものを一番前(一番下が一番前になる様子。
その次に、azarasiソートレイヤー、
最後にbackgroundを指定しました。
で、これをどう使うかと言いますと、、
まずは backgroundから指定しますか。
SpriteRendererの追加設定、ソートレイヤーに指定します。
で、次、プレハブ「azarasi」にソートレイヤーをつけたいのですが、こいつ、たくさんのオブジェクトでできているため、
azarasiオブジェクトの中のそれぞれのパーツに・・・
azarasiの中のパーツとなるオブジェクト(ボーン以外)を選択して、、
(どうしてもまとめてやっつけたいわたし)
ソートレイヤーをazarasiにします。
プレハブに上書きをしまして、
で、、、実行しますと?
でけました( ´ཫ` )
あとは、、、もうひとつ、、、、、、
ミサイルの傾きをどうすりゃいいんだ、、、
えーっと、、えーっと。。。。(しらべるわたし。
oh…みんな数学してる、、(愕然w
数学わかんない。。サインコサインなんて、学校で一時間しかしなかったのに。。。_:(´ཀ`」 ∠):_ …
全ミサイルがケツを向けて飛んでくるのはこの計算式が・・・
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);
}
で、実行どーん。
なんだか説明が雑多になってしまいました。。。
後で、見直して書きなおそ。。
つぎは、、、ミサイルが棒人間に当たったら爆発するんだ・・・
行けるかなぁ、
ではでは。。
この記事が気に入ったらサポートをしてみませんか?