UDN
Search public documentation:

ScriptedTexturesJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > レンダリング > スクリプト化されたテクスチャ
UE3 ホーム > UnrealScript > スクリプト化されたテクスチャ


スクリプト化されたテクスチャ


概要


スクリプト化されたテクスチャを使用することによって、ランタイム時に UnrealScript から任意にテクスチャを描画することが可能になります。この描画は、Canvas クラスとそれに含まれている機能を使用することによって行われます。つまり、テクストをはじめとしてマテリアルやその他のテクスチャなどをすべて、スクリプト化されたテクスチャに描画できるようになるということです。

この機能は、考えられうるあらゆるものに使用することができます。使用例としては、スポーツゲームでユニフォームの上にプレイヤーの名前を描画したり、ワールド内のサーフェス上でリーダーボード (順位表) を表示したり、TCPLink あるいは DLLBind ソースを通じて得られる外部ソースからのライブ フィードを表示したりする場合や、さらには、プレイヤーがゲーム内のサーフェスに直接描画するといった複雑なことまで考えられます。

ScriptedTexture クラス


ScriptedTexture クラスは、TextureRenderTarget2D クラスを拡張したものです。このクラスには次のような重要なメンバーが含まれています。

プロパティ

  • Size[X/Y] - それぞれ、水平方向と垂直方向のテクスチャの大きさです。 TextureRenderTarget2D を継承しています。
  • Format - テクスチャ データの EPixelFormat フォーマットです。 TextureRenderTarget2D を継承しています。
  • ClearColor - テクスチャをクリアするために使用される LinearColor (線形カラー) です。 TextureRenderTarget2D を継承しています。
  • bNeedsUpdate - TRUE の場合は、ティックの最後に他のすべてのレンダリングに先立って、 Render() デリゲートが呼び出されます。
  • bSkipNextClear - TRUE の場合は、次回 Render() デリゲートが呼び出されるまでテクスチャがクリアされません。テクスチャを複数のフレームに渡って描画しなければならない場合に便利です。

関数

  • Create [InSizeX] [InSizeY] [InFormat] [InClearColor] [bOnlyRenderOnce] - 静的関数です。指定されたパラメータを使用して、新たな TextureRenderTarget2D を作成します。 TextureRenderTarget2D を継承しています。
    • InSizeX - 新たなテクスチャの水平方向のサイズを設定します。
    • InSizeY - 新たなテクスチャの垂直方向のサイズを設定します。
    • InFormat - オプション引数です。テクスチャによって使用される EPixelFormat を設定します。
    • InClearColor - オプション引数です。テクスチャをクリアするために使用する LinearColor を設定します。
    • bOnlyRenderOnce - オプション引数です。TRUE の場合は、テクスチャが、それが作成された最初のフレームにおいて一度だけ更新されます。
  • Render [C] - テクスチャを描画するために呼び出されるデリゲートです。
    • C - 現在のフレームのためにテクスチャを描画する際に使用される Canvas オブジェクトです。

ScriptedTexture のセットアップ


ScriptedTexture を作成、使用するためには、いくつかのステップを実行しなければなりませんが、これらは直ぐにはわかりにくいかもしれません。ここでは、主なポイントについて詳説することによって、ScriptedTexture をゲームに使用できるようにします。

ScriptedTexture の作成

最初に、新たな ScriptedTexture を自分のクラスに作成する必要があります。これには Create() 関数を使います。ただし、この関数は TextureRenderTarget2D を返すため、使用法がそれほど分かりやすくはないかもしれません。

var ScriptedTexture CanvasTexture;

...

CanvasTexture = ScriptedTexture(class'ScriptedTexture'.static.Create(1024, 1024,, ClearColor));

静的関数 Create() が ScriptedTexture から呼び出され、ScriptedTexture にキャストされています。更に ScriptedTexture の変数に代入されて、この新たな ScriptedTexture を参照できるようになります。

ScriptedTexture をアサインする

ScriptedTexture は、作成後にマテリアルにアサインして使用できるようにします。このためには、ScriptedTexture をアサインできる TextureSampleParameter2D 式をともなったマテリアルが必要となるため、少しばかり準備が必要です。

ex_material_param.jpg

var StaticMeshCompeonent Mesh; //Mesh used to display the material in-game
var MaterialInstanceConstant CanvasMaterial; //new material instance to assign ScriptedTexture to
var MaterialInterface CanvasMaterialTemplate; //Material created in UnrealEd with TextureSampleParameter2D
var Int CanvasMaterialIndex; //Index of material on mesh to assign new Material to
var Name CanvasMaterialParameterName; //Name of TextureSampleParameter2D in CanvasMaterialTemplate

...

