teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

画像の削除

2019/02/23 11:49

投稿

ITATI
ITATI

スコア14

title CHANGED
File without changes
body CHANGED
@@ -77,7 +77,6 @@
77
77
  ```
78
78
  ### 試したこと
79
79
  ↓字が小さいですが、左下端に取得されたオブジェクト名が表示されています。
80
- ![イメージ説明](6466e560623c134138e9b943f6ddfcdf.gif)
81
80
 
82
81
  //足元チェック用----------------------------------------------------------------------------+
83
82
  より下のソースにより、オブジェクト名の取得に成功している為、おそらくlayerMaskは機能しています。

3

画像の削除

2019/02/23 11:49

投稿

ITATI
ITATI

スコア14

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  実現したいこと
2
- ![イメージ説明](322d072cab151b5ed9fbe6df7ae3d940.png)
2
+
3
3
  上の画像の右に発射されている16本の赤いRayが、壁に衝突すると青いRayになるようにしたいと考えています。
4
4
  ※足元の黄色いRayは、現時点ではオブジェクトへの接近をチェックするものです。
5
5
 

2

新しく把握できた情報の追加

2019/02/23 11:48

投稿

ITATI
ITATI

スコア14

title CHANGED
File without changes
body CHANGED
@@ -4,9 +4,9 @@
4
4
  ※足元の黄色いRayは、現時点ではオブジェクトへの接近をチェックするものです。
5
5
 
6
6
  ### 発生している問題
7
- このRayを発射する為にキャラクターの当たり判定を外側のコライダー(Is triggerにチェック)で囲んでいますが、
7
+ このRayを発射する為にキャラクターの当たり判定を外側のコライダー(Is triggerにチェック、レイヤー”Char”)で囲んでいますが、
8
8
  それがRayと重なっている為、以下のソースでは常に青いRayが表示される様です。
9
- int layerMask = LayerMask.GetMask(new string[] { "char" });
9
+ int layerMask = LayerMask.GetMask(new string[] { "Object" });
10
10
  でマスクに成功していると思うのですが、改善しません。
11
11
 
12
12
  ### 該当のソースコード
@@ -27,7 +27,7 @@
27
27
  {
28
28
  UpdateRaycastOrigins();
29
29
  CalculateRaySpacing();
30
- int layerMask = LayerMask.GetMask(new string[] { "char" });
30
+ int layerMask = LayerMask.GetMask(new string[] { "Object" });
31
31
 
32
32
  for (int i = 0; i < horizontalRayCount; i++)//前面に出るレイ
33
33
  {
@@ -88,5 +88,17 @@
88
88
 
89
89
  何か解決策があればご教示お願いします。
90
90
 
91
+ 06/12:
92
+ 次の様にソースを書き換え、マスクを無効にしても、Objectを認識する場合があることが分かりました。
93
+ おそらくObjectの配置を調整したものが偶然認識できるようになっっていたものと思われます。
94
+ ```
95
+ //足元チェック用----------------------------------------------------------------------------+
96
+ RaycastHit2D check;
97
+ check = Physics2D.Raycast(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2, layerMask);
98
+ //↓
99
+ check = Physics2D.Raycast(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2);
100
+ ```
101
+ このことから、レイヤーマスクが機能していないものと思われます。
102
+
91
103
  ### 補足情報(FW/ツールのバージョンなど)
92
104
  Unity 2018.1.1f1

1

06/09 11: 00 ソースにRay発射元コライダー角座標の設定を行う部分を追加、”試したこと”に補足しました。

2018/06/11 15:48

投稿

ITATI
ITATI

スコア14

title CHANGED
File without changes
body CHANGED
@@ -48,12 +48,40 @@
48
48
 
49
49
  if (check.collider) { Debug.Log(check.collider.gameObject.name); }
50
50
  }
51
+
52
+ //以下はRay発射元コライダー角座標の設定を行うもの
53
+ void UpdateRaycastOrigins()//Drawrayで直接角座標(vector2)を定義する事ができない為、ここに定義
54
+ {
55
+ Bounds bounds = collider.bounds;//ワールド座標でのコライダーのbounds範囲情報取得
56
+ bounds.Expand/*設定した amount によって sizeを変更*/(skinWidth/*コライダーの幅*/ * -2);
57
+ raycastOrigins.bottomLeft = new Vector2(bounds.min.x, bounds.min.y); //左下座標
58
+ raycastOrigins.bottomRight = new Vector2(bounds.max.x, bounds.min.y); //右下座標
59
+ raycastOrigins.topLeft = new Vector2(bounds.min.x, bounds.max.y); //左上座標
60
+ raycastOrigins.topRight = new Vector2(bounds.max.x, bounds.max.y); //左上座標
61
+ }
62
+ struct RaycastOrigins
63
+ {
64
+ public Vector2 topLeft, topRight, bottomLeft, bottomRight;
65
+ }
66
+ void CalculateRaySpacing()//数値に従い幅内のレイ数を振り分ける計算
67
+ {
68
+ Bounds bounds = collider.bounds;
69
+ bounds.Expand(skinWidth * -2);
70
+
71
+ horizontalRayCount = Mathf.Clamp(horizontalRayCount, 2, int.MaxValue);
72
+ verticalRayCount = Mathf.Clamp(verticalRayCount, 2, int.MaxValue);
73
+
74
+ horizontalRaySpacing = bounds.size.y / (horizontalRayCount - 1) ;
75
+ verticalRaySpacing = bounds.size.x / (verticalRayCount - 1);
76
+ }
51
77
  ```
78
+ ### 試したこと
79
+ ↓字が小さいですが、左下端に取得されたオブジェクト名が表示されています。
80
+ ![イメージ説明](6466e560623c134138e9b943f6ddfcdf.gif)
52
81
 
53
- ### 試したこと
54
82
  //足元チェック用----------------------------------------------------------------------------+
55
83
  より下のソースにより、オブジェクト名の取得に成功している為、おそらくlayerMaskは機能しています。
56
- ![ジ説明](6466e560623c134138e9b943f6ddfcdf.gif)
84
+ ※layerMaskが失敗しているときはPlayer( "char" レー)のGameobjectしか取得しませんでした。
57
85
  ただし、オブジェクトに接触していないときは常にPlayer( "char" レイヤー)のGameobjectが取得されてしまいます。
58
86
  また、動画の様にオブジェクト名情報は坂道と、壁に埋まった時しか取得できません。
59
87
  このことからRayの衝突にも問題があるように見受けられます。