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制限対策としての使い道はありそう。
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にインポートして調整した結果
UE4のAngelScriptでできないこと
或いはできるかわからんこと
outピンの対応が現状できないっぽい
https://github.com/Hazelight/UnrealEngine-Angelscript/issues/44タイマー系の処理、非同期処理
WorldからTimerManagerが拾えない。
CPPでヘルパ関数経由で叩くことは可能だろうか?
↓のモジュールが見当たらないので、createCoroutineは叩けそうにない気配。
AngelScript: Context manager
まだ試してないけどこんなものを発見
https://github.com/JakobLarsson-Embark/UnrealEngine-Angelscript/blob/angelscript-master/Script-Examples/Examples/Example_Timers.as
コルーチンはやっぱり非サポートの気配。日本語リテラルの取り扱い
BP側から日本語ぶち込んだ場合は正常に保持できるらしいコールバック系処理の扱い
下記記事のFName Literalsの例のようにdelegate型的なものを定義して扱えるが、 https://angelscript.hazelight.se/angelscript-features
AngelScriptのドキュメントにあるfuncdef構文は手元では通らず。
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 個人的アセットメモ
ほしいものリストみたいなものです。
なのでエアプ乙な内容です。
分類、記載など途中
移動系
Custom Movement:Ju-Sik Lee:Blueprints - UE4 マーケットプレイス
はしごやクライミングなどの実装補助Root Motion Guide by Ju-Sik Lee in Code Plugins - UE4 Marketplace
Locomotion Starter Kit:Lovato Game Studio:Blueprints - UE4 マーケットプレイス
Root Motion Controller Framework by Tala Esenlikler in Blueprints - UE4 Marketplace
パルクールアクションなどをカバーしている。 高いけど遊びがいありそう。 アニメは同梱されておらず、Kuboldのアニメを使うことを想定されている。 トータルが高いなぁ...
カメラ
- Physics-Based Camera Movement:FoxViz:Blueprints - UE4 マーケットプレイス
硬いカメラ挙動を改善してくれる
IK
アクション
HUD, UI
Advanced Marker Kit:Jayden.J:Blueprints - UE4 マーケットプレイス
目標となるオブジェクトなどに印を表示するInteraction Widgets:Defuse Studios:Blueprints - UE4 マーケットプレイス
インタラクト対象にウィジェットを表示Angled Lower Thirds:SUMFX:Blueprints - UE4 マーケットプレイス
地名表示やTIPS表示に使えそうなウィジェットHQUI: Buttons:Piontek:Blueprints - UE4 マーケットプレイス
エフェクト付きボタン。階層が多いけど大量に並べなければOKかComplete Menu System:Ezitna:Blueprints - UE4 マーケットプレイス
シンプルなメニューテンプレート。マウスだけでなくキーボードやGamePadにも対応。UMG Style Classes by FBAM Studio in Code Plugins - UE4 Marketplace
UIの共通スタイルを定義できる
マテリアル
OutlineMaker:FrancescoDesogus:Materials - UE4 マーケットプレイス
メッシュの縁取りができる。壁透視などにも使えそう?Jiffycrew Post Process Line:Jiffycrew:Materials - UE4 マーケットプレイス Outline,Creaseなどの線を引ける。ハイポリではよりメリハリが出て引き締まるような印象?
DevTon Archviz Materials Vol 12:DevTon Studio:Materials - UE4 マーケットプレイス
床などに使える高品質なマテリアルHG: Sacred Geometry Decals Bundle:Hotgates:Materials - UE4 マーケットプレイス
魔法陣や紋章などのデカールセット。ファンタジーだけでなくSFなどでもつかえそうAnimated Rain/Waterdrop Material:CemTezcan:Materials - UE4 マーケットプレイス
雨天時のオブジェクトや窓の水濡れ表現Stylised Hair Shader:robert ramsay:Materials - UE4 マーケットプレイス
髪シェーダ
未分類
Surface Trails (with Snow Deformation example):RomanSmirnov:Blueprints - UE4 マーケットプレイス
雪をかきわけたときの表現などに使える8bit World - Box world builder:National Unite:Blueprints - UE4 マーケットプレイス
マイクラOpen World NPC Optimization with network support:Sergio Cavalli:Blueprints - UE4 マーケットプレイス
見えない範囲のNPCの最適化Lightning Fast:Krystian Komisarek:Blueprints - UE4 マーケットプレイス
最適化された雷光エフェクトFaster Data Handling:Impulse:Blueprints - UE4 マーケットプレイス
BPでBTreeを扱うプラグイン。
気になったのでメモしてしまったが欲しくなるシチュエーションが想像できない。Blueprint Sticky Notes by Andrzej Koloska in Code Plugins - UE4 Marketplace
BPにメモを貼るUAsset Browser by Mary Nate in Code Plugins - UE4 Marketplace
他のプロジェクトのuassetのブラウズ・インポートを手助けする
これかなり有用なのではTime Machine by ChrisV in Code Plugins - UE4 Marketplace
過去に見ていたアセットを再度開くなどの操作のサポート。
「ブラウザの戻るボタン」のようなものらしい。
名前から編集履歴を想像してしまいそうだけれど関係ない。
あまり話題になっている印象はないがかなり効率化を手助けしそうな気がする。Easy Interactions:Beniamin Dudek:Blueprints - UE4 マーケットプレイス
電源スイッチやドアなど。
キャラのアニメーションは無い。一人称視点の脱出ゲームなどであればそのまま使えるだろう。Graffiti System:Ogansoft:Blueprints - UE4 マーケットプレイス
文字デカールの生成
Armory3Dメモ
Armory3D
- Viewportでの再生
2019年12月中旬現在の最新では非対応。
過去のバージョンではできていた。 - ノードエディタのノード追加ショートカット
Shift+A - ArmoryのUpdate
コンソールログをちゃんと読むこと。
コケてそうならおとなしく元のバージョンを使う。 - プロジェクトを開いただけでVSCode/KODE Sturioがエラー吐きまくる
各種設定のパスを通してからArmoryと結合する。
でないとビルド設定のクラスパスetcがおかしくなり、Int16Arrayが無いなどのエラーが大量に出る。