質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2934閲覧

unity 積み上がったオブジェクトの一番上にカメラを移動したい

Timgun

総合スコア18

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/11/27 09:20

編集2018/11/27 09:27

前提・実現したいこと

Unity、プログラミングとも、始めて2ヶ月の素人です。

◇積み上げゲームを作成しています
Unityを使って、積み上げゲームを作成しています。(C#を使用しています)
画面をタップするとオブジェクトが生成され、それをどこまでも高く積み上げることができるようにしたいと考えています。

◇積み上がったオブジェクトの一番上に常にカメラを合わせたい
積み上がったオブジェクトの一番上のオブジェクトに常にカメラ位置を合わせたいと考えています。
オブジェクトが順調に積み上がっている場合は、積み上がっているオブジェクトの一番上にカメラが移動します。
積み上がったオブジェクトの上部が崩れた場合は、積み残っている一番上のオブジェクトにカメラが移動する形です。

◇ヒントだけでもいただけると助かります!
色々と検索してみたのですが、同じようなことを実現しているサイトが見つかりませんでした。
まったくの素人で、どのように実現したら良いかヒントだけでもいただけると助かります。

試したこと

生成されるオブジェクトに、タグをつけて、そのタグを持つオブジェクトと、
画面上部に配置した測定用のオブジェクトの距離を取得。
画面上部に一番近いオブジェクトのY軸にカメラを合わせることを試しましたが、
画面上部でオブジェクトが生成されると、そのオブジェクトが下まで落ちても、カメラが追ってしまいうまくいきませんでした。

途中段階のアプリ

上記は実現できていませんが、途中段階のアプリをリリースいたしました。
https://play.google.com/store/apps/details?id=com.NekoBitoLab.GachaToysByEnglish

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

似たような回答を以前したことがあります。

Physics.BoxCastを使用して上から下に向かってRayCastをし当たったポイントを現時点での最高高度として取得するのはどうでしょうか
https://teratail.com/questions/123603

追記

Unity2Dというのを見落としていました
下記リンクを参考にPhysics2D.BoxCastを試してみてください
参考リンク

サンプルの追記

csharp

1public class RaycastTest : MonoBehaviour 2{ 3 void Update() 4 { 5 //現在の位置から X5 Y5のサイズをBOXを下(0, -1)方向にBoxCastする 6 var result = Physics2D.BoxCast(transform.position, new Vector2(5, 5), 0f, new Vector2(0, -1)); 7 8 //なにかと衝突した時だけそのオブジェクトの名前をログに出す 9 if (result.collider) 10 { 11 Debug.Log(result.collider.gameObject.name); 12 } 13 } 14}

イメージ説明

  1. スクリプトをRaycastStartPositionにアタッチ
  2. RaycastTargetには適切な2D Colliderをアタッチしておく

投稿2018/11/27 09:26

編集2018/12/04 08:49
MMashiro

総合スコア2378

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Timgun

2018/11/27 09:29

ありがとうございます! 早速、試してみたいと思います。 何分、素人なので時間がかかりそうですが、状況について後日、共有させていただきます。 宜しくお願いいたします。
Timgun

2018/12/04 02:31

返信が遅くなっておりまして、申し訳ございません。 Rayを使用するのが初めてだったので、一から調べたりしています。 画面上にカメラを設置したBoxを配置して、そこからRayを出して測定、Boxの位置を変更しようと考えております。 Physics2D.BoxCast のパラメータの設定方法がわからないため、もう少し初心者向けの説明等あると助かるのですが…
MMashiro

2018/12/04 06:22 編集

あとRayCastにはカメラは不要なので特に画面に映す必要がなければカメラは負荷のもとになるので消して問題ないと思います
Timgun

2018/12/04 05:28

ありがとうございます! 早速、拝見させていただきます。
Timgun

2018/12/04 06:37

両方のURL拝見させていただきました。 >BoxCast : https://gametukurikata.com/basic/physicsray わかりやすいサイトのご紹介をいただき、ありがとうございます! とてもイメージに近いスクリプトだったのですが、制作しているアプリが2Dのため、 Physics2Dとすると、パラメータが変わってしまい、どうしたらよいか悩んでおりました。 Physics2Dだと求めている機能は得られないでしょうか? http://megumisoft.hatenablog.com/entry/2015/08/13/172136 こちらはこれまでも何度か見ていたページでした。 こちらのスクリプトも真似てみたのですが、2Dだとうまくいかず…
MMashiro

2018/12/04 06:40

追記したので追記欄をご覧ください
Timgun

2018/12/04 08:17 編集

追記のURLありがとうございます。 こちらのページも以前より拝見しておりました。 見よう見まねで書き直してみたのですが、今ひとつ理解できていないので、うまくいっておりませんでした。 ``` void Update() { Ray ray = new Ray(transform.position, new Vector2(0, -1)); RaycastHit2D hit = Physics2D.BoxCast(ray.origin, (Vector2)ray.origin, (Vector2)ray.direction); //なにかと衝突した時だけそのオブジェクトの名前をログに出す if (hit.collider) { Debug.Log(hit.collider.gameObject.name); } } } ```
MMashiro

2018/12/04 08:47

Physics2D.BoxCastのリファレンスをよく読んでみてください https://docs.unity3d.com/ja/current/ScriptReference/Physics2D.BoxCast.html Rayを作成する必要はありません、Rayの開始位置、Boxのサイズ、Boxの角度、RayCastをする方向を指定するだけであとは勝手に処理を行ってくれます サンプルを回答本文に追加しましたので確認してみてください。
Timgun

2018/12/04 09:20

ありがとうございます! リファレンスを読んだのですが、パラメータの設定の具体的な方法がつかめておりませんでした。 このように書くのですね!大変助かりました。 これを参考に、位置を取得してカメラの位置を動かすスクリプトを作ってみます。 本当に、ありがとうございました。
MMashiro

2018/12/04 09:31

公式リファレンスを頻繁に見るようにするとなれると思いますので不明点があれば公式リファレンスを見るようにすることをお勧めします もしまだ不明点ありましたら新しく質問を立ててみてください
Timgun

2018/12/06 03:49

ありがとうございます! リファレンスを良く見てみるようにします。 下記の形でカメラを動かすことができました。 暗中模索する中で、本当に助かりました。 ''' using System.Collections; using System.Collections.Generic; using UnityEngine; public class BoxCastRayTest : MonoBehaviour { private void Start() { } void Update() { //カメラをGameObjectとして代入 GameObject maincamera = Camera.main.gameObject; //現在の位置から X5 Y5のサイズのBoxRayを下(0, -1)方向にBoxCastする var result = Physics2D.BoxCast(transform.position, new Vector2(5, 5), 0f, new Vector2(0, -1)); //なにかと衝突した時だけそのオブジェクトの名前をログに出す //if (result.collider) //{ //Debug.Log(result.collider.gameObject.name); //} //tag="toys"と衝突した時だけ if (result.collider.tag == "toys") { //resultのyをデバッグ用にコンソールに表示 Debug.Log(result.collider.gameObject.transform.position.y); //一定の高さに到達したらカメラを、resultのy位置に移動 //transform.position.z - 10 → Z軸で移動しておかないと、カメラが背景を表示してしまう if (result.transform.position.y > 2.5f) maincamera.transform.position = new Vector3(transform.position.x, result.transform.position.y , transform.position.z - 10); //カメラ移動 } } } '''
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問