ろますた38の覚書

Unityの覚書です。もともとはただのツイートでしたが、ブログにまとめることにしました。

Line Rendererについて

Line Rendererコンポーネントのプロパティの項目が何を意味しているのかをさらっと調べてみました。
線を引く必要最低限の設定(あくまでも個人的な判断)で線を引いてくれるスクリプトを作成しました。
カメラデフォルト位置の状態絵でPos(0,0,0)の空のゲームオブジェクトにアタッチすれば、線が引かれます。

f:id:s06tho12001:20180318001217p:plain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
23:34 2018/03/17
Line Rendererコンポーネントの全てのプロパティの項目を調べた。
2017.3のマニュアルは英訳が分かりにくい。
https://docs.unity3d.com/ja/2017.3/Manual/class-LineRenderer.html
似た名前であれば、5.4のメッシュレンダラのマニュアルの方が参考になる。
https://docs.unity3d.com/ja/540/Manual/class-MeshRenderer.html

Cast Shadows : 
影を生成するかどうか。

Receive Shadows : 
自分自身に影が当たるかどうか。

Dynamic Occluded : 
オブジェクトの後ろにある時、レンダリングしない。
と思ったけど、cubeを前に持ってきても普通に描画されてる。
よく分からん。何か事前に他の設定が必要なのかもしれない。参考になりそうなURLを見つけたけど、中はまだ読んでない。
http://tsubakit1.hateblo.jp/entry/2018/01/07/021622

Motion Vectors : 
シェーダでかっこいいエフェクトを出したいときに使うらしい。よく分からない。

Materials
線は配列の各マテリアルごとに 1度描画されます。
ということは、複数マテリアルの場合、何度も重ねて描画されるということか。
透過処理の場合に意味がありそう。

Light Parameters : 
グローバルイルミネーションを使うとき必要になる。
グローバルイルミネーションを使うと、物体に当たった光が相互作用するようになる。

Positions : 
線を構成する頂点の座標値を入力する。

Use World Space
チェックを外すとTransformに連動して動く。

Loop : 
線の始点と終点がつながる。頂点が3つ以上ある時に使おう。

Color : 
パーティクルシェーダーを使うと効果が表れる。

Alignment : 
Viewにすると線の面がカメラに対して垂直になる。(多分ビルボード処理)

Texture Mode : 
マテリアルにテクスチャが付いている場合、テクスチャをどうやって線に合わせるか。

Generate Lighting Date : 
法線を生成して線を面として扱えるようになる。つまり正しくシェーディング可能になる。デフォルトではオフ。

Sorting layer と Order in layer : 
たくさん線を重ねて描画させたとき、どれを一番手前にもってくるかを設定できる。

Light Probes
ライトプローブ(Light Probe)とは空間内にあるライトの情報を保存(ベイク)しておくテクニック。
http://unitygeek.hatenablog.com/entry/2012/09/09/155137

Reflection Probes
ライトプローブと同じく、反射(リフレクション)をベイクしておく設定のことだろう。

結局、線の色をどうやって設定するかの問題。
1. Unlit/Colorシェーダにしてマテリアルで色を付ける方法
2. Particles/Standard UnlitシェーダにしてLineRendererで色を付ける方法

2のほうが直観的だが、位置によって色を変えられる設定のせいで色を設定しにくい。
だから1のやり方でやる。

なお、ビルドインシェーダの中身は
【Unity】uGUIのシェーダーを改造してシェーダーを練習…のススメ - テラシュールブログ
http://tsubakit1.hateblo.jp/entry/2015/10/29/214107
の方法で中身を見ることができる。
 */

public class GenLine : MonoBehaviour {
    void Start () {
        LineRenderer line = gameObject.AddComponent<LineRenderer>();

        // 線は影を生成しない。
        line.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

        // 線自体に他の物体から生じた影がうつらない。
        line.receiveShadows = false;

        // オクルージョンカリングは無効。cubeを置いてテストしたけど、カリングされなかった。多分事前に他の設定が必要。
        line.allowOcclusionWhenDynamic = false;

        // motionVectorを使うとかっこいいエフェクトが作れるらしい。シェーダと連携が必要らしい。
        // 今は使わないから無理やり無効にする。
        line.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;

        line.material = new Material(Shader.Find("Particles/Standard Unlit"))
        {
            color = Color.cyan
        };

        //  ライトマップパラメータの設定を行うと、グローバルイルミネーションが使える。今は使わない。デフォルトでOFF(None)になっているのでそのままにしておく。
        // line.realtimeLightmapIndex...

        // 頂点数と頂点を設定。
        line.positionCount = 3;
        line.SetPosition(0, Vector3.zero);
        line.SetPosition(1, Vector3.right * 5);
        line.SetPosition(2, new Vector3(5, 3, 0));

        // falseにすると、Transformに連動して動く。
        line.useWorldSpace = false;

        // 支点と終点をつなげるか。
        line.loop = true;

        // 色の設定はマテリアルで行う。
        // line.colorGradient...

        // Viewにすると線の面がカメラに対して垂直になる。(多分ビルボード処理)。Localにすると何もしない。
        line.alignment = LineAlignment.Local;

        // 線にテクスチャを張る時、どうやって張るか。今はテクスチャを使わないので、触らない。
        // line.textureMode...

        // 法線を生成して線を面として扱えるようになる。つまり正しくシェーディング可能になる。デフォルトではオフ。
        // line.generateLightingData = false;

        // 以下はSorting layerとProbes設定。どちらも普通に線を引くなら触らない。
    }
}