🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

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

Q&A

1回答

1905閲覧

カメラ追尾スクリプトで追尾しない原因とは?

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2019/10/03 06:51

プレイヤーの後をカメラが追尾するスクリプトで誤差を出したく小数点以下を消そうと思うのですがカメラが追尾していきませんこれはなにをしたのでしょうか?transform.position +=のコメントにしたるところをコメント戻すと動くのですがなぜでしょうか?
むろん GameObjectにはプレイヤーは入っています。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Camera_con : MonoBehaviour { public GameObject player; private Vector3 play_pos; private Vector3 off; // Use this for initialization void Start () { play_pos = player.transform.position; off = Vector3.zero; } class t { public int x; public int y; public int z; } // Update is called once per frame void Update () { t e = new t(); e.x = (int)(player.transform.position.x - play_pos.x); e.y = (int)(player.transform.position.y - play_pos.y); e.z = (int)(player.transform.position.z - play_pos.z); Vector3 v = new Vector3(); v.x = e.x; v.y = e.y; v.z = e.z; //transform.position += (player.transform.position - play_pos); transform.position += v; play_pos = player.transform.position; off = transform.position; if(Input.GetMouseButton(1)) { float input_h = Input.GetAxis("Mouse X"); float input_v = Input.GetAxis("Mouse Y"); transform.RotateAround(play_pos,Vector3.up,input_h * Time.deltaTime * 200.0f); transform.RotateAround(play_pos,transform.right,-input_v * Time.deltaTime * 200.0f); } } }

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

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

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

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

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

guest

回答1

0

Playerが移動する前と移動した後の距離が1.0f以上でなければ、切り捨てられ0とみなされるので追従はしないのですが、Playerのフレーム事の移動距離は条件を満たしていますでしょうか。
Debug.Log等で確認してみてください。

transform.position += (player.transform.position - play_pos)についてですが、これは前フレームのPlayerの位置と現フレームのPlayerの位置の差を計算して、その差分カメラを移動させています。
やっている事は小数点以下を切り捨てているかどうかで、transform.position += v;と大差ないかと思います。

投稿2019/10/03 07:59

simapiko

総合スコア332

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

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

退会済みユーザー

退会済みユーザー

2019/10/03 10:26

Vector3 tv = play_pos - off; if(tv.magnitude > 1.0f) { transform.position += (player.transform.position - play_pos); off = play_pos; } //transform.position += v; Debug.Log("v: "+tv.magnitude); //Debug.Log("transform: " + transform.position); play_pos = player.transform.position; うまく実装できないのですが何かヒントをくれますでしょうか?
simapiko

2019/10/04 00:53

うまくと、言われてもどこでつまずいているのか、どんな挙動がしたいのか分からないので具体的にお願いできますでしょうか…。
sakura_hana

2019/10/04 01:35

横から失礼します。 このコメントのコードだと多分「カメラとプレイヤーが少し(正確には1m)離れるまでカメラは止まっていて、離れたらカメラが動く」を繰り返しますよね。 「ブレではなく、移動したと見なせる閾値」は1よりも小さいと思うので if(tv.magnitude > 0.1f) のようにif文の条件を直せばいいんじゃないかと思います。 (「Playerが移動する前と移動した後の距離が1.0f以上ではないのでは?」というsimapikoさんの指摘の通りです。それに加えて現コードはoffの更新位置が変なので「止まる→動くの繰り返し」となります)
simapiko

2019/10/04 02:21

sakura_hanaさんのコメントを見て過去質問を覗いたのですが、なんとなくやりたい事を把握しました。フレーム事のブレの距離が分かれば、仰る通りに直せば行けそうですね。 後は雑な方法ですが、待機モーションで動かしたくないのであれば、適当にフラグを立てて、今待機モーションであるかどうかで追尾処理をはじく方法でも行けそうな気がします。(待機モーション中にブレによって一定方向に移動し続けるというので無いのが前提ですが…)
退会済みユーザー

退会済みユーザー

2019/10/04 14:13

質問です自分がやりたいことは待機モーションの1以下の値の動きをカメラのスクリプトが感知してしまってどんなに小さい値でもカメラが少し動いてしまい気持ちよくないのでその細かいところを修正したいのですが
sakura_hana

2019/10/05 07:54

「これ以上動いたらカメラが移動する」という閾値を決める必要があります。そしてそれは1よりかなり小さいはずです。 だって「Unityで作れるCubeの一辺の長さ」が1ですよ? プレイヤーがこの距離を1フレーム中に移動しないとカメラが移動しないというのはおかしな話だと思いませんか?
simapiko

2019/10/07 01:09

待機モーション以外で動く条件ifは「待機モーションのブレ(定数)<Playerが動いた位置(変数)」です。 また、当然条件で指定したブレ以上で動かなくては待機モーションであろうがなかろうが条件に満たないのでカメラは追尾しません。 現状の例で例えますが、待機モーションのブレが1.0fとして仮定、Playerの1フレームの動いた距離が1.0f以下なので追尾していないと考えています。 なので、解決策としては、 1.Playerの1フレームの移動距離を1.0f以上になるように加える力を増やす。 2.待機モーションのブレの値を見直す。 1.につきましては、sakura_hanaさんが仰るようにゲームが破綻する可能性があります。Unity世界の1は現実世界の1mにあたるそうですので。 2.につきましてはブレとする値が大きすぎるためです。待機モーションのブレが本当に1.0f以上なのか確かめてください。インスペクターの目視でも構いませんが、スクリプトで値を取った方が確実かと思います。求め方が分からなければまたコメントしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問