【Unity初心者 ゲーム開発メモ】RaycastHit2DでGameObjectを確認し、gameObject.nameで使用する
皆さんお疲れ様です。
仮面男です。
皆さんいかがお過ごしでしょうか?
外出自粛明けてまたすぐに都内では緊急アラートが発令してしまいましたね。。。
外出自粛は正直ストレス溜まるかと思いますが、こんなときこそ家でしかできないことを継続し続けて、
新しい趣味や、好きなことを磨く時間に使っていきましょう!
そんなボクは漫画とかアニメがすごく好きなので、ここ最近も家では漫画をずっと読んでいます!
最近読んだ作品でまた面白いものを見つけたので載せておきますね!
※以下いつものように雑談なので、飛ばしたい人は本記事までスクロールしちゃってください(;^_^A
仮面男の今回のおすすめ漫画!!
今回紹介するのはこれです!
『クニミツの政』
この漫画は週刊少年マガジンで連載していてドラマ化もされた作品でして、腐った政治をぶっ壊して日本を変えるために政治家を目指す少年の物語なんですけど、予想以上に面白かったです。
最近、黒川元検事長の汚職や桜の会の問題などコロナ以外でも政界がざわついておりましたが、この作品もそういった一般の目には届かないような部分を結構わかりやすく、また面白く描いている作品のため、ぜひ時間に余裕のある方は読んでみてください!
2020年6月6日時点ではKindle Unlimitedで無料で読めるみたいです!
では、雑談はこの辺にして、早速本日のメモを書いていきます!
RaycastHitの概要
RaycastHitは簡単に言うとオブジェクトにHitしたら、そのオブジェクトの情報を返すセンサーのようなものです。
以下わかりやすく動画をつけます。※わかりやすく3Dでお見せしますが、メモのスクリプトは2Dに対してのスクリプトです。
動画内の白い球体の部分がRaycastHitで出している光線になります。
これは、プログラムで見えるようにしているのですが、実際には見えません。
動画内ではこの白い球体が地面に触れることで接地判定がtrueになり接地中はPlayerを移動させることができます。
※接地していないときにPlayerが動いたら空中散歩してワンピースの月歩状態ですからねw
RaycastHitで取得した情報
RaycastHitで取得したゲームオブジェクトの中身を見るとオブジェクトの名称が出力されます。
以下スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using UnityEngine; public class ClickOjects : MonoBehaviour { //Clickしたオブジェクトを格納する変数 string clickedGameObject; GameObject clickedGameObject2; void Update() { //左クリックをした場合ブロック内を実行 if (Input.GetMouseButtonDown(0)) { //Clickしたときに格納するため、スタート時点では何も入れない clickedGameObject = null; //メインカメラ上のマウスカーソルのある位置からRayを飛ばす Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //Raycastでレーザーを出してオブジェクトを調べる //ray.originでrayの原点を出す //ray.directionでレーザーを出す方向のベクトルを出す RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); //レーザーがヒットするとコライダーへの参照を持つRaycastHitオブジェクトを返す ※要はオブジェクトが存在することを返す //何もなければnullが返る //オブジェクトがいたら下記を実行 if (hit2d) { clickedGameObject2 = hit2d.transform.gameObject; } Debug.Log(clickedGameObject); ResultTrueScene2(clickedGameObject2); } } public void ResultTrueScene2(GameObject clickObject) { //下記でGameObject型のclickObjectをstring型へキャストしている string clickObjectString = clickObject.ToString(); //ここではusagiiconが表示される Debag.Log(clickObjectString); //下記でusagiiconという名前と一致したら、ブロック内を実行したい if (clickObjectString == "usagiicon") { Debug.Log(clickObjectString); } else { Debug.Log(false); } } } |
上記でRaycastHitでHitしたオブジェクト(上記スクリプトではクリックしたオブジェクト)がusagiiconと出力されているにも関わらず
if (clickObjectString == “usagiicon”)ではfalseになります。
実をいうと上のスクリプトではGameObjectの情報としてusagiiconが表示されるけれど、このまま条件式を記載しても一向にtrueになりません。
そのため、以下のようにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using UnityEngine; public class ClickOjects : MonoBehaviour { //Clickしたオブジェクトを格納する変数 string clickedGameObject; GameObject clickedGameObject; void Update() { //左クリックをした場合ブロック内を実行 if (Input.GetMouseButtonDown(0)) { //Clickしたときに格納するため、スタート時点では何も入れない clickedGameObject = null; //メインカメラ上のマウスカーソルのある位置からRayを飛ばす Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //Raycastでレーザーを出してオブジェクトを調べる //ray.originでrayの原点を出す //ray.directionでレーザーを出す方向のベクトルを出す RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); //レーザーがヒットするとコライダーへの参照を持つRaycastHitオブジェクトを返す ※要はオブジェクトが存在することを返す //何もなければnullが返る //オブジェクトがいたら下記を実行 if (hit2d) { clickedGameObject = hit2d.transform.gameObject; } Debug.Log(clickedGameObject); ResultTrueScene(clickedGameObject); } } public void ResultTrueScene(GameObject clickObject) { //GameObject型のclickObjectをそのまま条件式には使用できないため、下記でstring型へ変換している //clickObject.nameで指定することでオブジェクトの名前の情報を出力してくれます。 string clickObjectString = clickObject.name.ToString(); //ここではusagiiconが表示される Debag.Log(clickObjectString); //下記でusagiiconという名前と一致したら、ブロック内を実行したい if (clickObjectString == "usagiicon") { Debug.Log(clickObjectString); } else { Debug.Log(false); } } } |
最初のスクリプトではResultTrueScene関数内をstring clickObjectString = clickObject.ToString();と記述していたのですが、
string clickObjectString = clickObject.name.ToString();とすることで、ゲームオブジェクトの名前としてのusagiiconを取得でき、
条件式が思ったように実行され、Debug.Log(clickObjectString);がコンソールに出力されます。
今回のまとめ
ゲームオブジェクトの情報をRaycastHitで取得して変数に格納して、その変数をDebug.Logで出力するとゲームオブジェクトの名前がコンソールに出力されるため、
騙されてしまいましたが、当たり前のことですが、gameObject.nameで定義しないと、gameObject内の『名前』にアクセスすることはできないんですよね。
おそらく初心者の方で同じようなミスに当たる人もいると思ったのでメモに残しておきました。
※というのは建前で本音言うと、自分が同じ間違いを100%やらかすと思ったので備忘として残しました。。。
また、いろいろと失敗したこと、気が付いたことなどメモしていきますのでよかったら参考にしてください!
ではまた!
ディスカッション
コメント一覧
まだ、コメントがありません