/// <summary>引数のbehaviourが衝突する属性を持つか調べる</summary> private static MapPhysicsAttribute getCollidedAttribute(GameObject aBehaviour, out MapPhysics.CollisionType oCollisionType) { if (aBehaviour == mCollider.gameObject) //自分の属性とは衝突しない { oCollisionType = MapPhysics.CollisionType.pass; return(null); } MapPhysicsAttribute tCollidedAttribute = null; oCollisionType = MapPhysics.CollisionType.pass; foreach (MapPhysicsAttribute tAttribute in aBehaviour.GetComponents <MapPhysicsAttribute>()) { MapPhysics.CollisionType tCollisionType = MapPhysics.canCollide(mAttribute, tAttribute); string t = aBehaviour.transform.parent.name; if (tCollisionType == MapPhysics.CollisionType.collide) { tCollidedAttribute = tAttribute; oCollisionType = MapPhysics.CollisionType.collide; break; } if (tCollisionType == MapPhysics.CollisionType.stop) { tCollidedAttribute = tAttribute; oCollisionType = MapPhysics.CollisionType.stop; } } return(tCollidedAttribute); }
public MoveResult(MapPhysics.CollisionType aCollisionType, float aDistance) { mCollisionType = aCollisionType; mDistance = aDistance; }
/// <summary> /// 指定方向,距離で最初に衝突する属性を探索 /// </summary> /// <returns>衝突した属性を持つcolliderへのHit2D(同じ距離で複数と衝突する場合は複数返す)</returns> /// <param name="aVector">探索方向</param> /// <param name="aDistance">探索距離</param> /// <param name="oCollisionType">衝突した属性とのcollisionType(同じ距離で複数と衝突する場合はcollideの物のみをListに入れて返す)</param> private static RaycastHit[] castAttribute(Vector3 aVector, float aDistance, out MapPhysics.CollisionType oCollisionType) { //衝突するcolliderを取得 RaycastHit[] tHitList = cast(aVector, aDistance); //衝突する属性を取得 int tHitLength = tHitList.Length; RaycastHit[] tNears = new RaycastHit[tHitLength]; RaycastHit tHit; MapPhysicsAttribute tAttribute; MapPhysics.CollisionType tCollisionType = MapPhysics.CollisionType.pass; int tHitIndex; int tNearsNum = 0;//同じ距離で衝突する属性の数 for (tHitIndex = 0; tHitIndex < tHitLength; ++tHitIndex) { tHit = tHitList[tHitIndex]; tAttribute = getCollidedAttribute(tHit.collider.gameObject, out tCollisionType); if (tCollisionType == MapPhysics.CollisionType.pass) { continue; } tNears[0] = tHit; tNearsNum = 1; break; } //衝突する属性がなかった if (tNearsNum == 0) { oCollisionType = MapPhysics.CollisionType.pass; return(new RaycastHit[0]); } //同じ距離で衝突する属性を取得 //stopよりcollideを優先するためのフラグ bool tCollided = (tCollisionType == MapPhysics.CollisionType.collide); for (int i = tHitIndex + 1; i < tHitLength; ++i) { tHit = tHitList[i]; //同じ距離で衝突する属性なし if (tNears[0].distance < tHit.distance) { break; } tAttribute = getCollidedAttribute(tHit.collider.gameObject, out tCollisionType); switch (tCollisionType) { case MapPhysics.CollisionType.pass: continue; case MapPhysics.CollisionType.collide: if (tCollided) { tNears[tNearsNum] = tHit; tNearsNum++; } else { tNears[0] = tHit; tNearsNum = 1; tCollided = true; } continue; case MapPhysics.CollisionType.stop: if (!tCollided) { tNears[tNearsNum] = tHit; tNearsNum++; } continue; } } Array.Resize <RaycastHit>(ref tNears, tNearsNum); oCollisionType = (tCollided) ? MapPhysics.CollisionType.collide : MapPhysics.CollisionType.stop; return(tNears); }