実現したいこと
上の画像の右に発射されている16本の赤いRayが、壁に衝突すると青いRayになるようにしたいと考えています。
※足元の黄色いRayは、現時点ではオブジェクトへの接近をチェックするものです。
発生している問題
このRayを発射する為にキャラクターの当たり判定を外側のコライダー(Is triggerにチェック、レイヤー”Char”)で囲んでいますが、
それがRayと重なっている為、以下のソースでは常に青いRayが表示される様です。
int layerMask = LayerMask.GetMask(new string[] { "Object" });
でマスクに成功していると思うのですが、改善しません。
該当のソースコード
C#
1 // === レイキャスト用) ===================== 2 private Ray flont; 3 private Ray foot; 4 private Ray check; 5 const float skinWidth = .015f; 6 [HorizontalGroup("ray")] public int horizontalRayCount = 16; 7 [HorizontalGroup("ray")] public int verticalRayCount = 8; 8 float horizontalRaySpacing; 9 float verticalRaySpacing; 10 new BoxCollider2D collider; 11 RaycastOrigins raycastOrigins; 12 13protected virtual void Update() 14{ 15UpdateRaycastOrigins(); 16CalculateRaySpacing(); 17int layerMask = LayerMask.GetMask(new string[] { "Object" }); 18 19 for (int i = 0; i < horizontalRayCount; i++)//前面に出るレイ 20{ 21if (facing == true) {//右を向いたとき 22//右上からVector2(1,0)*iの間隔でRayを描画。Vector2(0,1)の長さのRAYでカラーは赤を指定 23RaycastHit2D flont; 24flont = Physics2D.Raycast(raycastOrigins.topRight - Vector2.up * horizontalRaySpacing * i, Vector2.right* 1, layerMask); 25if (flont.collider)//レイが物体に衝突時 26{ 27Debug.DrawRay(raycastOrigins.topRight - Vector2.up * horizontalRaySpacing * i, Vector2.right * 1, Color.blue);} 28else 29{Debug.DrawRay(raycastOrigins.topRight - Vector2.up * horizontalRaySpacing * i, Vector2.right * 1, Color.red);} 30 31//足元チェック用----------------------------------------------------------------------------+ 32RaycastHit2D check; 33check = Physics2D.Raycast(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2, layerMask); 34Debug.DrawRay(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2, Color.yellow);//右下に一本だけレイを描画 35 36if (check.collider) { Debug.Log(check.collider.gameObject.name); } 37} 38 39//以下はRay発射元コライダー角座標の設定を行うもの 40void UpdateRaycastOrigins()//Drawrayで直接角座標(vector2)を定義する事ができない為、ここに定義 41 { 42 Bounds bounds = collider.bounds;//ワールド座標でのコライダーのbounds範囲情報取得 43 bounds.Expand/*設定した amount によって sizeを変更*/(skinWidth/*コライダーの幅*/ * -2); 44 raycastOrigins.bottomLeft = new Vector2(bounds.min.x, bounds.min.y); //左下座標 45 raycastOrigins.bottomRight = new Vector2(bounds.max.x, bounds.min.y); //右下座標 46 raycastOrigins.topLeft = new Vector2(bounds.min.x, bounds.max.y); //左上座標 47 raycastOrigins.topRight = new Vector2(bounds.max.x, bounds.max.y); //左上座標 48 } 49 struct RaycastOrigins 50 { 51 public Vector2 topLeft, topRight, bottomLeft, bottomRight; 52 } 53 void CalculateRaySpacing()//数値に従い幅内のレイ数を振り分ける計算 54 { 55 Bounds bounds = collider.bounds; 56 bounds.Expand(skinWidth * -2); 57 58 horizontalRayCount = Mathf.Clamp(horizontalRayCount, 2, int.MaxValue); 59 verticalRayCount = Mathf.Clamp(verticalRayCount, 2, int.MaxValue); 60 61 horizontalRaySpacing = bounds.size.y / (horizontalRayCount - 1) ; 62 verticalRaySpacing = bounds.size.x / (verticalRayCount - 1); 63 }
試したこと
↓字が小さいですが、左下端に取得されたオブジェクト名が表示されています。
//足元チェック用----------------------------------------------------------------------------+
より下のソースにより、オブジェクト名の取得に成功している為、おそらくlayerMaskは機能しています。
※layerMaskが失敗しているときはPlayer( "char" レイヤー)のGameobjectしか取得しませんでした。
ただし、オブジェクトに接触していないときは常にPlayer( "char" レイヤー)のGameobjectが取得されてしまいます。
また、動画の様にオブジェクト名情報は坂道と、壁に埋まった時しか取得できません。
このことからRayの衝突にも問題があるように見受けられます。
何か解決策があればご教示お願いします。
06/12:
次の様にソースを書き換え、マスクを無効にしても、Objectを認識する場合があることが分かりました。
おそらくObjectの配置を調整したものが偶然認識できるようになっっていたものと思われます。
//足元チェック用----------------------------------------------------------------------------+ RaycastHit2D check; check = Physics2D.Raycast(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2, layerMask); //↓ check = Physics2D.Raycast(raycastOrigins.bottomRight - Vector2.down * horizontalRaySpacing, Vector2.right * -1 / 2);
このことから、レイヤーマスクが機能していないものと思われます。
補足情報(FW/ツールのバージョンなど)
Unity 2018.1.1f1
回答1件
あなたの回答
tips
プレビュー