コンテンツにスキップ

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

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

概要

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

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

情報

Pencil+ Line ノードは、NodeBase クラスを継承したコンポーネントが1つだけアタッチされた GameObject です。本チュートリアルでは、単に「ノード」と表記します。

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

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

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

Pencil+ Line の設定手順

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

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

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

ノードを C# スクリプトから生成します。ノードを生成するには、空のゲームオブジェクトを生成し、各ノードに対応するコンポーネントをAddComponent()メソッドでアタッチしてください。 また、利便性のため、ノード コンポーネントの型からノードを直接生成する NodeBase.CreateNodeObject()メソッドを用意しています。

// 空のGameObjectにLineListノード コンポーネントをアタッチする
var obj = new GameObject();
obj.AddComponent<LineList>();
obj.name = "Pencil+ Line List 0"

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

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

  • LineList ノード
  • Line ノード
  • LineSet ノード
  • BrushSettings ノード
  • BrushDetail ノード

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

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

1.LineEffect コンポーネントの LineListObject フィールドに LineList ノードを設定します。
2.LineList コンポーネントの LineList フィールドに Line ノードを追加します。
3.Line コンポーネントの LineSets フィールドに LineSet ノードを追加します。
4.LineSet コンポーネントの VBrushSettings フィールドに BrushSettings ノードを設定します。
5.BrushSettings コンポーネントの BrushDetail フィールドに BrushDetail ノードを設定します。

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

ラインを描画したいオブジェクトを LineSet コンポーネントの Objects フィールドに追加します。

サンプルコード

using UnityEngine;
using Pencil_4;

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

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


        //  -------------------------------- 
        //  シーン上にノードを生成する 
        //  -------------------------------- 
        var lineListNode =  NodeBase.CreateNodeObject<LineListNode>();
        var lineNode =  NodeBase.CreateNodeObject<LineNode>();
        var lineSetNode =  NodeBase.CreateNodeObject<LineSetNode>();
        var  brushSettingsNode = NodeBase.CreateNodeObject<BrushSettingsNode>();
        var brushDetailNode = NodeBase.CreateNodeObject<BrushDetailNode>();

        //  -------------------------------- 
        //  PencilLineEffectとノードを接続する 
        //  -------------------------------- 
        //  LineEffectの"LineListObject"フィールドにLineListノードを設定する 
        lineEffect.LineListObject = lineListNode;

        //  LineListの"LineList"フィールドにLineノードを追加する 
        lineListNode.GetComponent<LineListNode>().LineList.Add(lineNode);

        //  Lineの"LineSets"フィールドにLineSetノードを追加する 
        lineNode.GetComponent<LineNode>().LineSets.Add(lineSetNode);

        //  LineSetの"VBrushSettings"フィールドにBrushSettingsノードを設定する 
        lineSetNode.GetComponent<LineSetNode>().VBrushSettings = brushSettingsNode;

        //  BrushSettingsの"BrushDetail"にBrushDetailノードを設定する 
        brushSettingsNode.GetComponent<BrushSettingsNode>().BrushDetail = brushDetailNode;


        //  -------------------------------- 
        //  描画対象のオブジェクトを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);

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

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