// 視線(2点を結ぶ直線)上に、視線を遮る地形が存在するか高度をチェックする // true:見える(地形が視線を遮らない) // false:見えない(地形が視線を遮る) public bool VisuallyCheckByHeight(Vector3 vecA, Vector3 vecB) { // 2点を結ぶ直線上に存在するセルの座標リストを取得する Vector2 vec2A = GetLeftTop(vecA); Vector2 vec2B = GetLeftTop(vecB); List cellPos = GetCellPos(vec2A, vec2B); // セル平面における2点間の距離 float lenAB = (vec2B - vec2A).Length(); foreach (Vector2 vec in cellPos) { // セル平面におけるvecとvecA間の距離 float lenAvec = (vec - vec2A).Length(); // 2つの距離から線形補間用の重みを算出 float amount = lenAvec / lenAB; // 線形補間により視線高度を算出 float height = MathHelper.Lerp(vecA.Y, vecB.Y, amount); // 高度チェック if (cells[(int)vec.X, (int)vec.Y].Height > height) // false:見えない(地形が視線を遮る) return false; } // true:見える(地形が視線を遮らない) return true; }