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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

753閲覧

範囲を広くして実行させたいです。

integral2ydx

総合スコア7

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/11/15 07:09

編集2021/11/17 05:45

イメージ説明

白玉を動かして赤い長方形の物体を移動させるシミュレーションです。

ここに質問の内容を詳しく書いてください。
unityでは実行すると白い枠内でゲームが実行されると思いますが、その枠内を超えた場合でも、画面を映し続ける方法はありますか?

試したこと

カメラをスクリプトで移動させるプログラムを組んだのですが、白玉に追従させて動かすため、マウスのドラッグスピードが速すぎて、カメラ酔いするというデメリットがあります。

ここに問題に対して試したことを記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

現状のカメラ追従コードはどうなっていますでしょうか?
たとえばもし下記のようにターゲットにぴったり追従させているとしたら、確かにカメラの動きが激しくなりすぎるかもしれません。

lang

1using UnityEngine; 2 3[RequireComponent(typeof(Camera))] 4public class CameraController : MonoBehaviour 5{ 6 [SerializeField] private Transform target; 7 private float cameraZ; 8 9 private void Start() 10 { 11 this.cameraZ = this.transform.position.z; 12 } 13 14 private void LateUpdate() 15 { 16 var position = this.target.position; 17 position.z = this.cameraZ; 18 this.transform.position = position; 19 } 20}

これを、たとえば下記のように追従具合を穏やかにしてやれば、いくらか落ち着くんじゃないかと思います。

lang

1using UnityEngine; 2 3[RequireComponent(typeof(Camera))] 4public class CameraController : MonoBehaviour 5{ 6 [SerializeField] private Transform target; 7 [SerializeField][Range(0.0f, 5.0f)] private float smoothTime = 1.0f; 8 private float cameraZ; 9 private Vector2 velocity; 10 11 private void Start() 12 { 13 this.cameraZ = this.transform.position.z; 14 } 15 16 private void LateUpdate() 17 { 18 var currentPosition = (Vector2)this.transform.position; 19 var destination = (Vector2)this.target.position; 20 var position = Vector2.SmoothDamp(currentPosition, destination, ref this.velocity, this.smoothTime); 21 this.transform.position = new Vector3(position.x, position.y, this.cameraZ); 22 } 23}

あるいはCinemachineを使ってみるのもいいかと思います。設定項目が多くてとっつきにくいかもしれませんが、たとえば中央にデッドゾーンを設けて...

図1

中央付近でボールを動かしてもカメラは動かず、画面端に近づくとスクロールする...みたいな挙動も作りやすいでしょう。

図2

Cinemachineについては比較的使用例が見つかりやすいだろうとは思いますが、特に今回のような2Dプロジェクトの場合は、検索キーワードを「Cinemachine 2D」とでもした方がいいかもしれませんね。

投稿2021/11/17 19:57

Bongo

総合スコア10811

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

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

integral2ydx

2021/11/18 07:30

返信ありがとうございます!おっしゃる通りのスクリプトを作りました。unityの教科書でそれが紹介されてたので、正直それしか使い方わからなかったんですよね。 ,,, using UnityEngine; public class CameraController : MonoBehaviour { GameObject player; void Start() { this.player = GameObject.Find("Circle"); } void Update() { Vector3 playerPos = this.player.transform.position; transform.position = new Vector3(playerPos.x, playerPos.y, transform.position.z); } } ,,, .インスペクターのターゲットというのはカメラが着目する物体を決めるという意味でしょうか? ・Serializefild最強ですね!Serializefildがちょっと調べても説明が難しくてわかっていないのですが、インスペクターに自分で操作できるものを表示する。というような理解で大丈夫ですか?また、Serializefildできる構文のようなものは紹介されているのでしょうか? ・Void updateとかstartの部分はいじれたんです?!知らなかったです、、
Bongo

2021/11/18 21:38

