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

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

詳細はこちら
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

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

Unity

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

Q&A

解決済

4回答

2238閲覧

【Unity】スクリプトの記述順番で処理が変わってしまう

Ren_1019

総合スコア10

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/10/24 13:51

前提・実現したいこと

矢印キーを押すとボールが浮き上がり、それにカメラが追従するというスクリプトを書きたい。

発生している問題・エラーメッセージ

ボールが浮き上がり高さが安定していても、カメラがブレる。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Angular : MonoBehaviour 6{ 7 public float KAITEN;//回転する速さ 8 public float UKI;//ボールを浮かせる高さ 9 public GameObject cam;//メインカメラを代入 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 15 } 16 17 // Update is called once per frame 18 void Update() 19 { 20 //カメラをボールの後ろに配置 21 if (cam.transform.position.x < 0) 22 { 23 Vector3 t = transform.position; 24 t.y += 4; 25 t.z -= 5; 26 cam.transform.position = t; 27 28 } 29 30 //ボールを浮かせて、さらに回転をかける 31 if (Input.GetKey(KeyCode.UpArrow)) 32 { 33 Vector3 p = transform.position; 34 p.y = UKI + 0.5f; 35 transform.position = p; 36 GetComponent<Rigidbody>().angularVelocity = new Vector3(KAITEN, 0, 0); 37 } 38 if (Input.GetKey(KeyCode.DownArrow)) 39 { 40 Vector3 p = transform.position; 41 p.y = UKI + 0.5f; 42 transform.position = p; 43 GetComponent<Rigidbody>().angularVelocity = new Vector3(-KAITEN, 0, 0); 44 } 45 if (Input.GetKey(KeyCode.RightArrow)) 46 { 47 Vector3 p = transform.position; 48 p.y = UKI + 0.5f; 49 transform.position = p; 50 GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, -KAITEN); 51 } 52 if (Input.GetKey(KeyCode.LeftArrow)) 53 { 54 Vector3 p = transform.position; 55 p.y = UKI + 0.5f; 56 transform.position = p; 57 GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, KAITEN); 58 } 59 60 61 62 } 63}

試したこと

「//カメラをボールの後ろに配置」のところをまるまる「//ボールを浮かせて、さらに回転をかける」の後にもっていくと、カメラがブレなくなりました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Angular : MonoBehaviour
{
public float KAITEN;//回転する速さ
public float UKI;//ボールを浮かせる高さ
public GameObject cam;//メインカメラを代入

// Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { //ボールを浮かせて、さらに回転をかける if (Input.GetKey(KeyCode.UpArrow)) { Vector3 p = transform.position; p.y = UKI + 0.5f; transform.position = p; GetComponent<Rigidbody>().angularVelocity = new Vector3(KAITEN, 0, 0); } if (Input.GetKey(KeyCode.DownArrow)) { Vector3 p = transform.position; p.y = UKI + 0.5f; transform.position = p; GetComponent<Rigidbody>().angularVelocity = new Vector3(-KAITEN, 0, 0); } if (Input.GetKey(KeyCode.RightArrow)) { Vector3 p = transform.position; p.y = UKI + 0.5f; transform.position = p; GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, -KAITEN); } if (Input.GetKey(KeyCode.LeftArrow)) { Vector3 p = transform.position; p.y = UKI + 0.5f; transform.position = p; GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, KAITEN); } //カメラをボールの後ろに配置 if (cam.transform.position.x < 0) { Vector3 t = transform.position; t.y += 4; t.z -= 5; cam.transform.position = t; } }

}

補足情報(FW/ツールのバージョンなど)

UnityのバージョンはUnity2019.2.6f1Personalです。
なぜ順番で処理が変わってしまうのか教えてほしいですお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

原因:ブレが発生するのは球とカメラの移動処理を行うUpdateが1フレーム異なっているからです。

この為フレームの描画結果に差が生まれ二つのコードでブレて見えるかどうかの違いが出てきます。
それだけでは理解出来ないと思うので下記が解説です。

・最初のコードの場合

1.最初のカメラ移動で球の後ろに移動
2.KeyCode.UpArrowなどを押して球が移動し画面の上方に映る
3.そのUpdateが終わる
4.フレーム描画が終わり「問題のブレて見える様なカメラと球配置になる」←ここが原因
5.次のUpdateでカメラが球の後ろに移動して正常な位置関係になる
6.Updateが終わってフレーム描画がされれば球の後ろから映した状態で見える←この時点でブレて見える

結果:4と6で位置関係が違う為、1フレームだけブレて見える。

・次のコードの場合

1.KeyCode.UpArrowなどを押して球が移動し画面の上方に映る
2.カメラも球の後ろに移動して正常な位置関係になる
3.そのUpdateが終わる
4.フレーム描画が終わり「正常な位置関係なのでブレて見えない」

結果:常にカメラは球の後ろなのでブレて見えない。

※後になって気付きましたが、他の方の回答コメントにあるUltraSuperMikanさんとほぼ同じ解説内容です。

投稿2019/10/25 04:06

編集2019/10/25 10:16
Hawn

総合スコア1222

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

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

0

キャラに追従したいならオフセットを取って位置を同期させるのが割とよくあるやり方なのでそちらも調べてみると良いです。

エディタ上でキャラとカメラの位置を決めてベストなポジションを作っておきます。
ゲーム開始時に、カメラとキャラの距離の差を記憶しておきます。
そしてゲーム開始後は、カメラはキャラと同じ位置に同期させて、そこから最初に記憶した距離の差だけズラします。これで基本的な追従が出来上がります。

Playerに追従するカメラ
https://qiita.com/kajitack/items/bab5cb649fe0cf6756d4

投稿2019/10/25 00:34

hogefugapiyo

総合スコア3302

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

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

0

…ゲーム業界の常識ですが、「●●に追従してカメラを動かす」と言う処理をするなら
「追従対象」を動かしてから、最終的に「カメラを動かす」のは、正しい処理順序だと思う次第です…。

順番が違えば、処理がずれるのは至極当然だと思う次第です…。
なぜ「カメラを動かして」から「被写体を動かす」のか、そこに執着する理由があれば、それを明記したほうがいいです…。

…動いてるのであればその順序に記述すれば解決します…。が、
「なぜズレるのか」に関しては
カメラを先に動かした後に、被写体が動くせいで、「ブレて表示される」ような処理がなされるのかと思います…。
このへんは、もっと詳しい方の知見を聞いた方がよろしいと思いますが…。

投稿2019/10/24 14:06

hermit19901127

総合スコア368

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

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

Ren_1019

2019/10/24 14:23

執着があるわけではありません。 ただ、順番で処理が変わる理由を知りたいです。 至極当然のことでも、初心者の僕には理解ができません。 もう少しだけ詳しく解説していただけるとすごくありがたいです。 どうかお願いします。
UltraSuperMikan

2019/10/24 17:30

回答者様の内容を反復するようですが、以下のように考えます。 プログラムが1行目から最終行まで、順に実行されるイメージが重要です。 (被写体xとカメラcの位置関係のイメージ) [--------x] [--------c] >case 1 ・被写体の座標を更新[-----x---] ・カメラの座標をx追従[-----c---] ・画面更新 >case2 ・カメラの座標をx追従[--------c](現時点で被写体xは初期座標のまま) ・被写体の座標を更新[-----x---] ・画面更新(case1とズレがある)
guest

0

皆さん回答ありがとうございました。
どれも素晴らしい回答でしたが、僕の意図した答えではありませんでした。
僕が言っているカメラのブレは1フレームだけではありません。ボタンを押している間ずっとです。

原因がわからないので、Unity内のパラメーターを適当にいじっていたら、どうやら重力が問題らしいと気づきました。
ボールについているRigidbodyから重力を外すと、ブレはなくなりました。

投稿2019/10/25 11:54

Ren_1019

総合スコア10

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

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

mimi_no_naka

2019/10/25 18:46 編集

そりゃあ重力有りでボタン押し続ければ説明されてる現象が毎フレーム起きるんだから、1フレームだけではありませんってそりゃそうでしょ(笑 説明されてる現象が連続して起きてると気付く必要最低限度の理解力は持ちましょう。 重力無しならボタン押しての球の移動は一回なので押し続けても最初の一回だけズレが発生。 UKIの数値が小さければ気付かない。 高ければチラつき位は確認出来るんじゃないでしょうか。 重力無しで解決するというのは思い違いです。
Tto777

2019/10/25 19:29 編集

そもそもの質問が「なぜ順番で処理が変わってしまうのか」の説明を求めるものであり「ブレをなくす方法」では無いので、意図した答えがないにしてもこれで解決というのはおかしいのでは? まあ、質問者がそれで良いというならそれで良いのでしょうが...
Ren_1019

2019/10/26 05:09

mimi57585さん。 確かにそうですね!理解力が無いなりに頑張るので、これからもよろしくお願いします! Tto777さんもコメントありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問