.. default-domain:: csharp .. _CWinCtrlRenderIcon: ============================== CWinCtrlRenderIcon ============================== スクリプト: :ref:`RENDERICON` アイコンにレンダリングするためのコントロールです。 指定されたレンダーテクスチャから自動的に矩形を切り出し、レンダリングします。 複数のレンダー結果を一枚のレンダーテクスチャ内に含めることができるため、一度レンダリングした後のアイコンの描画が高速です。 例えば、リストボックス内のコンテンツに着せ替え可能アバターアイコンを表示したいときなどに使うと効果的です。 :ref:`CWindowBase` に届くコールバック :meth:`void onClick(CWinCtrlBase cCtrl)` :meth:`void onHold(CWinCtrlBase cCtrl)` :meth:`void onBeginDrag(CWinCtrlBase cCtrl,Vector2 pos)` :meth:`void onDrag(CWinCtrlBase cCtrl,Vector2 pos,Vector2 dragVelocity)` :meth:`bool onDragRender(CWinCtrlBase cCtrl,Transform transform)` :meth:`void onDrop(CWinCtrlBase cCtrl,CWindowBase cDragWindow,CWinCtrlBase cDragCtrl)` :meth:`void onDropGround(CWinCtrlBase cCtrl)` :meth:`bool onBeginRenderIcon(CWinCtrlRenderIcon icon)` アイコンにレンダリング開始 この関数の戻り値は、次の意味を持ちます。 * trueを返すとテクスチャにレンダリングします。 * falseを返すとレンダリングしません。 :meth:`onEndRenderIcon` も呼ばれません。 :meth:`bool onEndRenderIcon(CWinCtrlRenderIcon icon)` レンダリングが終了したときに呼ばれる この関数の戻り値は、次の意味を持ちます。 * trueを返すと、次のフレームもレンダリングを継続します( :meth:`onBeginRenderIcon` が呼ばれる) * falseを返すと、以降のフレームでは必要がない限り、レンダリングされません。 一度停止させたレンダリングを再開したいときは、 :prop:`needToRender` をtrueにしてください。 .. class:: CWinCtrlRenderIcon *固有の関数/プロパティ* .. property:: ulong regionId { get; set; } 0以外の固有のIDを割り振ってください。 0を代入すると確保されたレンダリング領域が解放されます。 また、他のコントロールと同じ値を割り振ると、レンダリング領域を共有します。 .. property:: Camera camera { get; } レンダリングテクスチャが割り当てられたカメラを取得できます。 カメラの位置や角度等をカスタマイズしたいときにアクセスしてください。 .. property:: WinColor color1 { get; set; } レンダリングする際の背景色として割り当てられています。 デフォルトは、(0,0,0,0)です。 .. property:: bool needToRender { get; set; } レンダリングを再開したいとき、trueを設定してください。 次のフレームでは :meth:`onBeginRenderIcon` が呼び出されます。 .. property:: CInput::e_State state { get; } アイコンが押されている状態を取得できます。 *使用例* :meth:`onBeginRenderIcon` によって、レンダリングしたいオブジェクトのみアクティブにしています。 そして、 :meth:`onEndRenderIcon` によって、非アクティブにしています。 この操作をしないと全てのオブジェクトが一つのアイコンにレンダリングされることになります。 また、 :meth:`onBeginRenderIcon` がtrueを返すと、直ちにCamera.Render()が呼び出されるので、 アニメーションなどの設定をしたときは、下記の例のように、Animation.Sample()を明示的に呼んでおく必要があります。 正しくレンダリングされないときは、以下の点をチェックしてみて下さい。 * レイヤーの設定がおかしくないか?/レイヤーの設定を忘れていないか? * カメラにレンダリング対象が収まっているか? 当然、カメラに収まっていないとオブジェクトはレンダリングされません。 * :prop:`regionId` を設定したか? :prop:`regionId` が0の時は、レンダーテクスチャへのレンダリングが行われません。 :prop:`regionId` をキーにしてレンダーテクスチャの空いている領域から矩形を切り出し、レンダリングします。 .. code-block:: csharp override public bool onBeginRenderIcon(CWinCtrlRenderIcon icon) { CWinCtrlListbox lbAvatar = lbAvatar = find(CWinCtrlListbox>(LISTBOX_Avatar); int idx = lbAvatar.getContentsIndex(icon); if (idx < 0) { return false; } GameObject go = m_lstGameObject[idx]; if (go == null) { return false; } go.SetActive(true); Animation anim = go.GetComponent(); anim.Sample(); return true; } override public bool onEndRenderIcon(CWinCtrlRenderIcon icon) { CWinCtrlListbox lbAvatar = lbAvatar = find(CWinCtrlListbox>(LISTBOX_Avatar); int idx = lbAvatar.getContentsIndex(icon); GameObject go = m_lstGameObject[idx]; if (go == null) { return false; } go.SetActive(false); return false; } // click callback override public void onClick(CWinCtrlBase cCtrl) { switch (cCtrl.id) { case RENDERICON_Avatar: break; } } // hold callback override public void onHold(CWinCtrlBase cCtrl) { switch (cCtrl.id) { case RENDERICON_Avatar: break; } } .. *各レイヤーの初期値* Camera.cullingMask = e_Layer.RenderIcon; 特に必要が無ければ触らないようにしておいてください。 レンダリングするときは、レイヤー設定をしているかしっかり確認してください。 レンダリング対象のゲームオブジェクトも上記値を設定しておくようにしておいてください。 .. code-block:: csharp // If gameobjectAvatar is not multiple hierarchies, the following is sufficient. gameobjectAvatar.layer = (int) e_LayerId.RenderIcon; // If gameobjectAvatar is made up of multiple hierarchies, it must be recursively set using the following function: Utility.setLayer(gameObjectAvatar,e_LayerId.RenderIcon); gameobjectAvatar.SetActive(false); .. .. note:: GameObject.layerは、一つの階層に対してのみレイヤーを設定します。子供の階層にまで影響を与えません。 レンダーアイコンが持つカメラに選択的に子供の階層を持つオブジェクトを正しくレンダリングするためには、 本アセットが用意しているレイヤーを再帰的に設定可能な、Utility.setLayerを使ってください。 *レンダリングの主な流れ* RenderIconは、複数のモデルをテクスチャにレンダリングして表示するのに適しています。 ただし、レイヤーの数が限りがあるので、一つのレイヤーを使いまわすことを考える必要があります。 この問題を回避するために次のような手順でレンダリングします。 #. モデルの読み込み #. 読み込み終わったら、SetActive(false)にしてゲームオブジェクトを非アクティブにします #. レイヤーをRenderIconに設定します。 #. :prop:`regionId` に、ユニークな値を設定します。 #. OnBeginRenderIconが呼ばれたら、対象のゲームオブジェクトをアクティブにします #. OnEndRenderIconが呼ばれたら、対象のゲームオブジェクトを非アクティブにします これによって必ずRenderIconにレンダリングされるゲームオブジェクトを一つに絞ることができます。 OnEndRenderIconの戻り値は、falseを返しておく方がパフォーマンスが出ます。 そうしないと、毎フレーム、テクスチャへのレンダリングが発生してしまいます。 *onBeginRenderが呼ばれるタイミング* * :prop:`regionId` に0以外の値が設定されたとき. :prop:`regionId` に0以外のユニークな値を設定した直後から、 :meth:`onBeginRenderIcon` が呼ばれます。 :meth:`onBeginRenderIcon` がtrueを返すまで呼ばれ続けます。 falseを返した時は、 :meth:`onEndRenderIcon` は呼び出されません。 この仕組みを使ってモデルの非同期読み込み途中は、falseを返し、レンダリング準備ができたタイミングで モデルをテクスチャにレンダリングすることが可能です(レイヤーの設定は忘れないでください)。 * レンダーテクスチャ消失後 レンダーテクスチャが消失する理由としては、スクリーンセーバが走ったり、ウィンドウが最小化されたときなどが考えられます。 レンダーテクスチャは破壊されることがあるので、常にテクスチャへの再レンダーができるようにしておくべきです。 * :prop:`needToRender` にtrueを設定した後 * :meth:`onEndRenderIcon` がtrueを返した次のフレーム 毎フレームレンダリングしたいときは、trueを返してください。 ただし、パフォーマンスには気を付けてください。