コメントでの議論に続いて、これを行う方法の一例を次に示します。新しいコンポーネントを作成してプロジェクトに追加します。ここで私はそれを呼び出しましたTextureCube
(パッケージを右クリック - >インストール。変更するには、右クリック - >アンインストールを実行し、変更を加えてから、右クリック - >再度インストールします):

unit TextureCube;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Types3D, FMX.Objects3D,
Generics.Collections;
type
TCubeTexture = (ctGrass, ctDirt, ctSnow, ctStone);
TTextureSource = Class(TComponent)
private
FSelectedTexture : TCubeTexture;
FTextures : TDictionary<TCubeTexture, TBitmap>;
function GetTexture : TBitmap;
procedure SetTexture(setTex : TBitmap);
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
property Textures : TDictionary<TCubeTexture, TBitmap> read FTextures;
published
property SelectedTexture : TCubeTexture read FSelectedTexture write FSelectedTexture;
property Texture : TBitmap read GetTexture write SetTexture;
End;
TTextureCube = class(TCube)
private
FType : TCubeTexture;
FTextureSource : TTextureSource;
procedure SetCubeTexture(cubeTex : TCubeTexture);
procedure SetTextureSource(texSource : TTextureSource);
published
property CubeType : TCubeTexture read FType write SetCubeTexture;
property TextureSource : TTextureSource read FTextureSource write SetTextureSource;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TTextureCube]);
RegisterComponents('Samples', [TTextureSource]);
end;
constructor TTextureSource.Create(AOwner : TComponent);
begin
inherited;
FTextures := TDictionary<TCubeTexture, TBitmap>.Create();
end;
destructor TTextureSource.Destroy;
begin
FTextures.Free;
inherited;
end;
function TTextureSource.GetTexture : TBitmap;
var tex : TBitmap;
begin
if FTextures.TryGetValue(FSelectedTexture, tex) then
result := tex
else begin
tex := TBitmap.Create(1,1);
FTextures.AddOrSetValue(FSelectedTexture, tex);
result := tex;
end;
end;
procedure TTextureSource.SetTexture(setTex : TBitmap);
begin
FTextures.AddOrSetValue(FSelectedTexture, setTex);
end;
procedure TTextureCube.SetCubeTexture(cubeTex: TCubeTexture);
var tex : TBitmap;
begin
FType := cubeTex;
if Assigned(FTextureSource) and
(FTextureSource.Textures.TryGetValue(cubeTex, tex)) then
self.Material.Texture := tex
else
self.Material.Texture.Clear(0);
end;
procedure TTextureCube.SetTextureSource(texSource: TTextureSource);
begin
FTextureSource := texSource;
SetCubeTexture(FType);
end;
end.
TTextureCube
これは、から継承する新しいキューブ クラスを提供しますTCube
。キューブは列挙型を追加し、TTextureSource
各型のテクスチャを提供する にリンクできます。ここでは、これらをコンポーネント ツールバーのセクションに追加しましたSamples
。好きな場所に配置できます。TTextureSource と TTexture キューブをフォームにドロップするだけです。TTextureCube
これは、 をフォーム上の に自動関連付けすることで明らかに改善できますTTextureSource
。今のところ、キューブとソースを関連付けるだけです。

ここでは、カスタム エディター/ビューアーをわざわざ作成しませんでしたTTextureSource
。どのタイプを選択して、そのタイプのテクスチャを設定するだけでかまいません。TTextureSource は、各キューブ タイプに関連付けられたテクスチャのライブラリを保存します。

次に、それぞれに対してTTextureCube
キューブ タイプを変更するだけで、関連するテクスチャが から取得されますTTextureSource
。

完全な注意として、私は日曜日の退屈から非常に簡単にこれを書き始めました. 明らかに、私はおそらく多くのことを見逃していたり、適切にクリーンアップしていなかったりする可能性があります。これを本番コードで使用するには、もう一度適切にやり直し、例外処理、バグチェック、および整頓を追加する必要があります。