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

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

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

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

Unity

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

Q&A

解決済

2回答

3051閲覧

unity2dで自機が画面外に出ないようにしたい。

ropro2

総合スコア13

C#

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

Unity

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

0グッド

1クリップ

投稿2018/12/23 19:08

前提・実現したいこと

unity,2Dでプレイヤーが操作する自機が
画面外に出ないようにしたいのですが、自機が動くだけで
画面外に出てしまいます。お知恵をお借りしたいです……。

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

UnityEngine.Vector2からfloatへ変換することができません。 などがでたり、あと、画面サイズを取得した方がいいとは思うんですが 取得する方法が分かりません…。 上記に描いた自機を画面外に出さない方法を知りたいです。。。

該当のソースコード

unity,2D,C#を使用

1 2using System.Collections; 3 4using System.Collections.Generic; 5 6using UnityEngine; 7 8public class player : MonoBehaviour 9 10{ 11 12 //移動スピード 13 14 public float speed = 5; 15 16 // Use this for initialization 17 18 void Start() 19 20 { 21 22 } 23 24 // Update is called once per frame 25 26 void Update() 27 28 { 29 30 var w = Screen.width; 31 32 var h = Screen.height; 33 34 // 右・左 35 36 float x = Input.GetAxisRaw("Horizontal"); 37 38 // 上・下 39 40 float y = Input.GetAxisRaw("Vertical"); 41 42 //移動する向き 43 44 Vector2 dir = new Vector2( x, y); 45 46 47 //移動する向きとスピード代入 48 49 GetComponent<Rigidbody2D>().velocity = Mathf.Clamp(dir, x, y) * speed; 50 51 52 } 53 54}``` 55 56### 試したこと 57 58Screen.widthを入れる箱をfloatにしたりしました。 59dirにxとyを入れるときに、x,yのところをMathf.Clampを使ったりしました。 60 61### 補足情報(FW/ツールのバージョンなど) 62ツールはマイクロソフトヴィジュアルスタジオです。 63一応、画面のサイズは2.4です。よろしくお願いいたします…。

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

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

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

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

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

guest

回答2

0

ベストアンサー

移動先座標を直接指定するタイプの移動方法ならMathf.Clampによる範囲制限をやりやすいのですが、Rigidbody2D.velocityを操作するタイプの移動方法だと、ちょっと工夫を加える必要があるかと思います。

一案として、下記のような感じではいかがでしょうか?
説明もかねて冗長になっていますが、ご質問者さんのコードに合わせてご自由に改造してしまってください。

C#

1using UnityEngine; 2 3public class player : MonoBehaviour 4{ 5 // 移動スピード 6 public float speed = 5; 7 8 // 移動する向き 9 private Vector2 dir; 10 11 // 画面の左・右・上・下の境界の位置 12 private float boundL; 13 private float boundR; 14 private float boundT; 15 private float boundB; 16 17 private new Rigidbody2D rigidbody2D; 18 19 private void Start() 20 { 21 this.rigidbody2D = this.GetComponent<Rigidbody2D>(); 22 23 // あらかじめ、画面上下左右の縁がワールド空間上でどこに位置するか調べておく 24 var mainCamera = Camera.main; 25 var positionZ = this.transform.position.z; 26 var topRight = mainCamera.ViewportToWorldPoint(new Vector3(1.0f, 1.0f, positionZ)); 27 var bottomLeft = mainCamera.ViewportToWorldPoint(new Vector3(0.0f, 0.0f, positionZ)); 28 this.boundL = bottomLeft.x; 29 this.boundR = topRight.x; 30 this.boundT = topRight.y; 31 this.boundB = bottomLeft.y; 32 } 33 34 private void Update() 35 { 36 // 右・左 37 var x = Input.GetAxisRaw("Horizontal"); 38 39 // 上・下 40 var y = Input.GetAxisRaw("Vertical"); 41 42 this.dir = new Vector2(x, y); 43 } 44 45 private void FixedUpdate() 46 { 47 // 現在の位置 48 var position = this.rigidbody2D.position; 49 50 // 範囲制限を加える前の速度 51 var velocity = this.dir * this.speed; 52 53 // 今回の物理状態更新での移動量 54 var deltaPosition = velocity * Time.deltaTime; 55 56 // 範囲制限を加えなかった場合の、予想される移動先 57 var nextPosition = position + deltaPosition; 58 59 // 予想移動先の座標をクランプする 60 var clampedNextPosition = new Vector2( 61 Mathf.Clamp(nextPosition.x, this.boundL, this.boundR), 62 Mathf.Clamp(nextPosition.y, this.boundB, this.boundT)); 63 64 // クランプ後の移動先座標から移動量を求める 65 var clampedDeltaPosition = clampedNextPosition - position; 66 67 // クランプ後の移動量から速度を求める 68 var clampedVelocity = clampedDeltaPosition / Time.deltaTime; 69 70 // クランプ後の速度を代入 71 this.rigidbody2D.velocity = clampedVelocity; 72 } 73}

投稿2018/12/23 22:30

Bongo

総合スコア10807

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

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

ropro2

2018/12/25 13:56

ありがとうございます!考えながらコードを打ち込んだところ、ちゃんと範囲制限されていました…! 最近、unityはじめたばかりで長いコードを見ても理解できないのですが、 さすが先人様たちのコードは違うなあと実感しました! ありがとうございます!
guest

0

Unity公式のSpace Shooter tutorialでも、対応例が説明されています。(3Dですが)
考え方はBongoさんの回答とほぼ同様かと思いますが、ご参考まで。

Moving the player - Unity
https://unity3d.com/jp/learn/tutorials/projects/space-shooter-tutorial/moving-player?playlist=17147

投稿2018/12/24 01:05

negitama

総合スコア943

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

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

ropro2

2018/12/25 13:54

ありがとうございます!見てみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問