ターゲットについてはおっしゃる通りです。投稿しましたコード中の「target」に、インスペクター上でカメラの注目対象...つまり白玉をセットしていただくことを想定していました。 ご質問者さんのコメントいただいたコードは注目対象をStart時にFindで探す方式になっていますが、それでも問題ないかと思います。 SerializeFieldについても、おっしゃるようにインスペクター上に表示して編集できるようにするというご認識でさしあたり不都合はなさそうです。 フィールドをシリアライズする...というのは、大ざっぱに言うとシーンファイルやらプレハブファイルやらに、フィールドに設定された値を保存しておくことを指すものかと思います。このおかげで、実際にゲーム実行時にシーンがロードされたり、プレハブからオブジェクトを作ったりした時に自動的にフィールドの値が保存されたデータから復元され、シーン編集の際にインスペクター上で設定した通りの値になるわけです。 フィールドをシリアライズできるかどうかについては、マニュアルの「スクリプトのシリアル化」(https://docs.unity3d.com/ja/current/Manual/script-Serialization.html )の「シリアル化のルール」の節をご覧いただくのがいいでしょう。 何だかやたら条件が多くて複雑に思われるかもしれませんが、スクリプトを書く上でよく登場するポピュラーな型(intやfloat、Vector系、GameObject、GameObject上のTransformやらRigidbody2DやらSpriteRendererやらMonoBehaviourやらといったコンポーネント、SpriteやMaterialなどのアセット類...)はあらかた大丈夫なはずですので、大抵は不都合はないかと思います。 インスペクター上で編集させたい場合は、とりあえずpublicにしたり[SerializeField]を付けてみたりして、ちゃんとインスペクター上に設定欄が出現すればシリアライズできていると考えていいでしょう。 「Void updateとかstartの部分はいじれたんです?!」とおっしゃるのは、もしかして頭に「private」が付いていることについてでしょうか? もしそうでしたら、あれは単に私のスタイルにすぎませんのでお気になさらないでください。わざわざ「private」と書かなくても、privateを省略したメンバーは自動的にprivate扱いになるため動作上の違いはないはずです。 私の環境にはコードを自動整形してくれる補助ツールがインストールされていまして(https://www.jetbrains.com/ja-jp/resharper/ )、それの設定を「privateなメンバーには明示的に『private』を付ける」というルールにしてあるだけのことなのです。
integral2ydx

2021/11/19 05:00

自分のコードでも動けたのですが、早すぎたのでその動きを和らげる機能がわからなかったんですよね。 自分もSerializefild使ってみようと思います! smoothTimeみたいな文言はもともとあるものなんでしょうか?それとも自分で作ったワードなのでしょうか?もし前者であれば、どこかに設定できるワード集のようなものがあるのでしょうか? privateとかではなくて、updateとかstartの部分をLateupdateみたいなものがあることを知らなかったです。っていう感想のようなものです。 紹介してくださったコードは、使いたい機能を検索したらそのワードが出てくるというようなものですか?
Bongo

2021/11/19 18:32

smoothTimeというフィールド名は私が勝手に付けたものです。ご質問者さんにとってしっくりくる名前にしていただいて問題ありません。SmoothDampのリファレンス(https://docs.unity3d.com/ja/current/ScriptReference/Vector2.SmoothDamp.html )によると目標時間のパラメーターにsmoothTimeという名前を使っているようでしたので、それをまねてみました。 フィールド名に関しては、私の思い当たるかぎりでは設定できるワード集的なもの...つまり「正確に○○という名前を付けないと動作しない」といったものはなかったかと思います。 StartやUpdateをいじったとおっしゃったのは、UpdateをLateUpdateに変更したことを指していたのですね。確かに新規スクリプトを作成するとあらかじめStartとUpdateが定義された状態になりますが、おそらくあれは初期化に便利なStartと、毎フレームの状態更新に便利なUpdateは頻繁に使うだろうから...という理由からじゃないかと思います。 ですのでStartやUpdateが不要なら削除してしまってもかまいません。今回LateUpdateを使ったのは、LateUpdateのリファレンス(https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.LateUpdate.html )にもちょこっと記述がありますが、カメラの追従にはUpdateよりも後のタイミングで動くLateUpdateの方が他のスクリプトの影響を受けづらいんじゃないかな...と思ってのことです。 使いたい機能を検索したらそのワードが出てくるか、という点についてはどうでしょうかね...? 私の場合はたまたまSmoothDampの使用経験があって、カメラがゆったりついてくる動きにあれが使えそうだと思ったのですが、「Unityのマイナーだけど便利な関数を使ってみた【Vector3.SmoothDamp】 | TECH PROjin」(https://tech.pjin.jp/blog/2016/12/14/unity_minor_1/ )でもマイナー呼ばわりされてしまっており、検索には引っかかりづらいかもしれません。 試しに「Unity 追従 なめらか」で検索(https://www.google.com/search?q=Unity+%E8%BF%BD%E5%BE%93+%E3%81%AA%E3%82%81%E3%82%89%E3%81%8B )してみてもSmoothDampはなかなか登場せず、Lerpを使った方法(たとえば https://qiita.com/yoship1639/items/9bf6f8ad080b3c496b12#%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9lerp%E6%B8%9B%E8%A1%B0 )が引っかかりやすいような印象でした。私は個人的にSmoothDampの動きが気に入ったので例示のコードで使ったのですが、Lerpの動きの方がお好みでしたら書き換えてしまってください。 実現したい機能がありましたら、まずはその方法が引っかかりそうな単語を並べて検索してみて(とはいえ単語を選ぶのが難しいケースもあるでしょうし...悩ましいところですね)、出てきた方法を使ってみるのでいいんじゃないでしょうか。 検索した結果、その方法だとこういう挙動になってしまうので不満だ...とか、今回の場合はこういう要求事項があるのでこの方法は使えない...とか、そもそも方法が見つからない...とかいったことがあるかもしれません。その際にはそういった調査過程を添えてご質問いただければ、もしかすると別の手をご存じの方から何か手がかりを示していただけるかもしれませんね。
integral2ydx

2021/11/22 06:16

なるほどです。名前は自由だけど、機能を設定するのは少し難しそうな印象ですね。 いろいろな経験が生きてのこのスクリプトがあるのですね! アドバイスありがとうございます!今度からは、調査過程も試したことで記載しようと思います。
integral2ydx

2021/11/22 06:56

Cinemachine 2Dというものを追加してみたのですが、ヒエラルキーウィンドウにあるCM vcam1を選択した状態で実行すると画面に青い範囲のようなものが出てきて、MainCameraを選択すると、最初に教えていただいた挙動になります。これは、完全にカメラの使い方が別物ということでしょうか? 感想としては、MainCameraのほうが、画面に変な範囲もなく、一番後ろの黄玉まで画面に収まっているので便利な気がしました。
Bongo

2021/11/22 10:48

そうですね。あの枠はCM vcam1側の設定に関連する部分なので、そちらを選択した場合に表示されることになります(ちなみに、「Game Window Guides」のチェックボックスをオフにしたり、「Body」の設定項目を折りたたむと非表示になるかと思います)。 Cinemachineは設定項目がカメラオブジェクト単独に集約されてはおらず、シーン上に必要に応じていくつもバーチャルカメラを設置し、本物のカメラはそれらバーチャルカメラの間を渡り歩いていくようなコンセプトになっていますので、そこもとっつきにくいポイントかもしれませんね。 市販ゲームのようないい感じのカメラワークを実現する上では強力な機能だと思いますが、ちょっとカメラを追従させたい場合には確かに大仰すぎるところはあると思います。回答中の例はあくまでも別の選択肢の例示にすぎませんので、お好みの方法をとっていただくのがいいでしょう。 ちなみにすでにご存じかもしれませんが、Cinemachineを使うと本来のカメラの制御がCinemachineに奪われてしまい、インスペクター上でのカメラ設定が一部できなくなってしまうはずです。Cinemachineが不要なら、カメラからCinemachineBrainを削除してしまえば元通りになるかと思います。
integral2ydx

2021/11/22 11:34

すいません、そのガイドはどこにあるのでしょうか?bodyの設定項目を折りたたむというのは、▽のようなものを閉じるという意味でしょうか? 確かに項目は多いですね。英語で分かりにくかったので、特に何もいじっていません。 気が付きませんでした。ドラッグを辞めたら物理演算は停止するので、今のところ不自由はなかったです。
integral2ydx

2021/11/22 11:59

こちらこそ読解力なくてすみません。 bodyを折りたたむほうはできませんでしたが、別のほうはできました。 ガイドというくらいだから、メニューバーばかり探していました。すいません、、
integral2ydx

2021/11/22 12:02

smoothTimeはドラッグのスピードを調整するものですよね? おそらくこれが、カメラ制御奪われているかもしれませんね。
Bongo

2021/11/22 12:13

ええ、ドラッグのスピードを(もっと正確に言えば、カメラが白玉のところに移動するまでのおおよその時間を)調整するものなのですが...もしかして回答の前半で例示しましたスクリプトと後半で紹介しましたCinemachineを同時に使用していらっしゃるのでしょうか? もしそうでしたら、それでは両者が干渉してしまってまずいかと思います。CameraControllerはカメラから削除してCinemachineだけでコントロールするか、あるいは逆にCameraControllerを残してCinemachineを削除していただくべきでしょう。
integral2ydx

2021/11/23 02:41 編集

やはり、どうでしたか。Cinemachineはチェックマークを外すだけにしときます(笑) アドバイスくださり、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問