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

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

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

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

Unity

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

Q&A

解決済

1回答

12465閲覧

unityにてカメラ端の座標を取得し、移動制限させる

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

1クリップ

投稿2019/03/30 01:27

unityにて、Playerをキー入力で動かし画面端(カメラビューポート内)の範囲で移動制限させるものを下記のように書いてみたのですが、いまいち思い通りのものにならず悩んでます。
画面端まで行かずはじかれるような動きにもなり、下記をどう修正すればよいかアドバイスを頂ければ助かります。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float speed; 8 void Update() 9 { 10 Vector3 min = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0)); 11 Vector3 max = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, 0)); 12 Vector3 pos = transform.position; 13 14 float xx = Input.GetAxisRaw("Horizontal"); 15 float yy = Input.GetAxisRaw("Vertical"); 16 GetComponent<Rigidbody>().velocity = new Vector3(xx, yy, 0.0f) * speed; 17 18 GetComponent<Rigidbody>().position = new Vector3( 19 Mathf.Clamp(GetComponent<Rigidbody>().position.x, min.x, max.x), 20 Mathf.Clamp(GetComponent<Rigidbody>().position.y, min.y, max.y), 21 0.0f 22 ); 23 } 24} 25 26

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

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

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

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

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

fiveHundred

2019/03/30 02:03

透明な壁を配置する、とかでは駄目ですか?
退会済みユーザー

退会済みユーザー

2019/03/30 02:07

早速、ありがとうございます! 覚えたい事としまして、どんなスマホ機種や環境にも自動で対応する書き方を覚えたくて自動で取得する書き方を学んでました。ですが中々苦戦してましてこちらで伺わせて頂いた次第でした。
guest

回答1

0

ベストアンサー

(1). 画面端まで行かない

Camera.ViewportToWorldPoint()はz座標も正しく指定しないとうまくいかないようです。
3DのデフォルトのPerspectiveの場合、台形に映し出されるので、カメラとオブジェクト間の距離によって、カメラの端となる座標もそれに応じて異なるためです。
今回の場合、「プレイヤーのz座標 - カメラのz座標」で求められます。

(2). はじかれるような動き

まず、オブジェクトの位置など、物理関連の処理はFixedUpdate()を使ってください。
Update()とFixedUpdate()は実行されるタイミングが違うため、Update()だと挙動が異なってしまうことがあります。
FixedUpdate()の場合、物理計算が行われる一定間隔のタイミングで実行されるため、こちらの方が適任でしょう。

ただその場合でも、FixedUpdate()をしてから物理演算(=Rigidbody.velocityによって進む処理)が行われるため、位置が少しずれてしまいます。
それがはじかれるような動きの原因です。
そのため、対症療法的ですが、どれだけ進むのかをあらかじめ計算し、その分は引いてしまうという処理が考えられます。
あるいは、「環境に合わせた位置に透明な壁を用意する」でも可能だと思いますが、その「環境」が指す意味がよく分からなかったので、とりあえず先述のほうを採用します。

以上に考慮して、修正したのが以下になります。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float speed; 8 9 private Rigidbody rigidbodyComponent; 10 11 void Start() 12 { 13 // 同じComponentを複数回使う場合、毎回GetComponent()を呼ぶよりも、最初に取得して使いまわした方がよい 14 rigidbodyComponent = GetComponent<Rigidbody>(); 15 } 16 17 void Update() 18 { 19 float xx = Input.GetAxisRaw("Horizontal"); 20 float yy = Input.GetAxisRaw("Vertical"); 21 rigidbodyComponent.velocity = new Vector3(xx, yy, 0.0f) * speed; 22 } 23 24 // 物理関連の処理は基本的にUpdate()ではなく、FixedUpdate()を使う 25 void FixedUpdate() 26 { 27 Vector3 pos = transform.position; 28 29 // (1) 30 float distance = pos.z - Camera.main.transform.position.z; 31 Vector3 min = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, distance)); 32 Vector3 max = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, distance)); 33 34 // (2) 35 Vector3 rigidbodySpeed = Time.fixedDeltaTime * rigidbodyComponent.velocity; 36 rigidbodyComponent.position = new Vector3( 37 Mathf.Clamp(rigidbodyComponent.position.x, min.x - rigidbodySpeed.x, max.x - rigidbodySpeed.x), 38 Mathf.Clamp(rigidbodyComponent.position.y, min.y - rigidbodySpeed.y, max.y - rigidbodySpeed.y), 39 0.0f 40 ); 41 } 42}

投稿2019/03/30 03:21

fiveHundred

総合スコア10152

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

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

退会済みユーザー

退会済みユーザー

2019/03/30 03:46

色々とわかりやすく解説頂き誠にありがとうございます! お返事の全てを今日は深堀しながら学んで行こうと思います。 また、「透明な壁」での方法もその中で探りながら比較し試してみようと思います。 早々に、丁寧にお返事いただけてただただ感謝しかありません、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問