/// <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);
    }