UEMarketplaceのセール品一覧を出力する

前回(購入済みアセット一覧の出力)に引き続き、
マケプレの情報をChromeのコンソール経由でcsvに吐く話。

使い方

1.マケプレのページを開く。
2.ChromeDeveloperToolのコンソールを表示する。
3.下記のコードを流し込む(お好みで中身を変更してください)
4.ログにcsvが吐かれるのでコピーして保存。
5.Google SpreadSheetにインポート。
6.各行の高さ、各列の幅などを調整。

使い道...?

素直にマケプレで商品眺めたほうがいい気がしないでもない。
ノリで作っただけなので細かいことは気にしないことにする。

// マケプレの商品ソートパラメータ
const SORT_TYPE_EFFECTIVEDATE = 'effectiveDate'
const SORT_TYPE_DISCOUNT = 'discountPercentage'
const SORT_TYPE_TITLE = 'title'
const SORT_TYPE_CURRENTPRICE = 'currentPrice'

// マケプレのセール種別
// イベントについては現状実施期間外なので未チェック
const SALE_TYPE_REGULAR = 'regular%7Cevent'
const SALE_TYPE_EVENT = 'event'

// アセットの商品カテゴリパラメータ
// マケプレにアクセスしたときのurlのassets/以下を参考にしたが、
// 全種類叩いて確認したわけではないので注意
const CATEGORY_2D = 'assets%2F2d'
const CATEGORY_ANIMATIONS = 'assets%2Fanimations'
const CATEGORY_EFFECTS = 'assets%2Ffx'
const CATEGORY_CHARACTERES = 'assets%2Fcharacters'
const CATEGORY_CODEPLUGINS = 'assets%2Fcodeplugins'
const CATEGORY_SOUNDEFFECTS = 'assets%2Fsoundfx'
const CATEGORY_TEXTURES = 'assets%2Ftextures'
const CATEGORY_BLUEPRINTS = 'assets%2Fblueprints'
const CATEGORY_PROPS = 'assets%2Fprops'
const CATEGORY_MATERIALS = 'assets%2Fmaterials'
const CATEGORY_ARCHVIS= 'assets%2Farchvis'
const CATEGORY_WEAPONS= 'assets%2Fweapons'
const CATEGORY_ENVIRONMENTS = 'assets%2environments'
const CATEGORY_MUSIC = 'assets%2music'

function makeUrl(start, count, sortType, sortDir, saleType, category){
    let url = 'https://www.unrealengine.com/marketplace/api/assets?lang=ja&start='+start+'&count='+count+'&sortBy='+sortType+'&sortDir='+sortDir+'&saleType='+saleType
    if(category && 0<category.length){
        return url + '&category=' + category
    }
    return url
}

async function run(sortType, sortDir, saleType, category){
    // 必要なループ回数を調べる
    const pagingQueryResp = await (await fetch(makeUrl(0, 1, sortType, sortDir, saleType, category))).json()
    const loopMax = Math.ceil(pagingQueryResp.data.paging.total/100)
    let buffer = ''
    function writeColumn(body){
        buffer = buffer + '"'+body+'",'
    }
    for(let i=0;i<loopMax;i++)
    {
        // 指定範囲のアセット情報を問い合わせ
        const requestUrl = makeUrl(i*100, 100, sortType, sortDir, saleType, category)
        console.log(requestUrl)
        const response = await fetch(requestUrl)
        console.log(response)
        const responseJson = await response.json()
        console.log(responseJson)
        const elements = responseJson.data.elements
        for (let item of elements)
        {
            // ほしい内容を拾う
            writeColumn('=IMAGE(""'+item.thumbnail+'"", 1)')
            writeColumn(item.title)
            writeColumn(item.description.replaceAll('"', '""'))
            if(item.categories && 0 < item.categories.length){
                writeColumn(item.categories[0].name)
            }else{
                writeColumn('')
            }
            writeColumn(item.seller.name)
            writeColumn(item.price)
            writeColumn(item.discount)
            writeColumn(item.discountPrice)
            writeColumn(item.discountPercentage)
            writeColumn(item.compatibleApps.join(","))
            writeColumn('https://www.unrealengine.com/marketplace/ja/item/'+item.catalogItemId)
            buffer = buffer + '\n'
        }
    }

    // ログに結果を出力
    console.log(buffer)
}

await run(SORT_TYPE_DISCOUNT, 'DESC', SALE_TYPE_REGULAR, CATEGORY_CODEPLUGINS)

コピーして保存するのが面倒ならこれとか使うといいかも github.com 前回と違って認証が必須ではないので、ブラウザからにこだわらなければもう少し何かできる気はする...

あとがき

単純に価格監視がしたいなら、そういうサイトがあるようだ。
ただ、何か不具合があるのか、日本円の価格情報は正しくない。 wishlist制限対策としての使い道はありそう。

forums.unrealengine.com

UEMarketplaceで集めたアセットの一覧を出力する

使い方

1.マケプレのページを開く。
2.ChromeDeveloperToolのコンソールを表示する。
3.下記のコードを流し込む。
4.ログにcsvが吐かれるのでコピーして保存。
5.Google SpreadSheetにインポート。
6.各行の高さ、各列の幅などを調整。

使い道...?

プロジェクト開始前に「この機能の仮実装は一旦このアセットで」とか、
「今回はこの開発支援プラグイン使おうか」とか相談するのに使えるかもしれません。

