![見出し画像](https://assets.st-note.com/production/uploads/images/123540928/rectangle_large_type_2_e5736ee4528f46af642ffa43a24a0fb1.png?width=1200)
GREEアバターのアバスタ機能を再現してみたよ! REALITY Advent Calendar 2023
こんにちは、REALITY Advent Calendar 2023 4日目担当サーバエンジニアのゆーしです。
今年の合宿では、GREEアバターの"アバタースタジオ"機能をREALITYで再現してみたのでその紹介をさせていただきます。
"アバタースタジオ"機能とは?
ところでGREEアバターはご存知でしょうか?
GREEアバターは、REALITYの親会社であるグリーの創業事業のSNS「GREE」において15年以上続いているアバターサービスです。
このGREEアバターには"アバタースタジオ"機能(アバスタ) と呼ばれる機能があり、不要なアバターアイテムを"リサイクル"して素材ポイントに変えたり、この素材ポイントを使って素材ショップで素材を購入して持っているアバターアイテムの"リメイク"(カラーチェンジ)をすることができます。
やりたいこと
REALITYのアバターガチャのアイテムにもカラーバリエーションが複数ありますが、欲しいカラーがどうしても手に入らなかったり、後々になって別のカラーが欲しくなって困ることがあります。
REALITYでは被ったアバターアイテムを売却することでアバターポイントを入手できるので、このアバターポイントを使ってGREEアバター同様にアバスタの機能を実現できないかと考えました。
ということで作ってみました
バックエンドとアプリの両方に手を入れている時間はないので、実装はREALITY for Web上で。
私のお気に入り、"赤ずきんのお洋服セット"のカラーチェンジを実装してみようと思います。
まずはメニューを作っていきます。
トップに、"アバタースタジオ"のメニューを追加し、中に"リメイク"と"素材ショップ"を用意していきます。
![](https://assets.st-note.com/img/1701649523926-8YmVwwfVSJ.png?width=1200)
![](https://assets.st-note.com/img/1701649574882-gqkon2yXKs.png?width=1200)
次に"素材ショップ"を作っていきます。
実際の表示は以下のようになります。
![](https://assets.st-note.com/img/1701656619044-kTprq9sjKQ.png?width=1200)
今回は内部のデータ構造として、以下の3つを新たに定義しました。
素材マスタデータ
これは素材の種類や、名称など必要な情報を集めたデータ構造です。
素材の種類にはリメイクに必要な材料を設定してあり、リメイクの基本となる"レシピ"やリメイクで使用する"追加素材"などのタイプが用意されています。
レシピの場合には、追加情報としてそのレシピによってリメイクで生成されるアバターアイテムの情報や、リメイクに必要なアイテム(追加素材、アバターアイテム、アバターポイント)などを複数設定できる構造にしています。
今回はカラーチェンジのみでしたが、アバターアイテムAとアバターアイテムBを合わせてアバターアイテムCを作ったり、アバターアイテムDと追加素材Zを合わせてアバターアイテムEを作る、といった用途にも利用可能となっています。
type MasterItem struct {
ID int
Type int // 素材のタイプ(レシピ(カラーチェンジ) / 追加素材 / etc)
Name string // 素材の名称
Option struct {
Result struct {
// 作り出されるアバターアイテムの情報
},
RequiredItems []struct {
// リメイクに利用するアイテム情報(素材 / アバターアイテム / アバターポイント
}
}
}
素材ショップマスタデータ
これは、素材ショップで販売する価格や期間をMasterItemのIDと紐付けているデータ構造です。
type ShopItem struct {
ID int
MasterItemID int // MasterItemのID
Price int // 販売価格
SaleBeginAt time.Time // 販売開始日時
SaleEndAt time.Time // 販売終了日時
}
ユーザの素材所持データ
最後は素材ショップから購入した素材のユーザ/素材ごとの管理情報です。
UserIDとMasterItemの組でユーザごとに管理しています。
type UserItem struct {
UserID string
MasterItemID string
Count int
}
既存のデータに上記のデータ構造を組み合わせて今回の機能を実現しています。
では次に"リメイク"を作っていきます。
リメイクは1つ以上のレシピを素材ショップで購入していないと使えません。
レシピを所持していないと以下のように表示されます。
![](https://assets.st-note.com/img/1701651798184-ZRPEPm9cbh.png?width=1200)
そこで、素材ショップでレシピを購入します。
今回は赤ずきんセット服の緑色へのカラーチェンジのレシピを購入します。
![](https://assets.st-note.com/img/1701656575555-CcCaZfYfYt.png?width=1200)
![](https://assets.st-note.com/img/1701656512009-cuwXxdatsK.png?width=1200)
ということでレシピが表示されるようになりました。
追加で"緑の染料"素材を購入し、いざ実行。
![](https://assets.st-note.com/img/1701656440810-NW6GznpD7h.png?width=1200)
無事、"赤ずきんのお洋服セット"のカラーチェンジに成功しました。
![](https://assets.st-note.com/img/1701656341154-Oce9mMAh2B.png?width=1200)
まとめ
今回の挑戦において、実際にはカラーチェンジ後にアプリを再起動しないと変更が反映されないとか多少の問題はありましたが、仕組みとしては大まかには実現可能なことは分かりました。
アバターポイントを活用できる箇所が今より増えるのはとてもありがたいので、将来この機能を本当に実現できたら嬉しいなと思いました。
明日のアドベントカレンダーは?
明日はUnityエンジニアのホンダさんの「TDDでゲームを作ってみる」になります、お楽しみに!!