コンテンツにスキップ

C# スクリプトからラインを描画する

C# スクリプトから Pencil+ Line の設定を行い、ラインを描画するための、最も基本的な方法を解説します。 ※このページの内容は PSOFT Pencil+ 4 Line for Unity 4.0.2 以降と 4.0.1 以前で異なります。4.0.1 以前のパッケージをご利用の場合は、4.0.1 に付属のマニュアルを参照してください。

概要

Pencil+ Line はカメラのイメージエフェクト コンポーネント PencilLineEffect として実装されています。PencilLineEffect 自体にはラインの描画設定は存在せず、 Pencil+ Line ノード という別のコンポーネントに設定が存在します。

このため、ラインを描画するには PencilLineEffect とノードを正しく設定・接続する必要があります。また、複数の PencilLineEffect に単一のノードを接続することによって、例えばメインカメラとサブカメラで同一のライン描画設定を簡単に適用できます。

情報

Pencil+ Line ノード は、 NodeBase クラスを継承したコンポーネントです。Pencil+ Line の機能単位ごとに数種類の NodeBase クラスを継承したコンポーネントがあり、本チュートリアルではそれらのコンポーネントを「ノード」と表記します。

C# スクリプトからラインを描画するためには、以下の設定をする必要があります。

  1. イメージエフェクト コンポーネントをカメラにアタッチする
  2. シーン上にノードを生成する
  3. PencilLineEffect とノードを接続する
  4. 描画対象のオブジェクトをPencil+に登録する

次項では、この手順の詳細を解説します。

Pencil+ Line の設定手順

1. イメージエフェクト コンポーネントをカメラにアタッチする

PencilLineEffect を、Camera と同じ GameObject にアタッチします。これにより、Pencil+ Line を Camera のイメージエフェクトとして動作させる準備をします。

2. シーン上にノードを生成する

ノードがアタッチされた GameObject をスクリプトから生成します。空の GameObject を生成し、AddComponent()メソッドでノードをアタッチしてください。 また、利便性のため、ノードの型から GameObject を直接生成する NodeBase.CreateNodeObject()メソッドも用意しています。

// 空のGameObjectにLineListNodeをアタッチする
var obj = new GameObject();
obj.AddComponent<LineListNode>();
obj.name = "Pencil+ Line List 0"

// ↑と同じ
var obj = NodeBase.CreateNodeObject<LineListNode>();

ラインを描画するために必要な最小限のノードは、以下の 5 種類です。

  • LineListNode
  • LineNode
  • LineSetNode
  • BrushSettingsNode
  • BrushDetailNode

3. PencilLineEffect とノードを接続する

PencilLineEffect をルートとし、ノードを木構造に接続します。実装の詳細はサンプルコードを参照してください。

1.PencilLineEffectLineListObject フィールドに LineListNode がアタッチされた GameObject を設定します。
2.LineListNodeLineList フィールドに LineNode がアタッチされた GameObject を追加します。
3.LineNodeLineSets フィールドに LineSetNode がアタッチされた GameObject を追加します。
4.LineSetNodeVBrushSettings フィールドに BrushSettingsNode がアタッチされた GameObject を設定します。
5.BrushSettingsNodeBrushDetail フィールドに BrushDetailNode がアタッチされた GameObject を設定します。

4. 描画対象のオブジェクトを Pencil+ に登録する

ラインを描画するオブジェクトを LineSetNodeObjects フィールドに追加します。

サンプルコード

using UnityEngine;
using Pencil_4;

public class TutorialScript : MonoBehaviour
{
    private void Start()
    {
        //  --------------------------------
        //  イメージエフェクト コンポーネントをカメラにアタッチする
        //  --------------------------------

        //  簡単のため、このサンプルではメインカメラを使います
        var lineEffect =  Camera.main.gameObject.AddComponent<PencilLineEffect>();


        //  --------------------------------
        //  シーン上にノードを生成する
        //  --------------------------------
        var lineListNodeGameObject =  NodeBase.CreateNodeObject<LineListNode>();
        var lineNodeGameObject =  NodeBase.CreateNodeObject<LineNode>();
        var lineSetNodeGameObject =  NodeBase.CreateNodeObject<LineSetNode>();
        var brushSettingsNodeGameObject = NodeBase.CreateNodeObject<BrushSettingsNode>();
        var brushDetailNodeGameObject = NodeBase.CreateNodeObject<BrushDetailNode>();

        //  --------------------------------
        //  PencilLineEffectとノードを接続する
        //  --------------------------------
        //  PencilLineEffectの"LineListObject"フィールドにLineListNodeがアタッチされたGameObjectを設定する
        lineEffect.LineListObject = lineListNodeGameObject;

        //  LineListNodeの"LineList"フィールドにLineNodeがアタッチされたGameObjectを追加する
        lineListNodeGameObject.GetComponent<LineListNode>().LineList.Add(lineNodeGameObject);

        //  LineNodeの"LineSets"フィールドにLineSetNodeがアタッチされたGameObjectを追加する
        lineNodeGameObject.GetComponent<LineNode>().LineSets.Add(lineSetNodeGameObject);

        //  LineSetNodeの"VBrushSettings"フィールドにBrushSettingsNodeがアタッチされたGameObjectを設定する
        lineSetNodeGameObject.GetComponent<LineSetNode>().VBrushSettings = brushSettingsNodeGameObject;

        //  BrushSettingsNodeの"BrushDetail"フィールドにBrushDetailNodeがアタッチされたGameObjectを設定する
        brushSettingsNodeGameObject.GetComponent<BrushSettingsNode>().BrushDetail = brushDetailNodeGameObject;


        //  --------------------------------
        //  描画対象のオブジェクトをPencil+に登録する
        //  --------------------------------

        //  Cubeをシーン上に生成する
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(0.0f, 0.0f, 0.0f);
        cube.transform.rotation = Quaternion.Euler(0.0f, 45.0f, 0.0f);

        //  カメラの設定を調整する
        Camera.main.gameObject.transform.position = new Vector3(0.0f, 0.8f, -3.0f);
        Camera.main.gameObject.transform.rotation = Quaternion.Euler(16.0f, 0.0f, 0.0f);

        //  LineSetNodeの"Objects"フィールドにCubeを追加する
        lineSetNodeGameObject.GetComponent<LineSetNode>().Objects.Add(cube);
    }
}

このコードを空のGameObjectにアタッチして Run すると、黒い線の引かれたキューブが表示されます。