const VAULT_URL = 'https://www.unrealengine.com/marketplace/api/assets/vault'
const pagingQueryResp = await (await fetch(VAULT_URL + '?lang=ja&start=0&count=1')).json()
const loopMax = Math.ceil(pagingQueryResp.data.paging.total/100)
let buffer = ''
function writeColumn(body){
    buffer = buffer + '"'+body+'",'
}
for(let i=0;i<loopMax;i++)
{
    // 指定範囲のアセット情報を問い合わせ
    const requestUrl = VAULT_URL + '?lang=ja&start='+(i*100)+'&count=100'
    console.log(requestUrl)
    const response = await fetch(requestUrl)
    console.log(response)
    const responseJson = await response.json()
    console.log(responseJson)
    const elements = responseJson.data.elements
    for (let item of elements)
    {
        // 除外したいものがあれば除外
        if(item.seller.name != 'Epic Games' && item.seller.name != 'Quixel Megascans')
        {
            // ほしい内容を拾う
            writeColumn('=IMAGE(""'+item.thumbnail+'"", 1)')
            writeColumn(item.title)
            writeColumn(item.description.replaceAll('"', '""'))
            if(item.categories && 0 < item.categories.length){
                writeColumn(item.categories[0].name)
            }else{
                writeColumn('')
            }
            writeColumn(item.seller.name)
            writeColumn('https://www.unrealengine.com/marketplace/ja/item/'+item.catalogItemId)
            buffer = buffer + '\n'
        }
    }
}
// ログに結果を出力
console.log(buffer)

なんとなくだらしないコードになってしまった気がする...
Google SpreadSheetにインポートして調整した結果

f:id:eims:20210827192509p:plain
結果イメージ

UE4のAngelScriptでできないこと

或いはできるかわからんこと

UE4のAngelScript上でwwiseを使ってBGM再生

class AMyLevel : ALevelScriptActor
{

    UPROPERTY()
    UAkAudioBank MainBank = Asset("/Game/WwiseAudio/Main_Bank.Main_Bank");

    UPROPERTY()
    UAkAudioEvent PlayTitleAsset = Asset("/Game/WwiseAudio/Events/Default_Work_Unit/PlayTitle.PlayTitle");

    UFUNCTION(BlueprintCallable)
    void InitBGM()
    {
        AkGameplay::LoadInitBank();
        AkGameplay::LoadBank(MainBank, "", FLatentActionInfo());
    }

    UFUNCTION(BlueprintCallable)
    void PlayTitle()
    {
        AkGameplay::PostEvent(PlayTitleAsset, Gameplay::GetPlayerPawn(0), 0, FOnAkPostEventCallback(), TArray<FAkExternalSourceInfo>());
    }
};

BP側で継承してアウトゲーム部分でBGMを簡易再生するようなシチュエーションを想定。
InitBGMを呼んでPlayTitleを呼べばPostEventされる。
BP側ではデフォルト値で埋めてくれる部分もAS側では手動で埋める必要があることに注意。

Asset()はコンストラクタかdefaultに対してしか使えないっぽい。
関数内で参照を取りたい場合は

Cast<UAkAudioEvent>(LoadAsset(nullptr, "/Game/WwiseAudio/Events/Default_Work_Unit/PlayTitle.PlayTitle"));  

のようにする。

追記

staticが無い代わりにグローバル関数をBlueprintCallableな関数として登録が可能だったので
これでいいかも。

UFUNCTION(BlueprintCallable)
void InitBGM()
{
    UAkAudioBank MainBank = Cast<UAkAudioBank>(LoadObject(nullptr, "/Game/WwiseAudio/Main_Bank.Main_Bank"));
    AkGameplay::LoadInitBank();
    AkGameplay::LoadBank(MainBank, "", FLatentActionInfo());
}

UFUNCTION(BlueprintCallable)
void PlayTitleBGM()
{
    UAkAudioEvent PlayTitleAsset = Cast<UAkAudioEvent>(LoadObject(nullptr, "/Game/WwiseAudio/Events/Default_Work_Unit/PlayTitle.PlayTitle"));
    AkGameplay::PostEvent(PlayTitleAsset, Gameplay::GetPlayerPawn(0), 0, FOnAkPostEventCallback(), TArray<FAkExternalSourceInfo>());
}

Unreal Marketplace 個人的アセットメモ

ほしいものリストみたいなものです。
なのでエアプ乙な内容です。
分類、記載など途中

移動系

カメラ

IK

アクション

HUD, UI

マテリアル

未分類

Armory3Dメモ

Armory3D

  • Viewportでの再生
    2019年12月中旬現在の最新では非対応。
    過去のバージョンではできていた。
  • ノードエディタのノード追加ショートカット
    Shift+A
  • ArmoryのUpdate
    コンソールログをちゃんと読むこと。
    コケてそうならおとなしく元のバージョンを使う。
  • プロジェクトを開いただけでVSCode/KODE Sturioがエラー吐きまくる
    各種設定のパスを通してからArmoryと結合する。
    でないとビルド設定のクラスパスetcがおかしくなり、Int16Arrayが無いなどのエラーが大量に出る。

LGUI (Lex GUI)最新版でUIをプレビューする方法がわからん

古いバージョンではUIのルートにパイロットでプレビュー相当のことができたんだけど
できなくなったので暫定対処法を。

f:id:eims:20191009220711p:plain 位置 0,0,適当にZを引く
回転 180,90,90
な空アクターを子供に置いて、子供にパイロット

なんかいい方法あったら誰か教えてください...