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# スクリプトからラインを描画するためには、以下の設定をする必要があります。
次項では、この手順の詳細を解説します。
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すると、黒い線の引かれたキューブが表示されます。