CanvasMaterial = Mesh.CreateAndSetMaterialInstanceConstant(CanvasMaterialIndex);
if(CanvasMaterial != none)
{
   CanvasMaterial.SetParent(CanvasMaterialTemplate);

   if(CanvasMaterialParameterName != '')
   {
      CanvasMaterial.SetTextureParameterValue(CanvasMaterialParameterName, CanvasTexture);
   }
}

新たな MaterialInsatnceConstant が作成され、静的メッシュにアサインされます。次に、このマテリアル インスタンスの親が CanvasMaterialTemplate にセットされます。この CanvasMaterialTemplate は、テクスチャ パラメータが ScriptedTexture を受け取るように設定されたテンプレート マテリアルを参照する必要があります。最後に、ScriptedTexture がテクスチャ パラメータにアサインされています。

レンダラ デリゲート

ScriptedTexture のセットアップがすべて完了して表示されるようになると、残るステップはテクスチャへの描画です。そのためには、関数を ScriptedTexture のレンダラ デリゲートにアサインする必要があります。そうすることによって、描画関数の内部で標準的な描画コマンドを使用して ScriptedTexture を描画することができるようになります。

CanvasTexture.Render = OnRender;

...

function OnRender(Canvas C)
{
   ...Drawing Commands...
}

ScriptedTexture の例


次の例は ScriptedTexture を正式に実装したものです。インゲームのメッシュ上でテキストを水平にスクロールさせています。この例では、1 つの文字列が繰り返し表示されているにすぎませんが、新しい文字列を取り込むこともできます。このクラスを拡張して、新たなテキストの文字列を取り込むとともにバッファ配列に追加することによって、IRC チャットルームのような同時進行のテクスト ストリームを表示します。

特に重要なのは、 PostBeginPlay()ConsoleRender() です。これらは、それぞれ ScriptedTexture のセットアップとレンダリングを扱います。

scriptedtexture_preview.gif

TextConsole.uc

class TextConsole extends Actor placeable;

var() int ConsoleMaterialIndex;
var() MaterialInterface ConsoleMaterialTemplate;
var() name CanvasTextureParamName;

var MaterialInstanceConstant ConsoleMaterial;
var ScriptedTexture CanvasTexture;
var() float ScrollAmount;
var() float TextScale;
var() LinearColor ClearColor;
var() Color TextColor;

var string ConsoleText;
var Vector2D Pos;

var() editinline const StaticMeshComponent Mesh;

function PostBeginPlay()
{
   super.PostBeginPlay();

   CanvasTexture = ScriptedTexture(class'ScriptedTexture'.static.Create(1024, 1024,, ClearColor));
   CanvasTexture.Render = OnRender;

   if(ConsoleMaterialTemplate != none)
   {
      ConsoleMaterial = Mesh.CreateAndSetMaterialInstanceConstant(ConsoleMaterialIndex);
      if(ConsoleMaterial != none)
      {
         ConsoleMaterial.SetParent(ConsoleMaterialTemplate);

         if(CanvasTextureParamName != '')
         {
            ConsoleMaterial.SetTextureParameterValue(CanvasTextureParamName, CanvasTexture);
         }
      }
   }

   SetConsoleText("Console Display Text");
   Pos.X = CanvasTexture.SizeX;
}

function SetConsoleText(string text)
{
   ConsoleText = text;
}

function OnRender(Canvas C)
{
   local Vector2D TextSize;

   C.TextSize(ConsoleText, TextSize.X, TextSize.Y);
   TextSize *= TextScale;
   Pos.Y = (CanvasTexture.SizeY / 2) - (TextSize.Y / 2);
   Pos.X -= WorldInfo.DeltaSeconds * ScrollAmount;
   if(Pos.X < -TextSize.X)
   {
      Pos.X = CanvasTexture.SizeX;
   }

   C.SetOrigin(0,0);
   C.SetClip(CanvasTexture.SizeX + TextSize.X, CanvasTexture.SizeY + TextSize.Y);
   C.SetPos(Pos.X, Pos.Y);

   C.SetDrawColorStruct(TextColor);

   C.DrawText(ConsoleText,, TextScale, TextScale);

   CanvasTexture.bNeedsUpdate = true;
}

defaultproperties
{
   ClearColor=(R=0.0,G=0.0,B=0.0,A=0.0)
   TextColor=(R=255,G=255,B=255,A=255)
   ScrollAmount=150.0
   TextScale=1.0

   Begin Object class=StaticMeshComponent Name=StaticMeshComp1
      StaticMesh=StaticMesh'dwStaticMeshes.Plane'
   End Object

   Mesh = StaticMeshComp1
   Components.Add(StaticMeshComp1)
}