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# スクリプトからラインを描画するためには、以下の設定をする必要があります。
次項では、この手順の詳細を解説します。
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.PencilLineEffect
の LineListObject
フィールドに LineListNode
がアタッチされた GameObject
を設定します。
2.LineListNode
の LineList
フィールドに LineNode
がアタッチされた GameObject
を追加します。
3.LineNode
の LineSets
フィールドに LineSetNode
がアタッチされた GameObject
を追加します。
4.LineSetNode
の VBrushSettings
フィールドに BrushSettingsNode
がアタッチされた GameObject
を設定します。
5.BrushSettingsNode
の BrushDetail
フィールドに BrushDetailNode
がアタッチされた GameObject
を設定します。
4. 描画対象のオブジェクトを Pencil+ に登録する¶
ラインを描画するオブジェクトを LineSetNode
の Objects
フィールドに追加します。
サンプルコード¶
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すると、黒い線の引かれたキューブが表示されます。