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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

Q&A

解決済

1回答

964閲覧

カメラ映す範囲制御について

BRAK

総合スコア98

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/02/17 05:47

編集2020/02/17 05:48

カメラ制御について
追従するプレイヤーを映している、カメラの範囲をx,y,z決めたのですが、z軸方向だけ追従せず動かないままになっているのですが解決策を教えてください。

c# public Vector3 maxPosition; public Vector3 minPosition; if (m_Target != null) { //カメラとターゲットとの距離 Vector3 targetPosition = new Vector3(m_Target.position.x, m_Target.position.y, transform.position.z); //カメラの移動上限 targetPosition.x = Mathf.Clamp(targetPosition.x, minPosition.x, maxPosition.x); targetPosition.y = Mathf.Clamp(targetPosition.y, minPosition.y, maxPosition.y); //maxPosition.z = m_Target.transform.position.z - Camera.main.transform.position.z; transform.position = Vector3.Lerp(transform.position, targetPosition, deltaTime * m_MoveSpeed); }

transform.position = m_Target.positionを多用してzのみに制限をつけずにやったのですがうまくいきませんでした。
制限自体をつけない場合はどこまでも追従します。

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

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

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

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

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

izmktr

2020/02/17 06:33

Vector3.Lerpを間違った使い方をしていますが、それはわかった上でやっていますか?
BRAK

2020/02/17 06:47

Lerpとはある位置から所定の位置へ移動させる関数ですよね?
BRAK

2020/02/17 06:53

このスクリプト自体はunityのstanderdassetから知り合いが拾ってきたものらしくそのうえで処理を書き直しています。 もともとは上に書いてある別のもので書いています。
izmktr

2020/02/17 07:22

Lerpは第3引数に0~1を与えて、A点からB点へ等速直線運動するものです 基本的にA点もB点も同じ座標を指定して、第3引数の値を増やしていきます
BRAK

2020/02/17 07:31

Lerpを使わずしてもplayer.positionでplayerの位置にカメラを写しても範囲が上手くいかないのですが、その場合どのようなスクリプトを組むのが最適ですか?
guest

回答1

0

ベストアンサー

現状のコードでは、
Vector3 targetPosition = new Vector3(m_Target.position.x, m_Target.position.y, transform.position.z);
ここでZがtransform.position.z、つまり自身のZ位置になっているので動きようがありません。

さらに
maxPosition.z = m_Target.transform.position.z - Camera.main.transform.position.z;
この行のコメントを外したとしても、maxPositionは(この行の後の)どこにも使われていないので反映されるはずがありません。
また、この書き方だと「m_Targetから一定距離離れた状態で追従し続ける」のでそもそも制限になっていません。

なので
Vector3 targetPosition = m_Target.position;
targetPosition.z = (何か適切な制限を加える処理。XやYと同じくMathf.Clampを使うとか);
と書き換えればいいと思います。(他の部分は今と一緒)


ちなみにVector3.Lerpは厳密に言うと「運動する」ものではありません。
「第一引数地点と第二引数地点の間の、第三引数で示された地点」を返します。
(例えばVector3.Lerp(transform.position, targetPosition, 0.5f)なら、「自分の座標とtargetPositionの丁度半分(50%)の地点の座標」を返します)
それをtransform.positionに代入するので結果的に位置が変更されるだけです。

投稿2020/02/17 08:29

sakura_hana

総合スコア11427

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

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

BRAK

2020/02/17 14:22

なんでz軸方向のみ動かないのか回答してくださりありがとうございます。 たしかに自信を参照する形に書いてありました。 すみません、また、実はzに関しては制限処理はいらず、追従させるだけでよかったのですが、自分で書いたものだと追従しなかったので制限を加えたら移動するのかな。と思い書きました。 lerp系処理の説明に関しても改めてわかりやすい回答ありがとうございます。 ただなぜこのlerpというものを使わないほうがいいという理由がいまいちわかりません。 常に代入し続けるということは処理が圧倒的に重くなり、それを避けるためとかですか?
BRAK

2020/02/17 15:30

ありがとうございます。ちょっと付け加えて無事できました。 if (m_Target != null) { //カメラとプレイヤーとの距離 Vector3 targetPosition = m_Target.position; //カメラの移動上限 targetPosition.x = Mathf.Clamp(targetPosition.x, minPosition.x, maxPosition.x); targetPosition.y = Mathf.Clamp(targetPosition.y, minPosition.y, maxPosition.y); targetPosition.z = Mathf.Clamp(targetPosition.z, minPosition.z, maxPosition.z); //追従処理 transform.position = targetPosition; }
sakura_hana

2020/02/18 00:47

とりあえず無事に動いたようで何よりです。 >自分で書いたものだと追従しなかったので制限を加えたら移動するのかな 何故こう思ったのか定かではありませんが、まずは「この変数の値は何を示しているのか」「このメソッドは何をするのか」を正しく把握するといいと思います。 (今回私がやったように「この動かないコードは何をしているのか」を紐解くと何が問題なのか分かりやすくなります) >lerpというものを使わないほうがいい 別にそんなことは言っていません。 常に代入し続けるのは「transform.position = targetPosition;」でも同じです。 ぶっちゃけ元コードでもVector3.Lerpの使い方自体は間違ってないです。 (というかm_Target.positionとtransform.positionが離れている場合、Vector3.Lerpを入れないと滑らかな動きにならない) ただ『「Vector3.Lerpは移動する命令」ではない(Vector3.Lerpは移動先の座標を生んでいるだけで、実際に移動しているのはtransform.positionにそれを代入しているから)』という、認識の齟齬を正す為の補足でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問