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

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

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

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

Unity

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

Q&A

1回答

1521閲覧

Rayを壁に当たるごとに向きを変えたい

Unre

総合スコア9

C#

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

Unity

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

0グッド

0クリップ

投稿2018/06/08 07:36

編集2018/06/08 07:49

前提・実現したいこと

4方向にしか動かない敵を作っているのですが、
Rayを使って壁に当たって一定の距離以下になったらY→X、X→Yに遷移するようにしたい。

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

今のやり方だとどちらか片方の向きにしかRayが出ません。

該当のソースコード

C#

1[SerializeField] 2 private float Speed; 3 4 float x; 5 float y; 6 int i; 7 8 float X() 9 { 10 return Speed * Time.deltaTime; 11 } 12 float Y() 13 { 14 return Speed * Time.deltaTime; 15 } 16 17 // Use this for initialization 18 void Start () { 19 i = Random.Range(0, 4); 20 } 21void Update () { 22 x = TargetPos[i].x - transform.position.x; 23 y = TargetPos[i].y - transform.position.y; 24 //Ray 25 Vector2 MyPos = transform.position; 26 Vector3 LivPos = new Vector3(0,Y(), 0); 27 28 int LayerMask=~(1 << 10); 29 int chk = 0;//Y移動してるとき 0 X移動してるとき 1 30 31 Ray2D Ray = new Ray2D(MyPos, LivPos); 32 RaycastHit2D Hit = Physics2D.Raycast(Ray.origin, Ray.direction, 5.0f,LayerMask); 33 34 gameObject.transform.Translate(LivPos); 35 36 //Move 37 //壁回避 38 if (Hit.collider) 39 { 40 if (Hit.distance < 0.6f) 41 { 42 if (chk == 0) 43 { 44 if (x > 0) 45 { 46 LivPos = new Vector3(X(), 0, 0); 47 gameObject.transform.Translate(LivPos); 48 chk = 1; 49 } 50 else if (x < 0) 51 { 52 LivPos = new Vector3(-X(), 0, 0); 53 gameObject.transform.Translate(LivPos); 54 chk = 1; 55 } 56 } 57 else if (chk == 1) 58 { 59 if (y > 0) 60 { 61 LivPos = new Vector3(0, Y(), 0); 62 gameObject.transform.Translate(LivPos); 63 chk = 0; 64 } 65 else if(y<0) 66 { 67 LivPos = new Vector3(0,-Y(), 0); 68 gameObject.transform.Translate(LivPos); 69 chk = 0; 70 } 71 } 72 } 73 }

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

Unity 2018.1.1f1
Visual Studio Community 2017 15.7.1
すいません書き忘れていました。追記させていただきました
どちらか片方にしか出ないというのはRayが上か右にしか出ないということです。また壁に当たっても最初に出ている方向にしか出ません。

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

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

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

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

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

giit

2018/06/08 07:43

検討違いだったらすみませんがx,y,X(),Y()はどんな変数、関数なのでしょうか?
sakura_hana

2018/06/08 07:43

変数x、変数y、メソッドX()、メソッドY()がコード上に無いのですがそれぞれどんな値を取りどんな挙動をしていますか? また、「どちらか片方の向きにしかRayが出ません」とは具体的にどういうことですか?
guest

回答1

0

Vector2 MyPos = transform.position;
Vector3 LivPos = new Vector3(0,Y(), 0);
Ray2D Ray = new Ray2D(MyPos, LivPos);
ということは、常にRayは「現在地から(0, Speed*Time.deltaTime, 0)方向」に出ます。

なので出るとしたら(ワールド座標において)上か下で、何故右に出る場合があるのかよく分からないのですが、「最初に出た方向のまま」なのはこの為です。

投稿2018/06/11 04:08

sakura_hana

総合スコア11427

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

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

Unre

2018/06/11 06:29

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問