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

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

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

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

Unity

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

Q&A

解決済

2回答

1897閲覧

[Unity] プレイヤーの座標をカメラに代入するとカメラがガタガタしてしまう原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/09 01:32

提示コードのですがControlがカメラ、playerがプレイヤーにアタッチしています。見下ろし型のストラテジーゲームのカメラなのですが
コメント部の/////の内部のコードですがカメラがガタガタしてしまいます。座標を確認したところカメラの座標が動いているためなのですが
なぜカメラがガタガタするのでしょうか?

試したこと
playerのRigidbodyを外した。
誤差を疑い直接値を代入する形に変更して引き算による誤差をなくしてみました。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 //方向 8 public Vector3 vec; 9 private Rigidbody rb; 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 rb = GetComponent<Rigidbody>(); 15 vec = new Vector3(0, 0, 0); 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 //Debug.Log(transform.position); 22 23 24 25 if(vec != new Vector3(0,0,0)) 26 { 27 Vector3 v = vec - transform.position; 28 vec.y = 0; 29 Quaternion look = Quaternion.LookRotation(vec,Vector3.up); 30 transform.localRotation = look; 31 rb.AddForce(vec.normalized * 1); 32 33 } 34 35 36 //Debug.Log(vec); 37 } 38 39} 40

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Control : MonoBehaviour 6{ 7 //public GameObject obj; 8 private RaycastHit hit; 9 10 11 private GameObject player; //ゲームオブジェクト 12 private Player code; //ソースファイル名 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 player = GameObject.Find("Ethan"); 18 code = player.GetComponent<Player>(); 19 } 20 21 22 23 24 // Update is called once per frame 25 void Update() 26 { 27////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 28 transform.position = new Vector3(player.transform.position.x - transform.position.x, transform.position.y, player.transform.position.z - transform.position.z); 29 30///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 32 33 34 35 //Debug.Log(transform.position); 36 37 38 RaycastHit hit; 39 int distance = 1000; 40 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 41 Debug.DrawLine(ray.origin, ray.direction * 1000, Color.red); 42 43 44 if (Input.GetMouseButtonDown(0)) 45 { 46 if (Physics.Raycast(ray, out hit, distance)) 47 { 48 code.vec = hit.point; 49 } 50 } 51 52 } 53 54 //オブジェクトを配置する 55 void PutObject() 56 { 57 RaycastHit hit; 58 int distance = 1000; 59 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 60 Debug.DrawLine(ray.origin, ray.direction * 1000, Color.red); 61 62 63 if (Input.GetMouseButtonDown(0)) 64 { 65 if (Physics.Raycast(ray, out hit, distance)) 66 { 67 Debug.Log(hit.point); 68 69 //Instantiate(obj, hit.point + new Vector3(0, obj.transform.localScale.y / 2, 0), obj.transform.rotation); 70 } 71 } 72 73 } 74 75 76} 77

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

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

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

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

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

ku__ra__ge

2021/07/09 02:01

/////の内部のコードによって実現したい動作は、どのようなものなのでしょうか?
guest

回答2

0

ベストアンサー

Unityは全く知らないんだけど,問題の行

transform.position = new Vector3(player.transform.position.x - transform.position.x, transform.position.y, player.transform.position.z - transform.position.z);

が,以下のような話なのだとすれば,ガタガタするのは当然かな,と思いますが.

  • transform.position というのがカメラの位置である
  • player.transform.position というのがプレイヤーの位置である.
  • で,この行では,{現在のカメラの位置,現在のプレイヤーの位置}に基づいてカメラの位置を更新している

x座標が引き算になっているので,x座標だけを例にとって考えてみる.

最初,カメラのx座標が100,プレイヤーのx座標が50 だとする.
するとこの行の処理で,カメラのx座標が 50-100 = -50 に更新される.

プレイヤーが特に動かなったとする(すなわち座標は50のまま)
するとこの行の処理で,カメラのx座標が 50-(-50)= 100 に更新される

ということになるので,-50と100を行ったり来たりしますよね.

投稿2021/07/09 02:33

fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2021/07/09 06:11

質問ですがその場合どうすればいいのでしょうか?どういった判定をすればいいのでしょうか? if(prevPosition != player.transform.position) { transform.position = new Vector3(player.transform.position.x - transform.position.x, transform.position.y, player.transform.position.z - transform.position.z); prevPosition = player.transform.position; } としましたがカメラがガタついてしまいます。
fana

2021/07/09 06:52

なんだろう, そもそも引き算が入ってくる理由(意図,意味)がわからないのですが. 例えば, int A = 50; int B = 100; があって,「Aの値をBと同じにしたい」ならば,現在のAの値なんか無視して A=B; 的な話で良いですよね. 現在の値を更新処理にどのような目的で用いているのか? という処理アルゴリズムというか, 「やろうとしていること」の説明をしっかりと質問に書いた方が良いでしょう.
guest

0

引用テキストplayerがプレイヤーにアタッチしています。見下ろし型のストラテジーゲームのカメラなのですが

あまり解決方法としては相応しくないとは思いますが、見下ろし方のゲームなら無理にアタッチに拘らず、Y軸を固定にするかY軸が動いた時のみゆっくりと近づいていくようなカメラを作ればいいと思います。

投稿2021/07/09 02:05

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問