Unity 接地判定の線とか、見えない境界とか、見たくなったときは LineRendererで画面に線を引く

見えないものを見たいときとか、
画面上に　線　を引きたいときがある。

![20170607o1.png](https://qiita-image-store.s3.amazonaws.com/0/159417/8fb9763a-9a65-8672-cf3f-1d5c2388afe1.png)

# 接地判定の線を可視化
記事を移動した。
http://makegame.warabenture.com/?p=397


# 古今の線の引き方の考え方の　移り変わり

古いプログラミングなら drawLine( x, y ) とかで線が引けたもんだ。命令を羅列するというコンセプトで **関数に引数を渡して呼び出す** というサイクルに　なんでんかんでん　組み込まれていた。

Unityだと 物理演算エンジンにお供えするものかどうかというコンセプトで あらゆるものがお供えもので、
**ゲームオブジェクトを追加して　コンポーネントをアタッチ**
というサイクルに　なんでんかんでん　組み込まれている。

# やってみる

![20170526d2b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ac1458be-1bdd-b193-623a-0c85a63ecd96.png)

ゲームオブジェクトを追加して、LineRenderer を持たせるとできる。

「[Unity] - LineRenderer -」note
https://note.mu/mtimsno/n/n9ea6526736ac

線が表示されてなかったら、背景の後ろに表示されているだろう。
ソーティング・レイヤーなどを確認。


[Use World Space] のチェックは外してカメラのレンズに描画している感じにする。そうすると　カメラのスクロールについてきてくれる。

![20170526gif11.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/9da80f9a-46a1-bf37-d299-335ce6e7809e.gif)

C#スクリプトで　位置を設定するなら　こんな感じ。

```C#
    /// <summary>
    /// 表示区画の枠
    /// </summary>
    [MenuItem("Tool/RefreshLineFrame")]
    static void RefreshLineFrame()
    {
        // 枠
        lineFrame = GameObject.Find("LineFrame");
        transform_lineFrame = lineFrame.GetComponent<Transform>();
        LineRenderer lineRenderer = lineFrame.GetComponent<LineRenderer>();
        float lineWidth = lineRenderer.widthMultiplier;
        float viewWidthHalf = config.pixelOfViewWidth / 2;
        lineRenderer.SetPositions(new Vector3[] {
            new Vector3(-0.8f-lineWidth-viewWidthHalf,0.8f+lineWidth,-9f),
            new Vector3(0.8f+lineWidth+viewWidthHalf,0.8f+lineWidth,-9f),
            new Vector3(0.8f+lineWidth+viewWidthHalf,-0.8f-lineWidth,-9f),
            new Vector3(-0.8f-lineWidth-viewWidthHalf,-0.8f-lineWidth,-9f),
        });
    }
```

枠を広げるコードとか　こんなんになる。

![20170526gif12.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/4422ec64-9e42-d273-d37a-b4bf00d83864.gif)

## Z軸を 0 にすると隠れてしまったりするので

```C#
        GameObject groundedLine_go = GameObject.Find("GroundedLine");
        LineRenderer line = groundedLine_go.GetComponent<LineRenderer>();
        line.SetPositions(new Vector3[] {
            new Vector3(begin.x, begin.y, line.transform.position.z),
            new Vector3(end.x, end.y, line.transform.position.z)
            });
```

z軸は別のところからもってきてもいい。


# 調整

もっと　枠を　ぴったりさせよう。

```C#
    /// <summary>
    /// 表示区画の枠
    /// </summary>
    [MenuItem("Tool/RefreshLineFrame")]
    static void RefreshLineFrame()
    {
        Config config = (Config)GameObject.Find("Config").GetComponent<MonoBehaviour>();

        GameObject lineFrame = GameObject.Find("LineFrame");
        Transform transform = lineFrame.GetComponent<Transform>();
        LineRenderer lineRenderer = lineFrame.GetComponent<LineRenderer>();
        float lineWidthHalf = lineRenderer.widthMultiplier / 2;
        float viewWidthHalf = config.pixelOfViewWidth / 2;
        float viewHeightHalf = config.GetPixelOfSectionHeight() / 2;
        lineRenderer.SetPositions(new Vector3[] {
            new Vector3(-lineWidthHalf-viewWidthHalf,lineWidthHalf+viewHeightHalf,-9f),
            new Vector3(lineWidthHalf+viewWidthHalf,lineWidthHalf+viewHeightHalf,-9f),
            new Vector3(lineWidthHalf+viewWidthHalf,-lineWidthHalf-viewHeightHalf,-9f),
            new Vector3(-lineWidthHalf-viewWidthHalf,-lineWidthHalf-viewHeightHalf,-9f),
        });
    }
```

![20170526f1.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ba9d32da-3002-303d-1825-ebfd573a12c7.png)

自分で書いていて　単位が分からなくなった。
ここらへんは工夫しよう。