diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..fdf478c --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,33 @@ +name: github pages + +on: + push: + branches: + - main + +jobs: + build-deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 23 + + - name: Build + env: + TZ: "Asia/Tokyo" + run: | + cd ./book + npm i + npx honkit build + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./book/_book + publish_branch: gh-pages + user_name: 'ai[bot]' + user_email: '138105980+yui-syui-ai[bot]@users.noreply.github.com' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44a3b6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*/*-lock.json +*/node_modules +*.sqlite +*.lock +*target +*.db +**.DS_Store +*.DS_Store +/scpt/*.jpeg +/scpt/*.png +config +book/_book +book/node_modules +book/*/*.ini +book/*.ini diff --git a/.keep b/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/book/CNAME b/book/CNAME new file mode 100644 index 0000000..2ee01e9 --- /dev/null +++ b/book/CNAME @@ -0,0 +1 @@ +ue-book.syui.ai diff --git a/book/README.md b/book/README.md new file mode 100644 index 0000000..3574f4c --- /dev/null +++ b/book/README.md @@ -0,0 +1,5 @@ +![](cover.jpg) + +# Unreal Engine Guide Book + +download | web diff --git a/book/SUMMARY.md b/book/SUMMARY.md new file mode 100644 index 0000000..c3482af --- /dev/null +++ b/book/SUMMARY.md @@ -0,0 +1,90 @@ +# Summary + +* [Unreal Engine Guild Book](README.md) +* [default](default/README.md) + * [asset/plugin](default/00_asset.md) + * [start](default/01_start.md) + * [install](default/02_install.md) + * [tips](default/03_tips.md) +* [game animation sample](gasp/README.md) + * [キャラクターを追加する](gasp/01_character.md) + * [飛びつける高さを増やす](gasp/02_jump.md) + * [キャラクターを作る](gasp/03_vrm.md) + * [モーションキャプチャで動かす](gasp/04_vmc.md) + * [揺れものを設定する](gasp/05_kawaii.md) + * [カメラワークの設定する](gasp/06_camera.md) + * [アニメーションを作成する](gasp/07_anim.md) + * [アニメーションを変更する](gasp/11_run.md) + * [niagaraでダメージを出す](gasp/08_niagara.md) + * [椅子に座る](gasp/09_chair.md) + * [階段に登る](gasp/10_stairs.md) + * [武器を装備する](gasp/12_weapon.md) +* [control rig sample](crs/README.md) + * [CRでキャラクターを動かす](crs/01_character.md) + * [ボスを作る](crs/02_boss.md) + * [ボスのジャンプ攻撃を作る](crs/03_jump.md) +* [city sample](city/README.md) + * [惑星形式のmapを作る](city/01_remove.md) + * [橋を作る](city/02_bridge.md) + * [家を作る](city/03_house.md) + * [BGMを作る](city/04_bgm.md) + * [ブラウザを作る](city/05_browser.md) +* [gameplay camera](camera/README.md) + * [もっと近づける](camera/01_close.md) +* [json blueprint utilities](json/README.md) + * [apiから情報を取得する](json/01_varest.md) +* [pixel streaming](pixel/README.md) + * [基本事項](pixel/01_server.md) +* [vrm4u](vrm4u/README.md) + * [キャラクターを作る](vrm4u/01_make.md) + * [指の角度を調整する](vrm4u/02_yubi.md) + * [前髪の角度を調整する](vrm4u/03_hair.md) + * [アウトラインを追加する](vrm4u/04_outline.md) + * [トーンを変える](vrm4u/05_toon.md) +* [有料アセット](plan/README.md) + * [superhero fligth animations](plan/01_flying.md) + * [ultra dynamic sky](plan/02_uds.md) + * [ocean waves](plan/03_ocean.md) + * [nice interaction system](plan/04_item.md) + * [replicated interaction kit vol 3](plan/05_chair.md) + * [dragon ik plugin](plan/06_dragonik.md) + * [worldscape plugin](plan/07_wsp.md) +* [unity](unity/README.md) + * [animation clipをueで使う](unity/01_fbx.md) +* [blender](blender/README.md) + * [素体を作る](blender/01_model.md) + * [衣装を着せる](blender/02_costume.md) + * [vrmで統合する](blender/03_vrm.md) +* [web](web/README.md) + * [glbをwebに表示する](web/01_three.md) + * [vrmをwebに表示する](web/02_three-vrm.md) +* [issue](issue/README.md) + * [ue](issue/ue/README.md) + * [error II-E1001](issue/ue/ue_01.md) + * [game animation sample](issue/gasp/README.md) + * [GameplayCameraをdisableにする](issue/gasp/gasp_01.md) + * [cameraが急接近する](issue/gasp/gasp_02.md) + * [characterのcomponentが初期化される](issue/gasp/gasp_03.md) + * [IA_Sprintのダッシュができなくなる](issue/gasp/gasp_04.md) + * [traversableが機能しなくなる](issue/gasp/gasp_05.md) + * [city sample](issue/city/README.md) + * [buildが遅い場合](issue/city/city_01.md) + * [ue5.5ではbuildが通らない](issue/city/city_02.md) + * [問題が起こったときにresetする](issue/city/city_03.md) + * [playerが地面に埋まってしまう](issue/city/city_04.md) + * [他のmapとの統合](issue/city/city_05.md) + * [BGMを変更する](issue/city/city_06.md) + * [表示されなくなったサイト](issue/city/city_07.md) + * [blender](issue/blender/README.md) + * [衣装の背後に黒いチラつきが発生する](issue/blender/blender_01.md) + * [ueで読み込むと一部のmaterialが正しく表示されない](issue/blender/blender_02.md) + * [髪の毛が頭に追従しなくなる事がある](issue/blender/blender_03.md) + * [vrm4u](issue/vrm4u/README.md) + * [customで衣装の半分が灰色になる](issue/vrm4u/vrm4u_01.md) +* [project](project/README.md) + * [自己紹介](project/01_ep.md) + * [最初の体験](project/02_ep.md) + * [毎日プレイ](project/03_ep.md) + * [自由と不自由](project/04_ep.md) + * [youtube](project/01_youtube.md) +* [end](end/README.md) diff --git a/book/blender/01_model.md b/book/blender/01_model.md new file mode 100644 index 0000000..b995107 --- /dev/null +++ b/book/blender/01_model.md @@ -0,0 +1,47 @@ +# 素体を作る + +素体を作ります。できる限り現実に近い再現を目指します。これを`gender system`と呼び、わかりやすくいうとキャラクターの性器システムです。 + +今回は、Aモデル(vrm)とBモデル(部位)の統合をblenderで行います。統合したものをvrmにexportして、ueでimportします。Bモデルにはシェイプキーを設定しているので、ueではモーフターゲットとして動かせるようにします。 + +ueで動かすにはmaterialに`VRM MToon`を使うこと、`UVMap`の名前に設定すること、`vrm0`を使うこと、データ転送で`頂点`を設定することが大切です。今回使用する[addon](/blender/)は、vrmをimport, exportするaddonだけです。 + +## vroidの設定 + +素体はvroidをベースにします。つけている衣装を全部はずします。そして、パンツなどもテクスチャを削除しておくと素体の完成です。 + +## materialの設定 + +vrmをblenderで読み込みます。 + +1. Bモデルのmaterialに`VRM MToon`を設定します。ueでimportする際にcrashします。 +2. dataのUVマップに`UVMap_xxx`となっているときは名前を`UVMap`にします。色がおかしくなります。 + +## 基本的な編集(移動、削除、位置) + +1. Bモデルを正しい位置にセットします。[G], [Z], [R] +2. Aモデルを適切に切り取ります。[面を選択], [細分化], [四角形に], [面を削除] +3. シェイプキーを動かしても問題ないかの確認します。 + +![](/img/0012.png) + +## bodyに追従させる + +このままではBモデルは体に追従しません。追従させるには頂点をアーマチュア(armature)に追加します。 + +1. Bモデルのモディファイアから[データ転送], [Body(J_Bip_C_Hips)], [頂点], [頂点グループ]を選択し、[データレイヤーを生成], [適用]します。 +2. Bモデルのモディファイアでアーマチュアで[Armature]を追加します。 +3. 女性の場合はボーン(足)を調整します。なお、少し浮くようになってしまうため全体を-Zします。[G], [X], [R] + +> シェイプキーをueでも有効にするには、vrm0を使います。また、編集しているときにobjectを分離した場合は元の構成に再統合してください。 + +![](/img/0013.png) + +## gender systemについて + +例外ない限りキャラクターにはgender systemが搭載されます。アイは原作で性別がないので、例外的にgender systemから除外されています。 + +最初に実装するキャラは、仮名で`アダブ(男性)`, `イブチェ(女性)`になります。 + +[issue: ueで読み込むと一部のmaterialが正しく表示されない](/issue/blender/blender_02.html) + diff --git a/book/blender/02_costume.md b/book/blender/02_costume.md new file mode 100644 index 0000000..66d74b4 --- /dev/null +++ b/book/blender/02_costume.md @@ -0,0 +1,11 @@ +# 衣装を着せる + +衣装は体に追従しません。これを追従するようにします。 + +1. 衣装を選択した状態で、モディファイア -> データ転送、頂点を選択し、頂点グループにチェックを入れる。 +2. データレイヤーのボタンを押して頂点を生成。 +3. 最後にモディファイアのデータ転送を適用。 + +## 衣装を着せるaddon + +blenderに[kiseru](https://pielotopica.booth.pm/items/4854979)をインストールします。 diff --git a/book/blender/03_vrm.md b/book/blender/03_vrm.md new file mode 100644 index 0000000..7aee1e9 --- /dev/null +++ b/book/blender/03_vrm.md @@ -0,0 +1,49 @@ +# vrmで統合する + +`.vrm`を読み込んで、別の`.vrm`に統合する方法を紹介します。最終的にはueでも動くようにします。 + +編集しているうちにblenderのシェイプキーがueのモーフターゲットにexportできなくなったり、髪の毛のウェイトが消えていたりといったトラブルが多発します。 + +blenderのvrmはspring boneを設定して髪の毛を動かしています。これはboneに付いているcolliderと連動しています。 + +髪の毛はboneとも連動していて、armature(bone)を統合したあとにheadとheadをつなげなければなりません。 + +統合するobjectの動きを本体に追従したい場合は頂点とアーマチュアを正しく設定しなければなりません。データ転送を活用します。 + +髪の毛が動かない場合、物理シュミレーションが設定されているか確認してください。ueの`kawaiiphysics`でも設定できます。私はueのほうで設定しています。また、髪の毛のウェイトが剥がされていないか確認してください。データ転送後は髪の毛にウェイトが付いているか確認しましょう。 + +シェイプキー(モーフターゲット)が消えてしまうのは`vrm1`に起因します。blenderで編集する場合は`vrm0`をベースにしてください。また、シェイプキーは元のobject名に再統合しなければ消えてしまいます。 + +1. vrm0をベースにしているか。 +2. objectを元の状態に再統合できているか。 +3. 髪の毛にウェイトはあるか。 +4. 髪の毛に物理シュミレーションはあるか。 + +## 具体的な手順 + +hair(髪の毛)とbody(体)で分けられたvrmを読み込むこととします。これを統合します。 + +1. まず、boneの統合を行います。boneはarmatureというようです。不要なboneを削除します。そして、完成版となるarmatureを最後に選択して統合します。 +2. 次に必要なboneをつなぎます。boneを編集モードで編集し、`J_Bip_C_Head` -> `head`を選択し、右クリックで親を`オフセット維持`で設定します。 +3. 次にhairを選択し、モディファイアからデータ転送を行います。ソースに`body`, 頂点グループに`J_Bip_C_Head`を選択します。ここが特に重要です。そして、頂点データにチェックを入れ、頂点グループを選択します。最後にデータレイヤーを生成し、適用します。これでhairとbodyがつながった状態になりました。bodyが主体になります。 + +ウェイトがhair(J_Bip_C_Head)に設定されていることを確認してください。今後、hairのobjectをいじると削除される可能性があります。 + +## ueで物理シュミレーションを設定する + +1. 次にueでhairを動くようにします。ueでvrmを読み込んで、`ABP_Post_${name}`を編集します。`kawaiiphysics`でRoot Boneに`J_Sec_Hair_1_xx`を1-12まで入れて、Capsule Limitsに`chest`, `hip`などを設定します。私は`chest`の値を大きめにして対処しました。 +2. 次に、服が体に入りこまないようにしなければなりません。これも先ほどと同じように設定します。 +3. 設定後は`ABP_Post_${name}`をコピーしておきましょう。このファイルは新しくvrmを読み込むと上書きされるため、最新版を読み込んだあと再設定しやすいように。 + +blenderから読み込んだmodelを動かしてみた。 + +![](/img/0007.png) + +## blendshapeとvmc + +vmcは`.vrm`をblenderで開いたときblendshape(ブレンドシェイプ)が設定されていれば大抵動くと思います。 + +ただし、blenderで編集した際に使えなくなってしまう可能性が高いです。例えば、objectを分離した場合がそうです。最初の構成にobjectを統合すると動くようになります。 + +[issue: 髪の毛が頭に追従しなくなる事がある](/issue/blender/blender_03.html) + diff --git a/book/blender/README.md b/book/blender/README.md new file mode 100644 index 0000000..6d40e7a --- /dev/null +++ b/book/blender/README.md @@ -0,0 +1,32 @@ +# blender + +[blender](https://projects.blender.org/blender/blender)でモデルを編集して、ueで読み込みます。 + +- version: `4.5` + +```sh +# https://developer.blender.org/docs/handbook/building_blender/windows/ +$ git clone https://projects.blender.org/blender/blender.git +$ cd blender +$ make update +$ make +``` + +## addon + +|addon|body| +|---|---| +|https://github.com/saturday06/VRM-Addon-for-Blender|vrmを読み込む| + +## その他のaddon + +結局、vrmを読み込むもの以外は使いませんでした。気になったaddonを載せておきます。 + +|addon|body| +|---|---| +|https://github.com/smokejohn/SKkeeper|modifireをobjectに反映| +|https://github.com/12funkeys/rigid_bodys_gen|rigを付ける| +|https://github.com/shteeve3d/blender-wiggle-2|rigを付ける| +|https://pielotopica.booth.pm/items/4854979|衣装を着せる| + +なお、pythonを実行するのは危険も伴いますので、blender addonの実行(インストール)は最低限にしてましょう。 diff --git a/book/camera/01_close.md b/book/camera/01_close.md new file mode 100644 index 0000000..100ec59 --- /dev/null +++ b/book/camera/01_close.md @@ -0,0 +1,7 @@ +# もっと近づける + +GASPにはマウスのDown/Upのキーでカメラ操作が設定されているので、それを改造します。今回は`Style:Close`でもっと近づけるようにします。 + +例えば、`GamePlay Camera`から`Get Initial Variable Table`を`Set Camera Rig Parameters`につなげます。そして、`Close_Strafe`を選択し、`/Content/Blueprints/Camera/CameraAsset_SandboxCharacter`にある`Close_Strafe`のOffsetを公開します。公開するにはnodeを伸ばして変数を作ればokです。 + +これで`/Content/Blueprints/CBP_SandboxCharacter`から値をいれることができます。ピンを分割して、x軸に`-70.0`を入れます。 diff --git a/book/camera/README.md b/book/camera/README.md new file mode 100644 index 0000000..b5bc7d1 --- /dev/null +++ b/book/camera/README.md @@ -0,0 +1,5 @@ +# gameplay camera + +[gameplay camera](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/gameplay-camera-system) + +キャラクターブループリント(Character BP)とカメラブループリント(Camera BP)の分離(共通化)を図ります。 diff --git a/book/city/01_remove.md b/book/city/01_remove.md new file mode 100644 index 0000000..93a5b4e --- /dev/null +++ b/book/city/01_remove.md @@ -0,0 +1,25 @@ +# 惑星形式のmapを作る + +game engineのmapは基本的に平面で作られています。どこまで行っても地平線が広がっているだけで、そこから抜け出すことはできません。月や太陽があっても背面の絵を動かしているだけです。 + +これを現実に合わせた形にします。地球があって、上に飛ぶと大気圏があり、大気圏を抜けると宇宙があり、月があり、太陽があるという形にすることを目指します。全てはつながっていて、そこに行くことができます。これを`planet system`と呼ぶことにします。 + +基本的に`/Map/Small_City_LVL`を使って構築していきます。 + +## 海の境界を消す + +city sampleの海には境界があってcollisionが設定されています。邪魔になるので消します。 + +`GroundCollisionCube`,`DroneBlockingVolume`を探して削除します。 + +## ultra dynamic skyで天候と惑星を作る + +[こちら](/plan/02_uds.html) + +## ocean wavesで惑星の海を作る + +[こちら](/plan/03_ocean.html) + +## worldscape pluginを使う + +[こちら](/plan/07_wsp.html) diff --git a/book/city/02_bridge.md b/book/city/02_bridge.md new file mode 100644 index 0000000..d9718c3 --- /dev/null +++ b/book/city/02_bridge.md @@ -0,0 +1,9 @@ +# 橋を作る + +[automotive bridge scene](https://www.fab.com/ja/listings/a472df9d-9179-4743-8d41-335f9ef55546) + +1. `/Content/AutomotiveBridgeScene/Blueprints/BP_CurvedBridge`, `BP_StraightBridge`を開きます。これをつなぎ合わせていくことで橋を作ります。 +2. Lampが動きませんので、選択した上で`Static Mesh`を`city sample`に入っている`/Content/Prop/Kit_StreetLamp_C/Mesh/streetLampC`と入れ替えます。 +3. 私はベンチのところを`traversable(トラバーサブル)`するためにGASの`/Content/LevelPrototyping/LevelBlock_Traversable`を入れています。Base Materialを`/Content/Characters/Echo/Materials/M_hide`にして透明にします。 + +![](../img/0003.png) diff --git a/book/city/03_house.md b/book/city/03_house.md new file mode 100644 index 0000000..a6fa0cf --- /dev/null +++ b/book/city/03_house.md @@ -0,0 +1,9 @@ +# 家を作る + +1. [twinmotion](https://www.twinmotion.com/)をinstallして、建造物を作ります。template(テンプレート)を編集しても構いません。 +2. できたらexportしてueの$projectを選択します。`$project/${name}_Assets`が作成されます。`datasmith`の置き場所は変更しても構いません。 +3. $projectを開いて、pluginの`datasmith`を入れます。そして、`$name (Datasmith シーン)`のファイルをmapにD&Dします。 +4. すり抜け問題を解消するには作成された`mesh`を全選択して、右クリックで`アセットアクション -> プロパティマトリクスで選択内容を... -> collision complexity(use complex collision as simple...)`を選択します。 +> 私の場合はmeshが`/Content/Twinmotion/room/Geometries/`にあります。 + + diff --git a/book/city/04_bgm.md b/book/city/04_bgm.md new file mode 100644 index 0000000..cfc1c98 --- /dev/null +++ b/book/city/04_bgm.md @@ -0,0 +1,6 @@ +## 音楽を作る + +例えば、BGMの一部を変更したい場合は、`プロジェクト設定 -> ゲーム -> World Audio Data`を見てください。 + +私はmatrix(マトリックス)のテーマを消したかったので、`/Content/Audio/MetaSounds/Music/`にある`music_leavebehind_New_Mix_Meta`, `music_leavebehind_New_Mix_NHT_Meta`の音量を`0.0`にしました。 + diff --git a/book/city/05_browser.md b/book/city/05_browser.md new file mode 100644 index 0000000..f6262b2 --- /dev/null +++ b/book/city/05_browser.md @@ -0,0 +1,27 @@ +# ブラウザを作る + +1. pluginで`web browser`を有効にします。 +2. 下記のような緑背景のmaterialを作成します。 +> [https://blueprintue.com/blueprint/-49_059w/](https://blueprintue.com/blueprint/-49_059w/) +3. web browserを使ったwidgetを作成します。 +4. BP_browserに追加したwidget componentで呼び出します。collisionでcontrolします。 +> [https://blueprintue.com/blueprint/uubw_6ay/](https://blueprintue.com/blueprint/uubw_6ay/) +4. displayにくっつければ見栄えも良くなります。 +> https://www.unrealengine.com/marketplace/ja/product/twinmotion-high-tech-pack-1 + +![](/img/0014.png) + +画像はNASAの[solar system](https://eyes.nasa.gov/apps/solar-system/#/home)にアクセスしたときのもの。 + +- https://eyes.nasa.gov/apps/asteroids/#/planets/earth + +## issue: 表示されなくなったサイト + +[こちら](/issue/city/city_07.html)を見てください。 + +## webでUIやシステムを作る + +これを利用すると、webで動くUIやシステムを作成し、ゲームに取り入れることができます。 + +しかし、運用は大変だと思います。 + diff --git a/book/city/CitySample.uproject b/book/city/CitySample.uproject new file mode 100644 index 0000000..d8d52b6 --- /dev/null +++ b/book/city/CitySample.uproject @@ -0,0 +1,325 @@ +{ + "FileVersion": 3, + "EngineAssociation": "5.5", + "Category": "Samples", + "Description": "", + "Modules": [ + { + "Name": "CitySample", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine", + "AIModule", + "ChaosVehicles", + "UMG", + "MovieScene" + ] + }, + { + "Name": "CitySampleEditor", + "Type": "Editor", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] + }, + { + "Name": "CitySampleAnimGraphRuntime", + "Type": "UncookedOnly", + "LoadingPhase": "Default" + } + ], + "Plugins": [ + { + "Name": "AlembicHairImporter", + "Enabled": true + }, + { + "Name": "HairStrands", + "Enabled": true + }, + { + "Name": "PythonScriptPlugin", + "Enabled": true + }, + { + "Name": "ControlRig", + "Enabled": true + }, + { + "Name": "Takes", + "Enabled": true + }, + { + "Name": "D3DExternalGPUStatistics", + "Enabled": true, + "Optional": true, + "SupportedTargetPlatforms": [ + "Win64" + ] + }, + { + "Name": "LiveLinkCurveDebugUI", + "Enabled": true + }, + { + "Name": "ChaosVehiclesPlugin", + "Enabled": true + }, + { + "Name": "RigLogic", + "Enabled": true + }, + { + "Name": "RawInput", + "Enabled": true + }, + { + "Name": "GameplayInsights", + "Enabled": true + }, + { + "Name": "TraceSourceFilters", + "Enabled": true + }, + { + "Name": "TraceDataFilters", + "Enabled": true + }, + { + "Name": "ModelingToolsEditorMode", + "Enabled": true + }, + { + "Name": "Traffic", + "Enabled": true + }, + { + "Name": "CitySampleMassCrowd", + "Enabled": true + }, + { + "Name": "StateTree", + "Enabled": true + }, + { + "Name": "OnlineSubsystem", + "Enabled": true + }, + { + "Name": "OnlineSubsystemUtils", + "Enabled": true + }, + { + "Name": "MassAI", + "Enabled": true + }, + { + "Name": "MassCrowd", + "Enabled": true + }, + { + "Name": "MassEntity", + "Enabled": true + }, + { + "Name": "MassGameplay", + "Enabled": true + }, + { + "Name": "HoverDrone", + "Enabled": true + }, + { + "Name": "EnhancedInput", + "Enabled": true + }, + { + "Name": "Volumetrics", + "Enabled": true + }, + { + "Name": "ContextualAnimation", + "Enabled": true + }, + { + "Name": "ChaosCaching", + "Enabled": true + }, + { + "Name": "FieldSystemPlugin", + "Enabled": true + }, + { + "Name": "Paper2D", + "Enabled": true + }, + { + "Name": "WinDualShock", + "Enabled": true, + "SupportedTargetPlatforms": [ + "Win64" + ] + }, + { + "Name": "ZoneGraph", + "Enabled": true + }, + { + "Name": "AnimationWarping", + "Enabled": true + }, + { + "Name": "ElectraPlayer", + "Enabled": true + }, + { + "Name": "LiveLinkCamera", + "Enabled": true + }, + { + "Name": "AudioModulation", + "Enabled": true + }, + { + "Name": "Metasound", + "Enabled": true + }, + { + "Name": "MovieRenderPipeline", + "Enabled": true + }, + { + "Name": "Soundscape", + "Enabled": true + }, + { + "Name": "FullBodyIK", + "Enabled": true + }, + { + "Name": "RemoteControl", + "Enabled": true + }, + { + "Name": "ImagePlate", + "Enabled": true + }, + { + "Name": "LightWeightInstancesEditor", + "Enabled": true + }, + { + "Name": "GameFeatures", + "Enabled": true + }, + { + "Name": "ModularGameplay", + "Enabled": true + }, + { + "Name": "CitySampleSensorGrid", + "Enabled": true + }, + { + "Name": "IKRig", + "Enabled": true + }, + { + "Name": "ColorCorrectRegions", + "Enabled": true + }, + { + "Name": "Gauntlet", + "Enabled": true + }, + { + "Name": "CustomizableSequencerTracks", + "Enabled": true + }, + { + "Name": "NetworkPrediction", + "Enabled": true + }, + { + "Name": "NiagaraFluids", + "Enabled": true + }, + { + "Name": "Text3D", + "Enabled": true + }, + { + "Name": "MotoSynth", + "Enabled": true + }, + { + "Name": "EditorDataStorage", + "Enabled": true + }, + { + "Name": "EditorDataStorageFeatures", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "AnimToTexture", + "Enabled": true + }, + { + "Name": "SequencerScripting", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "GeometryCollectionPlugin", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "AutomatedPerfTesting", + "Enabled": true + }, + { + "Name": "LiveLink", + "Enabled": true + }, + { + "Name": "LiveLinkControlRig", + "Enabled": true + }, + { + "Name": "PoseSearch", + "Enabled": true + }, + { + "Name": "AnimationLocomotionLibrary", + "Enabled": true + }, + { + "Name": "MotionWarping", + "Enabled": true + }, + { + "Name": "Chooser", + "Enabled": true + }, + { + "Name": "Mover", + "Enabled": true + } + ], + "TargetPlatforms": [ + "PS5", + "XSX", + "Windows" + ], + "EpicSampleNameHash": "111" +} diff --git a/book/city/README.md b/book/city/README.md new file mode 100644 index 0000000..81c30b9 --- /dev/null +++ b/book/city/README.md @@ -0,0 +1,385 @@ +# city sample + +[city sample](https://www.unrealengine.com/marketplace/ja/product/city-sample) + +ニューヨーク(NY)をモデルに都市が作られています。人と自動車が動いています。自動車は乗ることや破壊することができます。 + +## game animation sampleとの統合 + +他のassetとの統合を考えるとき、city sampleをベースにします。なぜなら、city sampleは複雑すぎるためです。ここではcity sampleをinstallした上で、game animation sampleをそこにcopyします。 + +なお、`GameAnimationSample/Binaries/Win64/UnrealEditor.modules`だけはcopyしません。 + +```sh +# 以下のfileをcopy +GameAnimationSample + Binaries + Win64/UnrealEditor.modules #このfileだけはcopy(rewrite)しない + Build + Content +``` + +次に`CitySample/Binaries/Win64/UnrealEditor.modules`を編集します。 + +```json +{ + "BuildId": "xxx", + "Modules": + { + "CitySample": "UnrealEditor-CitySample.dll", + "CitySampleAnimGraphRuntime": "UnrealEditor-CitySampleAnimGraphRuntime.dll", + "CitySampleEditor": "UnrealEditor-CitySampleEditor.dll" + }, + { + "GameAnimationSample": "UnrealEditor-GameAnimationSample.dll" + } +} +``` + +これでGASPが機能すればokです。 + +他には`$project/Config`と`$project/xxx.uproject`を見比べてみましょう。必要そうなものを追記します。 + +```json +{ + "FileVersion": 3, + "EngineAssociation": "5.5", + "Category": "Samples", + "Description": "", + "Modules": [ + { + "Name": "CitySample", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine", + "AIModule", + "ChaosVehicles", + "UMG", + "MovieScene" + ] + }, + { + "Name": "CitySampleEditor", + "Type": "Editor", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] + }, + { + "Name": "CitySampleAnimGraphRuntime", + "Type": "UncookedOnly", + "LoadingPhase": "Default" + } + ], + "Plugins": [ + { + "Name": "AlembicHairImporter", + "Enabled": true + }, + { + "Name": "HairStrands", + "Enabled": true + }, + { + "Name": "PythonScriptPlugin", + "Enabled": true + }, + { + "Name": "ControlRig", + "Enabled": true + }, + { + "Name": "Takes", + "Enabled": true + }, + { + "Name": "D3DExternalGPUStatistics", + "Enabled": true, + "Optional": true, + "SupportedTargetPlatforms": [ + "Win64" + ] + }, + { + "Name": "LiveLinkCurveDebugUI", + "Enabled": true + }, + { + "Name": "ChaosVehiclesPlugin", + "Enabled": true + }, + { + "Name": "RigLogic", + "Enabled": true + }, + { + "Name": "RawInput", + "Enabled": true + }, + { + "Name": "GameplayInsights", + "Enabled": true + }, + { + "Name": "TraceSourceFilters", + "Enabled": true + }, + { + "Name": "TraceDataFilters", + "Enabled": true + }, + { + "Name": "ModelingToolsEditorMode", + "Enabled": true + }, + { + "Name": "Traffic", + "Enabled": true + }, + { + "Name": "CitySampleMassCrowd", + "Enabled": true + }, + { + "Name": "StateTree", + "Enabled": true + }, + { + "Name": "OnlineSubsystem", + "Enabled": true + }, + { + "Name": "OnlineSubsystemUtils", + "Enabled": true + }, + { + "Name": "MassAI", + "Enabled": true + }, + { + "Name": "MassCrowd", + "Enabled": true + }, + { + "Name": "MassEntity", + "Enabled": true + }, + { + "Name": "MassGameplay", + "Enabled": true + }, + { + "Name": "HoverDrone", + "Enabled": true + }, + { + "Name": "EnhancedInput", + "Enabled": true + }, + { + "Name": "Volumetrics", + "Enabled": true + }, + { + "Name": "ContextualAnimation", + "Enabled": true + }, + { + "Name": "ChaosCaching", + "Enabled": true + }, + { + "Name": "FieldSystemPlugin", + "Enabled": true + }, + { + "Name": "Paper2D", + "Enabled": true + }, + { + "Name": "WinDualShock", + "Enabled": true, + "SupportedTargetPlatforms": [ + "Win64" + ] + }, + { + "Name": "ZoneGraph", + "Enabled": true + }, + { + "Name": "AnimationWarping", + "Enabled": true + }, + { + "Name": "ElectraPlayer", + "Enabled": true + }, + { + "Name": "LiveLinkCamera", + "Enabled": true + }, + { + "Name": "AudioModulation", + "Enabled": true + }, + { + "Name": "Metasound", + "Enabled": true + }, + { + "Name": "MovieRenderPipeline", + "Enabled": true + }, + { + "Name": "Soundscape", + "Enabled": true + }, + { + "Name": "FullBodyIK", + "Enabled": true + }, + { + "Name": "RemoteControl", + "Enabled": true + }, + { + "Name": "ImagePlate", + "Enabled": true + }, + { + "Name": "LightWeightInstancesEditor", + "Enabled": true + }, + { + "Name": "GameFeatures", + "Enabled": true + }, + { + "Name": "ModularGameplay", + "Enabled": true + }, + { + "Name": "CitySampleSensorGrid", + "Enabled": true + }, + { + "Name": "IKRig", + "Enabled": true + }, + { + "Name": "ColorCorrectRegions", + "Enabled": true + }, + { + "Name": "Gauntlet", + "Enabled": true + }, + { + "Name": "CustomizableSequencerTracks", + "Enabled": true + }, + { + "Name": "NetworkPrediction", + "Enabled": true + }, + { + "Name": "NiagaraFluids", + "Enabled": true + }, + { + "Name": "Text3D", + "Enabled": true + }, + { + "Name": "MotoSynth", + "Enabled": true + }, + { + "Name": "EditorDataStorage", + "Enabled": true + }, + { + "Name": "EditorDataStorageFeatures", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "AnimToTexture", + "Enabled": true + }, + { + "Name": "SequencerScripting", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "GeometryCollectionPlugin", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "AutomatedPerfTesting", + "Enabled": true + }, + { + "Name": "LiveLink", + "Enabled": true + }, + { + "Name": "LiveLinkControlRig", + "Enabled": true + }, + { + "Name": "PoseSearch", + "Enabled": true + }, + { + "Name": "AnimationLocomotionLibrary", + "Enabled": true + }, + { + "Name": "MotionWarping", + "Enabled": true + }, + { + "Name": "Chooser", + "Enabled": true + }, + { + "Name": "Mover", + "Enabled": true + } + ], + "TargetPlatforms": [ + "PS5", + "XSX", + "Windows" + ] +} +``` + +また、`/Config/DefaultEngine.ini`に注意してください。 + +```sh +[/Script/Engine.CollisionProfile] ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel11,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Traversable") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel12,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="EnemyProjectile") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel13,DefaultResponse=ECR_Block,bTraceType=True,bStaticObject=False,Name="BulletHell") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel14,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="LookAtTrace") +``` + +`Collision Trace Channel`は作り直さなければ機能しないことがあります。 + +### 問題の数々 + +問題の数々は[こちら](/issue/)でまとめています。 + diff --git a/book/cover.jpg b/book/cover.jpg new file mode 100644 index 0000000..b713c7a Binary files /dev/null and b/book/cover.jpg differ diff --git a/book/cover_b.jpg b/book/cover_b.jpg new file mode 100644 index 0000000..7af40c5 Binary files /dev/null and b/book/cover_b.jpg differ diff --git a/book/crs/01_character.md b/book/crs/01_character.md new file mode 100644 index 0000000..b44387a --- /dev/null +++ b/book/crs/01_character.md @@ -0,0 +1,21 @@ +# CRでキャラクターを動かす + +`control rig`は`CR_xxx`というファイル名がつけられています。 + +## dragon + +例えば、ABPで`head_global_ctrl`の値を更新します。 + + + +## mech + +1. `/Content/ControlRig/Characters/Mech/Meshes/SKM_Mech`からABP, BP, SM(StaticMesh)を作成します。 +2. ABPから`Control Rig`で`cannon_ctrl`などを動かせます。 + +```sh +- /Content/ControlRig/Characters/Mech/BP_Mech +- /Content/ControlRig/Characters/Mech/ABP_Mech +- /Content/ControlRig/Characters/Mech/Meshes/SM_Mech +``` + diff --git a/book/crs/02_boss.md b/book/crs/02_boss.md new file mode 100644 index 0000000..28b40e0 --- /dev/null +++ b/book/crs/02_boss.md @@ -0,0 +1,91 @@ +# ボスを作る + +敵(enemy)やボス(boss)には必要なものが多いです。動きや攻撃パターン、エフェクト、ステータスやドロップアイテム、ゲージ表示、BGMなどが必要になります。場合によっては演出も必要です。 + + + +bossは`/Content/ControlRig/Characters/Mech`を元に作ります。 + +## 注意 + +ここからはbattle systemのassetを購入したほうがいいかもしれません。できれば評価が高くsale中のものを選びましょう。ほとんどこれ一つでゲームが作れてしまうので、多くの開発者はこのジャンルのassetを改造してゲームを作っています。スタイリッシュアクションの動きを見るとわかります。 + +https://www.fab.com/category/game-template/rpg + +## 動きを作る + +まずABPを作成し、基本的なAnimGraphを作成します。 + +projectにはsampleのABPがあるはずですからAnimGraphに`idle`, `jump`, `run`などが揃っているをcopyします。 + +[![](../img/0004.png)](../img/0004.png) + +ここでは`AnimGraph -> Locomotion -> Idle`を編集します。 + +動きはABPの`Look At`が使えます。boneを指定するとPlayerに追従します。 + +`[Mech_Idle] --> [Look At](Bone to Modify:cannon_01) --> Output Animation Pose` + +[![](../img/0006.png)](../img/0006.png) + +## 攻撃を作る + +私は最初に購入したassetの[space frontier stations & ships](https://docs.google.com/document/d/1p5MY13cpTlVtqP7sCQpAoE_k5VHklmndZ4cHeBy105Y/edit?tab=t.0#heading=h.nx19nrsdk37u)を使いました。なお、購入はおすすめしません。長いので以降は`space station`とします。 + +ここからはassetの解説になります。しかし、基本的な考え方については変わりません。まずは考え方を紹介します。 + +1. ターゲットをロック +2. ダメージ処理 + +ターゲット(target)をロック(lock)できるようなシステムは大抵、攻撃頻度やダメージ、コリジョンなど基本設定ができるようになっています。`epic games`が提供するassetや無料のassetでも同じです。そういった物を見つけてbossのBPに組み込みます。 + +ただし、ダメージ処理、例えば、HP管理や倒された時の処理は自分で書く必要があるかもしれません。 + +### 最初に触ったassetが影響を与える + +ここからは少し昔の話をします。基本的には読み飛ばしてください。 + +私はueで最初に触り始めたのがこのasset(space station)でした。当時は何もわからずに手探りで自分のモデルを表示して遊んでいました。宇宙空間に自分のモデルを表示したときは本当に嬉しくて感動しました。 + +当時は`superhero flight animations`という空を飛ぶためassetも購入して同時に使っていましたが、今でもその影響は残っています。 + +その人のゲーム作りは最初に触ったassetが強く影響を与えるのだと思います。これはgame engineも同じです。 + +### space stationの基本構造 + +1. `/Content/SpaceStation/Blueprints/Weapons`で各武器のタイプを選べます。ここでは`BP_TurretGatling`を開きます。 +2. `/Content/SpaceStation/Blueprints/Weapons/BP_TurretGatling(Self)`の詳細から`Weapon -> Shooting Delay:1`にして`Turret -> Turret Aiming Speed:150`にします。これは発射速度とターゲットに合わせる速度の設定です。 +3. `/Content/SpaceStation/Blueprints/Weapons/Parent/DT_WeaponTypes`を開きます。ここで弾丸の音(sound)やエフェクト(effect)を設定します。 +4. 最後に`/Content/Blueprints/CBP_SandboxCharacter(Self)`の詳細で`actor(アクタ) -> Tags[0] -> Allow Shooting`, `Tags[1] -> ShootingTarget`を追加します。これでPlayerがターゲットにロックされるようになります。 +5. あとは`/Content/SpaceStation/Blueprints/Weapons/BP_TurretGatling`をmapに置いてください。 + +### ダメージ処理 + +damage(ダメージ)の処理を書きます。 + +`/Content/Blueprints/CBP_SandboxCharacter`で`Event Any Damage`を追加します。これでdamageを受けますが、hpを用意してそれが0になったときゲームオーバー(gameover)する処理を書いたりします。 + + + +これはGame Ability System(GAS)を使うと便利です。 + +https://dev.epicgames.com/documentation/ja-jp/unreal-engine/gameplay-ability-system-for-unreal-engine + +## HPゲージの表示 + +`widget`で`ProgressBar`を作ります。まず`BP_Mech`にbox collisionを入れて、そこに入ると`boss active`になります。`true`ならwidgetを表示する仕組みです。 + +ProgressBarは`0.0 -> 1.0`なので注意してください。`HP_Current`から`HP_Max`を割り算します。 + + + +## 撃破処理 + +bossを撃破するまでの処理を書きます。 + +damageを受けて0になると消滅し、ドロップアイテムを落とします。消滅時はniagaraでeffectを再生します。damageを受けたときも同じです。 + +ドロップアイテムは`nice interaction system`というassetを使用しています。これは`E`を押すとアイテム(item)が取得できるものです。 + + + diff --git a/book/crs/03_jump.md b/book/crs/03_jump.md new file mode 100644 index 0000000..613d4d6 --- /dev/null +++ b/book/crs/03_jump.md @@ -0,0 +1,8 @@ +# ボスのジャンプ攻撃を作る + +1. control rig(CR_Mech)をlevelに配置し、シーケンサからrigを動かしながらanimを作ります。時間ごとにboneの例えば、`base_ctrl`を動かして、`+`を押していきます。 +2. 作ろ終わったらsk meshである`CR_Mech`を右クリックで`アニメーションシーケンスをベイク`します。 +3. 保存されたanim sequenceを開いて通知などを追加します。攻撃時のみcollisionを有効にする必要があるからです。 +4. 通知から受け取る情報でcollisonをenable/disableにします。 + + diff --git a/book/crs/README.md b/book/crs/README.md new file mode 100644 index 0000000..c3726d9 --- /dev/null +++ b/book/crs/README.md @@ -0,0 +1,6 @@ +# control rig sample + +[control rig sample](https://www.fab.com/ja/listings/2ce3fe44-9ee6-4fa7-99fc-b9424a402386) + +`control rig sample`では人間以外のcharacterを動かすことができます。 + diff --git a/book/default/00_asset.md b/book/default/00_asset.md new file mode 100644 index 0000000..7b63fb6 --- /dev/null +++ b/book/default/00_asset.md @@ -0,0 +1,54 @@ +# asset/plugin + +現在使用しているplugin(プラグイン)やasset(アセット)の`version(バージョン)`を記述します。 + +ゲームは無料のassetだけでも作れます。しかし、時間やクオリティを向上させたい場合は有料のassetを使いましょう。 + +本書の一部では有料assetの使い方を解説します。[sale](https://www.fab.com/ja/channels/unreal-engine?ui_filter_price=1&ui_filter_is_discounted=1&is_discounted=1)中のものを探しましょう。 + +## asset + +|name|latest|body| +|---|---|---| +|[game animation sample](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-animation-sample-project-in-unreal-engine)|5.5|キャラクターをパルクールアクション| +|[city sample](https://www.unrealengine.com/marketplace/ja/product/city-sample)|5.5|大規模な都市を構築| +|[control rig sample](https://www.fab.com/ja/listings/2ce3fe44-9ee6-4fa7-99fc-b9424a402386)|5.5|人間以外のキャラクター| +|[content examples](https://www.fab.com/ja/listings/4d251261-d98c-48e2-baee-8f4e47c67091)|5.5|機能別サンプル| + +## plugin + +|name|latest|body| +|---|---|---| +|[pixel streaming](https://github.com/EpicGamesExt/PixelStreamingInfrastructure/blob/master/Docs/pixel-streaming-2-migration-guide.md)|2|ゲームをserverにdeployしてwebからプレイ| +|[twinmotion](https://www.twinmotion.com/ja)|20250101p|建造物をインポート| +|[vrm4u](https://github.com/ruyo/VRM4U/releases/tag/20250206)|20250206|vrmモデルを動かす| +|[kawaiiphysics](https://github.com/pafuhana1213/KawaiiPhysics)|20241201|揺れものを設定| +|[varest](https://github.com/ufna/VaRest)|20240828|curlのようなもの。supportが終了しているのでbuildが必要| +|[tatools](https://www.fab.com/ja/listings/a5d3b60d-b886-4564-bf6d-15d46a8d27fe)|20241206|animを作る| +|[ui navigation 3.0](https://www.fab.com/ja/listings/a91f6e67-5c2d-46ef-926d-00a35525579c)|20250126|スタート画面を作る| +|[dlss](https://developer.nvidia.com/rtx/dlss/get-started#ue-version)|20250301|nvidiaの描写速度| + +## その他のasset + +ここからは無料のassetでおすすめのものを紹介します。使っていないものもあります。 + +|name|body| +|---|---| +|[twinmotion-high-tech-pack-1](https://www.unrealengine.com/marketplace/ja/product/twinmotion-high-tech-pack-1)|家電製品| +|[automotive bridge scene](https://www.fab.com/ja/listings/a472df9d-9179-4743-8d41-335f9ef55546)|道路や橋| +|[animal variety pack](https://www.fab.com/ja/listings/2dd7964c-a601-4264-a53d-465dcae1644c)|有名な動物モデル| +|[quadruped fantasy creatures](https://www.fab.com/ja/listings/52d686b6-1180-4f26-901f-ce3c69a14767)|有名な幻獣モデル| +|[ueplugin-accessvariablebyname](https://github.com/colory-games/UEPlugin-AccessVariableByName)|名前を取得するplugin| +|[GASP-ALS](https://github.com/PolygonHive/GASP-ALS)|GASPの改造版| + +## 有料のasset + +[こちら](/plan/README.md) + +## link + +こちらで最新情報を取り扱っています。 + +- https://git.syui.ai/ai/ue/ +- https://blueprintue.com/profile/ai/ +- https://dev.epicgames.com/community/profile/organization/gdkg/ai/ diff --git a/book/default/01_start.md b/book/default/01_start.md new file mode 100644 index 0000000..a9437bf --- /dev/null +++ b/book/default/01_start.md @@ -0,0 +1,103 @@ +# start + +## ueとは + +`Unreal Engine`は`epic games`という会社が作っているゲームエンジンです。よく`ue`と略されます。 + +最新バージョン(latest version)は`5`なので、`ue5`となります。 + +`ue`の他には`unity`, `godto`が有名です。`DirectX`というものがあり、例えば、`DX12`からGPUに命令を送ることができます。ゲームエンジンの多くは`DX11`, `DX12`を使用します。 + +|name|url| +|---|---| +|unreal engine|https://unrealengine.com/| +|unity|https://unity.com/| +|godto|https://godotengine.org/| + +ソース(source)からビルド(build)して使うこともできます。一部でbuildしないと使えない機能があります。private repoなので[こちら](https://www.unrealengine.com/ja/ue-on-github)からアクセス権をもらいます。 + +- https://github.com/EpicGames/UnrealEngine + +## ueの特徴と注意 + +`c++`か`blueprint`で書きます。 + +ueの特徴はグラフィックが綺麗なことです。と言ってもきれいなグラフィックはunityなどでも実現可能です。しかし、ueは初期設定でもそれが実現できるので、主にグラフィック用途で使用されています。 + +ueはバグ(bug)が多く基本的に動きません。これはアップデート(update)が速く、3Dを扱うソフトウェア(software)なので仕方ありません。複雑なのです。 + +ueを長く使っているとわかることですが、ゲーム制作にはあまり向きません。unityのほうがおすすめです。ueはきれいな画像やシーンを作る用途におすすめです。 + +「ueはバグが多く基本的に壊れている」このことを最初に理解しておかないと「おかしいなあ」と時間を無駄にしてしまいます。また、保存せず長時間コードを書き続けるのは危険です。クラッシュ(crash)すると消えてしまいます。プロジェクト(project)そのものが壊れることもよくあります。注意しましょう。 + +そして、バグにぶつかっても情報がほとんどなく、自己解決するしかありません。情報量は非常に少ないと言えます。 + +- グラフィックがきれい +- バグが多い +- 情報が少ない + +## unityやblenderも使っている + +私はキャラクター(character)を[vroid](https://vroid.com/studio)で作っています。 + +そして、`.vrm`の開発は主に[unity](/unity/)が中心です。なぜなら`.vrm`の仕様を作っているpixivがunityで読み込むための[plugin](https://github.com/vrm-c/UniVRM)を開発しているからです。そのためかvrmに対応する多くのツールはunity専用です。 + +もし`.vrm`を扱う場合は、どちらにせよ`unity`を使うことになると思います。私もモデルのカスタマイズなどでunityを使っています。 + +また、モデリングには[blender](/blender)を使用しています。 + +つまり、本当にueでゲームを制作すべきかはよく考えなければいけません。ゲーム開発は使用するツールが少ないほど安定します。 + +結局、unityやblenderを使うことになるなら、unityで開発するのがオススメです。情報量、安定性、ツールの豊富さなどからそう判断します。 + +```diff ++ [vroid] --> [vrm] --> [blender] --> [unity] +- [vroid] --> [vrm] --> [blender] --> [unity] --> [ue] +``` + +## ueを使う理由 + +私がueを使う理由は、最初にゲーム開発を始めたとき使ったものがueだったからです。その時の感動は忘れません。 + +その後、色々な情報を見聞きし、ueは初心者に向かないことを知りました。また、vrmを使う場合はunityのほうが圧倒的に有利で、情報も多く、ツールも豊富です。 + +では、なぜueを使い続けているのでしょう。 + +それはueの将来に期待しているからです。 + +確かに、現時点でueはおすすめできない。でも将来は...? + +未来のことはわかりません。バグが多いueですが、アップデートも速いので、それは変化も進化も速いということ。 + +失敗を恐れず最新の技術を試していきましょう。 + +## 用語の解説 + +|title|short|body| +|---|---|---| +|unrealengine|ue|アンリアルエンジン| +|version|ver|バージョン| +|code||コード、プログラミング言語で書かれた文章| +|build||ビルド、osで実行できる形式にすること。windowsなら`.exe`| +|compile||コンパイル、コンピュータで実行できる形式にすること。buildと同じ意味で使われる| +|source|src|ソース、主にソースコードの略| +|server||サーバー、リクエストに応じるコンピュータ| +|deploy||serverに実行ファイルを置くこと| +|example|ex|例、uriではexample.comが有名| +|install||インストール、アプリをインストールすること| +|application|app|アプリ、ソフトウェア(software)のこと| +|library|lib|ライブラリ、softwareを構築するための部品| +|package|pkg|パッケージ、appだったり、libだったり色々。基本的にpkg managerでinstallできるものを指す| +|update|up|アップデート、5.5.3の`x.x.3`の部分を言う ex: 5.5.2 -> 5.5.3| +|upgrade||アップグレード、5.5の`x.5`の部分を言う ex: 5.4 -> 5.5| +|asset||アセット、ueでは購入できるlibやexampleを指す| +|plugin|plug|プラグイン、エンジンに直接入れる追加機能。新たなblueprintなどを使えるようになる| +|crash||クラッシュ、アプリやosが落ちること| +|cache||キャッシュ、一時ファイルのこと。tmpなども使われる| +|repository|repo|リポジトリ、主にsrc codeの一式が置いてある場所| +|project||プロジェクト、ueでは主に新しいゲームを作った時のフォルダ一式| +|blueprint|bp|ブループリント、ueのノードベースで書く形式。anim blueprintはabp、character blueprintはcbpと略される事が多く、ファイル名は`BP_XXX`, `ABP_XXX`, `CBP_XXX`となる。基本大文字が使われる| +|variable|var|変数、一時的な値の保存場所| +|support||サポート| + +基本的に英語で書けるものは英語で書きます。ueのmenuは英語にするのがおすすめです。様々な単語に慣れておきましょう。 diff --git a/book/default/02_install.md b/book/default/02_install.md new file mode 100644 index 0000000..b82f9ff --- /dev/null +++ b/book/default/02_install.md @@ -0,0 +1,53 @@ +# install + +srcからbuildしない場合は`epicgames launcher`からinstallします。 + +https://www.unrealengine.com/download + +また、[vsinstaller](https://visualstudio.microsoft.com/ja/downloads/)を使用して必要なpackageを入れてください。 + +![](../img/0001.png) + +[vscode](https://github.com/microsoft/vscode)でbuildするには`.uproject`を右クリックして`.sln`を作ります。 + +## package build + +まずは新しいprojectを作り、package buildできるかを試してみましょう。 + +ueではbuildが通らないことがよくあります。長い時間をかけて作り上げたもののbuildが通らない事態は避けましょう。 + +なお、`mac`, `linux`は、ほとんどうまくいきません。package化に成功してもappが正常に起動しないことがあります。使用するpluginやassetなども影響します。 + +```sh +# corss compile tool : https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-requirements-for-unreal-engine +# ubuntu(xorg + nvidia) + +$ sudo apt-get install xorg xvfb +Xvfb :99 & +export DISPLAY=:99 + +$ sudo apt-get install vulkan-tools +$ sudo apt-get install mesa-vulkan-drivers +``` + +## engineとproject + +installする場所は自分で決められます。参考の場所を紹介します。 + +```sh +# engine +C:\Program Files\Epic\UE_5.5\Engine\Binaries\Win64\UnrealEditor.exe + +# project +C:\Users\$USER\Documents\Unreal Projects\MyProject\MyProject.uproject +``` + +## windows tool + +|name|url| +|---|---| +|pwsh|https://github.com/PowerShell/PowerShell| +|windows terminal|https://github.com/microsoft/terminal| +|openssh|https://github.com/PowerShell/Win32-OpenSSH| +|vscode|https://github.com/microsoft/vscode| + diff --git a/book/default/03_tips.md b/book/default/03_tips.md new file mode 100644 index 0000000..39d5f7b --- /dev/null +++ b/book/default/03_tips.md @@ -0,0 +1,91 @@ +# tips + +この章は読み飛ばしてください。まとめやすいように重要項目を上にしています。 + +最初はわからないかもしれませんが、最後まで読んでまた来ると、わかるようになっているかもしれません。 + +## variable(var) + +まずは変数の紹介です。変数はローカル変数(local)、グローバル変数(global)があります。最初はprojectで読み込むところに作ります。 + +1. フォルダの`/Content/Blueprints/`で右クリックして、ブループリントクラス、`GameInstance`を作ります。例えば、`GM_xxx`にします。(名前はなんでもいいです) +2. `設定 -> プロジェクト設定 -> マップ&モード`の`Game Instance:GameInstance Class`に`GM_xxx`を読み込みます。 + +なお、名前に`Default`, `Test`, `Config`などを使う場合は予約されていることがあります。注意してください。 + +これを開いて、変数のところで`UserTest`という名前で`string`型の変数を作ります。コンパイル(compile)してください。デフォルト値は`World`とでも入れておきましょう。 + +次に、`/Content/Blueprints/CBP_SandboxCharacter`を開いて、EventGraphで右クリックし、`Cast To GM_xxx`を選択します。 + +インプット(input)のpin(ピン)にあるObjectには`Get Game Instance`をつなぎます。そして、アウトプット(output)の青線は`Get UserTest`と検索し、それを`Print String`につなぎます。 + +さて、ここにkeyを設定して再生すると`World`と表示されるはずです。 + +特に重要なのが`変数の型`です。種類もそうですが、変数の型の右側にある色アイコンをクリックしてみると、たくさんの形式があることがわかります。 + +- 単一 +- 配列 +- 設定 +- マップ + +配列を使ってみましょう。`UserTestList`という名前で`string`の配列を作成します。 + +ここで、デフォルト値に追加できることに気づくはずです。 + +例えば、単語を3つ追加してみます。 + +- [0]ai +- [1]burst +- [2]can + +`Cast To GM_xxx`から`Get UserTestList`を引っ張り出し、`Length`につなげます。それをprintしてみると、`2`と表示されるはずです。 + +`length(len)`はその配列に追加された数を知ることができます。 + +では、全部の値を取り出すため`for`を書きましょう。`UserTestList`から`For Each Loop`を伸ばして`Loop Body`からprintにつなぎます。値は`Array Element`から取ります。 + +もし文字列をつなぎたいなら`Append`が使えます。 + +変数にはObjectをいれることもできます。たくさんのObjectを入れておき、`Find`で検索して取り出すこともできます。 + +では、characterを全部まとめて検索できる変数を作ってみます。 + +名前は`UserCharacterObj`でstringを選択し、マップを選択します。右側のマップは`オブジェクト(object)`と検索し、object参照を選択します。 + +```sh +str obj +--- --- +``` + +`cbp character`と検索し、characterのcbpを入れていきます。名前はわかりやすいものにしてください。例えば、`manny`, `quinn`など。 + +では繋いでいきます。 + +```sh +[Get Game Instance] --> [Cast To GM_Defaultconfig] --> [UserCharacterObj] + +--> [Find(manny)] --> [Get Object Name] --> [Print String] +``` + + + +基本的にこれを利用して、他のBPと値をやり取りすることになります。例えば、`ABP_SandboxCharacter`で条件を満たしたとき実行してほしいアニメーション(anim)があったとします。 + +この場合、まず`GM_xxx`の変数で`UserCharacterAnim`をboolean型で作り、実行してほしいタイミングで`CBP_SandboxCharacter`に書いた`Cast To GM_Defaultconfig`から`UserCharacterAnim`を`true`に変更します。`Set UserCharacterAnim`で検索してください。そして、ABPには`UserCharacterAnim`がtrueならanimを再生する処理を書きます。 + +## function(func) + +次は関数です。関数は簡単で、何度も繰り返す部分を再利用可能な形で残します。それが関数です。 + +新しい関数を作ってみましょう。左バーの関数(+)を押せば作成されます。名前は`FuncTest`にします。 + +関数を表す紫色のボックス(box)を選択した状態でinputとoutputの見てもらって、inputにboolという名前でboolean型を作ります。outputにはstrという名前でstring型を作ります。 + +処理の内容はboolがtrueなら`[yes]`というstringを出力し、falseなら`[no]`にします。 + + + +確認してみましょう。`[9]`を押すと`[yes][no]`が表示されます。 + + + diff --git a/book/default/README.md b/book/default/README.md new file mode 100644 index 0000000..6a0c038 --- /dev/null +++ b/book/default/README.md @@ -0,0 +1,48 @@ +# default + +## 本書の目的 + +ue5でゲームを作成するまでの過程をまとめます。 + +主に`example`形式で記述し、実行するとその通りの結果になることを目指します。 + +|name|latest|body| +|---|---|---| +|[unreal engine](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-5.5-release-notes)|5.5.3|ゲームエンジン| + +## パソコンのスペック + +開発するゲームによりますが、GPUはnvidiaの`RTX 4060Ti`を使っています。特に不満はありません。 + +作りたいゲームによってはGPUは不要です。オープンワールドを作るならGPUはあったほうがいいと思います。 + +多くの場合、ue5のバグのほうが問題で、GPUの性能をほとんど引き出せていないことのほうが問題です。スペックはあまり関係なかったりします。 + +ただし、ストレージの読み書き速度は重要です。ueやprojectを入れるストレージには注意してください。 + +## 便利なサイト + +|name|body| +|---|---| +|[dev.epicgames.com](https://dev.epicgames.com/community/)|開発者コミュニティ| +|[perplexity.ai](https://www.perplexity.ai/)|検索エンジン| +|[suno.com](https://suno.com/)|作曲| +|[vroid.com](https://vroid.com/studio/)|3Dモデル| + +## 使用するタグ + +### youtube + +`https://www.youtube.com/embed/${id}?start=0&end=10&mute=1&rel=0&showinfo=0&controls=0` + +```html + +``` + +### blueprint + +`https://blueprintue.com/render/${id}/${n}` + +```html + +``` diff --git a/book/end/README.md b/book/end/README.md new file mode 100644 index 0000000..0d5e9c3 --- /dev/null +++ b/book/end/README.md @@ -0,0 +1,2 @@ +![](../cover_b.jpg) + diff --git a/book/gasp/01_character.md b/book/gasp/01_character.md new file mode 100644 index 0000000..1873ee0 --- /dev/null +++ b/book/gasp/01_character.md @@ -0,0 +1,11 @@ +# キャラクターを追加する + +これには`IKリターゲット`が必要です。 + +1. `Content/Blueprints/CBP_SandboxCharacter_Manny`をcopyして`CBP_SandboxCharacter_test`を作ります。 +2. `CBP_SandboxCharacter_test`を開いて、`Mesh`の下にあるSKM(スケルタルメッシュ)の`Manny`を選択します。その状態で`詳細(details) -> タグ(tags) -> Component Tags`から`index[0]`を`RTG_UEFN_to_UE5_test`に書き換えます。 +3. `Content/Blueprints/RetargetedCharacters/ABP_GenericRetarget`を開き、変数の`IKRetargeter_Map`に新しく`RTG_UEFN_to_UE5_test`を追加し、ファイルは`/Content/Characters/UE5_Mannequins/Rigs/RTG_UEFN_to_UE5_Mannequin`を参照します。 +4. `/Content/Widgets/GameAnimationWidget`を開いて、characterのiconのところをcopyして貼り付けます。そして、詳細からObjectで `Content/Blueprints/CBP_SandboxCharacter_test`を参照します。 + +これで新しいキャラを使用することが可能になります。 + diff --git a/book/gasp/02_jump.md b/book/gasp/02_jump.md new file mode 100644 index 0000000..5bfea7f --- /dev/null +++ b/book/gasp/02_jump.md @@ -0,0 +1,12 @@ +# 飛びつける高さを増やす + +1. `Content/Blueprints/CBP_SandboxCharacter`を開いて、関数の`TryTraversalAction`を編集します。 +2. 一番下の`Max:275`を`Max:475`に変更します。 +3. `/Content/Characters/UEFN_Mannequin/Animations/Traversal/CHT_TraversalAnims`を開きます。 +4. `Mantles(編集)`から先程変更した値のところを全部`275 -> 475`に書き換えます。 + +例えば、levelにあるblockの高さを変更して飛びつけるか確認します。 + +1. `LevelBlock_TraversableXX`を選択します。 +2. トランスフォーム(transform)の拡大(scale)のところで青色(transform-scale-z)を`4.5`にします。 + diff --git a/book/gasp/03_vrm.md b/book/gasp/03_vrm.md new file mode 100644 index 0000000..9759c15 --- /dev/null +++ b/book/gasp/03_vrm.md @@ -0,0 +1,4 @@ +# キャラクターを作る + +[こちら](/vrm4u/01_make.html)のページで解説します。 + diff --git a/book/gasp/04_vmc.md b/book/gasp/04_vmc.md new file mode 100644 index 0000000..f22f254 --- /dev/null +++ b/book/gasp/04_vmc.md @@ -0,0 +1,62 @@ +# モーションキャプチャで動かす + +カメラ(camera)からcharacterを動かす技術をモーションキャプチャ(motion capture)といいます。様々なprotocol(プロトコル)がありますが、`vrm4u`では[vmc](https://qiita.com/mintan/items/72d63cce4e6197b151b7)というprotocolを使います。 + +`epic games`は[livelink](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/live-link-in-unreal-engine)というものを作っています。 + +必要なものは多く、基本的には`web-camera`、`client-app`, `ue-plugin`が必要です。私は以下を使っています。 + +- camera: ノートパソコンに付属しているwebカメラ +- client: [webcam motion capture](https://webcammotioncapture.info/) +- plugin: [vrm4u](https://github.com/ruyo/VRM4U) + +clientはそれぞれのosにあったものを選びます。無料でも可能ですが、性能的には有料アプリがおすすめです。いくつか紹介しておきます。 + +この辺の情報は最初はわからないと思いますが、基本的には以下の流れで情報を処理します。 + +```sh +[camera] --> [client] --> [plugin] +``` + +## client + +|name|body|free| +|---|---|---| +|[vmc](https://github.com/sh-akira/VirtualMotionCapture)|vmcの開発元が出しているclient。protocolと同じ名前がつけられている|🟩| +|[vseeface](https://www.vseeface.icu/)|高性能なclient|🟩| +|[xr animator](https://booth.pm/ja/items/4513654)|お手軽に表示できるclient|🟩| +|[waidayo](https://booth.pm/ja/items/1779185)|iosにも対応しているclient|🟩| +|[vrm posing desktop](https://store.steampowered.com/app/1895630/VRM_Posing_Desktop/)|steamから出ているclient|🟥| +|[webcam motion capture](https://webcammotioncapture.info/)|安定したclient。使ってみた中では動きが一番良かった|🟥| + +## build packageを使うときportに注意 + +clientから送信されるportをpluginで受信します。build packageの`.exe`で確認するときは、editor(エディタ)を落としておきましょう。 + +## 停止したときだけvmcを有効にする + + + +キャラクターがidle状態、つまり、停止しているときだけVMCのモーションキャプチャを反映させます。 +これはVMCモードの変数を用意し、ABPで条件を書いて実現しています。キャラクターを動かしたときは一時的に無効にします。 + +関数を作り、bool型でグローバル変数で作ります。それをVMCモードの`enable/disable`とします。カメラは正面と通常を切り替えています。 + +```sh +/Content/Blueprints/CBP_SandboxCharacter +``` + + + +移動するときは一時的に無効にします。移動が完了すると有効にします。GASの移動は終了後に少し滑るので`delay`を入れています。 + + + +```sh +/Content/Chracters/$model/ABP_Pose_$model +``` + +`Blend Poses by bool`を使います。`[Mesh Space RefPose] --> [VrmVMC] --> [Blend Poses by bool(true)]` + + + diff --git a/book/gasp/05_kawaii.md b/book/gasp/05_kawaii.md new file mode 100644 index 0000000..5f72953 --- /dev/null +++ b/book/gasp/05_kawaii.md @@ -0,0 +1,14 @@ +# 揺れものを設定する + +[kawaiiphysics](https://github.com/pafuhana1213/kawaiiphysics) + +`$project/Plugins/kawaiiPhysics/kawaiiPhysics.uplugin` + +1. 基本的には`/Content/Characters/$model/ABP_Pose_$model`に設定します。 +2. 外付けの服などに設定する場合はABPを作成し、そこに設定します。 + + + +服が揺れる様子です。`limit(制限) -> Capsule Limits -> Driving Bone`にBone(ボーン)を入れて体に入りこまないようにしています。 + + diff --git a/book/gasp/06_camera.md b/book/gasp/06_camera.md new file mode 100644 index 0000000..5c62898 --- /dev/null +++ b/book/gasp/06_camera.md @@ -0,0 +1,15 @@ +# カメラワークを設定する + +スキル発動したときカメラをぐるっと回す演出です。 +正面カメラを設置し、タイムラインで動かしたあとに通常(後方)カメラに切り替えることで実現しています。 + + + + +```sh +/Content/Blueprints/CBP_SandboxCharacter +``` + + + +ボス戦のときだけこの演出を実行します。なお、`true`, `false`はどちらも最終的に`skill(スキル)`の実行につながるようにしてください。 diff --git a/book/gasp/07_anim.md b/book/gasp/07_anim.md new file mode 100644 index 0000000..173a354 --- /dev/null +++ b/book/gasp/07_anim.md @@ -0,0 +1,27 @@ +# アニメーションを作成する + +control rigからも作成できます。しかし、購入したものを使うのが一番です。 + +[magicalanimset](https://www.fab.com/ja/listings/a63386b8-7cad-42cd-8b81-a9de147e1f08) + +無料でやるなら`.fbx`, `.vrma`などから作成する方法があります。 + +- https://www.mixamo.com/ +- https://booth.pm/ja/items/5512385 +- https://github.com/BandaiNamcoResearchInc/Bandai-Namco-Research-Motiondataset + +## control rigから作る + +再生して録画ボタンを押すと作れます。 + +## tatoolsを使う + +[tatools](https://www.fab.com/ja/listings/a5d3b60d-b886-4564-bf6d-15d46a8d27fe)を使います。 + +https://github.com/threepeatgames/ThreepeatAnimTools + + +## unityから持ってくる + +[こちら](/unity/01_fbx.html)を参考にしてください。 + diff --git a/book/gasp/08_niagara.md b/book/gasp/08_niagara.md new file mode 100644 index 0000000..f8af286 --- /dev/null +++ b/book/gasp/08_niagara.md @@ -0,0 +1,5 @@ +# niagaraでダメージを出す + +- https://www.youtube.com/watch?v=wYq2SR63vkM + + diff --git a/book/gasp/09_chair.md b/book/gasp/09_chair.md new file mode 100644 index 0000000..e6a2654 --- /dev/null +++ b/book/gasp/09_chair.md @@ -0,0 +1,23 @@ +# 椅子に座る + +椅子に座るのと階段に登るのは鬼門です。完璧に調整するのが難しいからです。 + +椅子に座る動作を設定します。大変ですが以下のcomponentを使うと簡単にできます。調整は難しいですね。私の場合はgame animation sampleを使っていますが、最新版では勝手に動きが制御されるためanim montageをそのまま再生できません。したがって、別にabpを作成し、それを呼び出します。 + +- https://www.youtube.com/watch?v=VzyvpFvon0g +- https://blueprintue.com/blueprint/wg_vyr4o/ + +# animation blueprint linking showcase + +[こちら](https://www.fab.com/ja/listings/e52251d2-1a90-4428-a685-c5d4acdd9c07)にチュートリアルが公開されています。 + +主にABPの切り替えと椅子に座る内容があります。docsも公開されています。 + +[External Communication Showcase](https://docs.google.com/document/d/1D2rYh7XYkYaBlMPcD7rL4s6pV6e6Ty9xDYb9KW836NA/edit?tab=t.0#heading=h.tb8y73m27obr) + +# replicated interaction kit vol 3 + +`replicated interaction kit vol 3`というassetを改造します。 + +[こちら](/plan/05_chair.html)を参考にしてください。 + diff --git a/book/gasp/10_stairs.md b/book/gasp/10_stairs.md new file mode 100644 index 0000000..899b214 --- /dev/null +++ b/book/gasp/10_stairs.md @@ -0,0 +1,15 @@ +# 階段を登る + +階段でのめり込む問題があります。これを解消します。 + +1. `/Blueprints/ABP_SandboxCharacter`でAnimGraphの中からFoot Placementを探す。 +2. 骨盤(pelvis)の悪態道補正モードを`Sudden Motion Only`から`Component Space`にする。 + +また、階段の段差(Step Height)は小さくしてください。のめり込まなくなった反面、スムーズさがなくなり画面がガタガタ揺れます。 + +## 階段を作る + +1. map(level)を開く +2. `編集モード -> モデリング -> 作成 -> 階段` +3. `Step Height: 10.0` + diff --git a/book/gasp/11_run.md b/book/gasp/11_run.md new file mode 100644 index 0000000..ba82e47 --- /dev/null +++ b/book/gasp/11_run.md @@ -0,0 +1,35 @@ +# アニメーションを変更する + +今回はダッシュ(sprint)で一定のスピード(speed)に達すると`kawaii_run`と名付けたアラレちゃん走りに切り替わるようにします。 + + + +1. ABP_SandboxCharacterのAnimGraphを開きます。`cached pose`を作って処理を分割します。 +2. cached poseを呼び出して`Layered blend per bone`のbaseにつなぎます。重要なのはLayered blendの詳細で`spine_03`のボーンを入れること。 +3. blendにアニメシーケンスをつなぎます。私は`unity -> .vrma -> vrm4u`で作成したものを使いました。 +4. blend weightsの値をconfigから持ってきます。これで`CBP_SandboxCharacter`から制御できます。ダッシュが一定速度に達すれば1、それ以外は0にします。 + +![](/img/0015.png) + + + +## アニメシーケンスを作る + +- https://booth.pm/ja/items/2845548 + +これをunityを使って[変換](/unity/01_fbx.html)して使いました。 + +## リターゲットによる調整 + +`kawaii_run`は走っているときに両足を中央に持っていくのが正しいですが、このままでは足が開いてしまいます。 + +これを調整するにはリターゲットのposeを変更します。使用している`RTG_UEFN_$model`を開いて、`Running Retarget`から`Editing Retarget Pose`にします。両足を回転さればokです。一方はプラス、もう一方はマイナスの値です。 + +- left: 0.0, -2.0, 20.0 +- right: 0.0, 2.0, -20.0 + +## GASPでアニメーションを変更するには + +`CHT_AnimationsForStateMachine`でそれぞれの項目のanimを変更すればいいのだろうかと思いましたが、走るanimに関しては、複雑すぎる上に全方位のものを用意する必要があります。 + +したがって、`ABP_SandboxCharacter`のblendを活用しながら適用しました。 diff --git a/book/gasp/12_weapon.md b/book/gasp/12_weapon.md new file mode 100644 index 0000000..871b15e --- /dev/null +++ b/book/gasp/12_weapon.md @@ -0,0 +1,33 @@ +# 武器を装備する + +武器を手に持つ動作を追加します。 + + + +1. SKで`装備する箇所`と`手に持つ箇所`のソケットを追加します。 +2. そこに武器のasset(mesh)を追加し、previewします。ここでは剣(sword)を使います。 +3. animを作ります。例えば、装備場所から手に持つ動作の中で剣が重なり合うようにします。 +4. 重なる場所には通知で`DrawnWeapon`, `RestWeapon`を作ります。 +5. それをCBP_SandboxCharacterのIAに設定します。`BP_WeaponSword`を作って武器のmeshを入れます。 + +## 他のキャラクターでズレてしまう + +これはManny用のboneに設定されていますので、他のキャラではズレてしまいます。 + +対処法を考えます。 + +1. まず同じ名前のソケットをSKのboneに追加します。そして、位置を調整します。 +2. event begin playでキャラのmeshを`Character_Mesh`の変数に入れます。それをparentに使います。 + + + +## niagaraがズレてしまう + +animにniagaraを設定している場合もズレてしまいます。これは解決法がありません。 + +slash(スラッシュ)などは面倒くさいのでそのまま当てていますが、大きくなりすぎています。 + +他のniagaraは、`BP_WeaponSword`に入れて、都度使用するときに呼び出すようにしています。 + +面倒ですが体型に合わせたboneを作り、そこにniagaraを付けるといいかもしれませんが、良い解決策は見つかっていません。 + diff --git a/book/gasp/README.md b/book/gasp/README.md new file mode 100644 index 0000000..b1a4775 --- /dev/null +++ b/book/gasp/README.md @@ -0,0 +1,63 @@ +# game animation sample + +[game aimation sample](https://www.fab.com/ja/listings/880e319a-a59e-4ed2-b268-b32dac7fa016)は`epic games`が提供しているassetです。 + +[G]ame [A]nimation [S]ample [P]rojectでGASPと略すことがあります。 + +[G]ame [A]bility [S]ystemもGASなので紛らわしいですね。 + +まずはこれを使ってキャラクター(character)を動かしてみましょう。 + +## level(map) + +1. `/Content/Levels/DefaultLevel`を開きます。 +2. 再生ボタンを押します。 +3. ゲームがプレイできます。 + +|key|en|ja| +|---|---|---| +|w,a,s,d|move|移動| +|space|jump|ジャンプ| +|space|sprint|ダッシュ| +|ctrl|walk|歩く| +|c|crouch|しゃがむ| +|マウススクロール|camera|カメラ| + +ボタンに乗るとキャラを切り替えることができます。 + +レベル(level)はマップ(map)とも呼ばれます。プレイ(play)する場所を作ります。 + +特にボタンが重要です。tipsを確認しましょう。 + +- https://www.youtube.com/watch?v=IqHrhcA7Rsk + +`/Content/Levels/DefaultLevel`を右クリックして`参照ビューア`を選択してみます。どのファイルを参照しているかわかります。 + +## BP + +characterは`/Content/Blueprints/CBP_SandboxCharacter`で動かしています。このファイルを開いて編集してみましょう。 + +1. `EventGraph`というノードが記述されている場所(画面中央)で右クリックし、`Debug Key 1`を追加します。 +2. Releasedというピン(pin)から`Print String`を追加します。 +3. ゲームを再生します。 +4. キーボード(keyboard)の`[1]`を押すと、画面に`Hello`が表示されます。 + +これがbp(blueprint)でゲームを作る要領になります。 + +## ABP + +characterの動きは`/Content/Blueprints/ABP_SandboxCharacter`で設定されています。 + +## input + +まずkeyがどこで設定されているのかと言うと、`/Content/Input/IMC_Sandbox`で設定されています。 + +例えば、`/Content/Input/IA_Aim`をコピー(copy)して、新しく`IA_One`を作ってみましょう。それを`IMC_Sandbox`で読み込んで`[1]`に割り当てます。 + +次に、`IA_One`を先程の`CBP_SandboxCharacter`にドラッグ&ドロップ(D&D)します。 + +すると`EnhancedInputAction IA_One`という赤いノードが作成されたと思います。`Debug Key 1`を削除して代わりにつなぎます。色にも意味がありますが、そのうちわかってくると思います。 + +ゲームを再生してみると先ほどと同じkeyで動きます。 + + diff --git a/book/gitbook.md b/book/gitbook.md new file mode 100644 index 0000000..2a3bc55 --- /dev/null +++ b/book/gitbook.md @@ -0,0 +1,10 @@ +## start gitbook(honkit) + +```sh +$ nvm use 23 +$ npm install honkit --save-dev +$ npx honkit init +$ npx honkit serve +$ npx honkit build +``` + diff --git a/book/img/0001.png b/book/img/0001.png new file mode 100644 index 0000000..8d05700 Binary files /dev/null and b/book/img/0001.png differ diff --git a/book/img/0002.png b/book/img/0002.png new file mode 100644 index 0000000..16fe179 Binary files /dev/null and b/book/img/0002.png differ diff --git a/book/img/0003.png b/book/img/0003.png new file mode 100644 index 0000000..e8ee7f7 Binary files /dev/null and b/book/img/0003.png differ diff --git a/book/img/0004.png b/book/img/0004.png new file mode 100644 index 0000000..14ab09a Binary files /dev/null and b/book/img/0004.png differ diff --git a/book/img/0005.png b/book/img/0005.png new file mode 100644 index 0000000..5a89cb8 Binary files /dev/null and b/book/img/0005.png differ diff --git a/book/img/0006.png b/book/img/0006.png new file mode 100644 index 0000000..73d062f Binary files /dev/null and b/book/img/0006.png differ diff --git a/book/img/0007.png b/book/img/0007.png new file mode 100644 index 0000000..cd3d0db Binary files /dev/null and b/book/img/0007.png differ diff --git a/book/img/0008.png b/book/img/0008.png new file mode 100644 index 0000000..acfd078 Binary files /dev/null and b/book/img/0008.png differ diff --git a/book/img/0009.png b/book/img/0009.png new file mode 100644 index 0000000..dcadee0 Binary files /dev/null and b/book/img/0009.png differ diff --git a/book/img/0010.png b/book/img/0010.png new file mode 100644 index 0000000..382075f Binary files /dev/null and b/book/img/0010.png differ diff --git a/book/img/0011.png b/book/img/0011.png new file mode 100644 index 0000000..d12de9d Binary files /dev/null and b/book/img/0011.png differ diff --git a/book/img/0012.png b/book/img/0012.png new file mode 100644 index 0000000..897cf35 Binary files /dev/null and b/book/img/0012.png differ diff --git a/book/img/0013.png b/book/img/0013.png new file mode 100644 index 0000000..674da8d Binary files /dev/null and b/book/img/0013.png differ diff --git a/book/img/0014.png b/book/img/0014.png new file mode 100644 index 0000000..c800ac6 Binary files /dev/null and b/book/img/0014.png differ diff --git a/book/img/0015.png b/book/img/0015.png new file mode 100644 index 0000000..d203557 Binary files /dev/null and b/book/img/0015.png differ diff --git a/book/issue/README.md b/book/issue/README.md new file mode 100644 index 0000000..c176147 --- /dev/null +++ b/book/issue/README.md @@ -0,0 +1,9 @@ +# issue + +問題の解決を目指します。 + +ゲーム開発をしていると、issue(問題)がたくさん発生します。特にueはbug(バグ)が多く、機能は実験的(pre releases)であることが多いです。 + +また、開発者(dev)のフォーラム(forum)もあります。 + +https://forums.unrealengine.com/ diff --git a/book/issue/SUMMARY.md b/book/issue/SUMMARY.md new file mode 100644 index 0000000..d344318 --- /dev/null +++ b/book/issue/SUMMARY.md @@ -0,0 +1,22 @@ +# Summary + +* [ue](issue/ue/README.md) + * [error II-E1001](issue/ue/ue_01.md) +* [game animation sample](issue/gasp/README.md) + * [GameplayCameraをdisableにする](issue/gasp/gasp_01.md) + * [cameraが急接近する](issue/gasp/gasp_02.md) + * [characterのcomponentが初期化される](issue/gasp/gasp_03.md) + * [IA_Sprintのダッシュができなくなる](issue/gasp/gasp_04.md) + * [traversableが機能しなくなる](issue/gasp/gasp_05.md) +* [city sample](issue/city/README.md) + * [buildが遅い場合](issue/city/city_01.md) + * [ue5.5ではbuildが通らない](issue/city/city_02.md) + * [問題が起こったときにresetする](issue/city/city_03.md) + * [playerが地面に埋まってしまう](issue/city/city_04.md) + * [他のmapとの統合](issue/city/city_05.md) + * [BGMを変更する](issue/city/city_06.md) +* [blender](issue/blender/README.md) + * [衣装の背後に黒いチラつきが発生する](issue/blender/blender_01.md) +* [vrm4u](issue/vrm4u/README.md) + * [customで衣装の半分が灰色になる](issue/vrm4u/vrm4u_01.md) + diff --git a/book/issue/blender/README.md b/book/issue/blender/README.md new file mode 100644 index 0000000..9e35ebd --- /dev/null +++ b/book/issue/blender/README.md @@ -0,0 +1,3 @@ +# blender + +https://projects.blender.org/blender/blender/issues diff --git a/book/issue/blender/blender_01.md b/book/issue/blender/blender_01.md new file mode 100644 index 0000000..3f617c9 --- /dev/null +++ b/book/issue/blender/blender_01.md @@ -0,0 +1,6 @@ +# 衣装の背後に黒いチラつきが発生する + +ueで読み込むと衣装の背後に黒いチラつきが発生する問題は、vrm-outlineが原因です。 + +これはblenderの問題ではありませんが、勘違いしやすいので、ここに掲載します。 + diff --git a/book/issue/blender/blender_02.md b/book/issue/blender/blender_02.md new file mode 100644 index 0000000..774785c --- /dev/null +++ b/book/issue/blender/blender_02.md @@ -0,0 +1,7 @@ +# ueで読み込むと一部のmaterialが正しく表示されない + +この現象はblenderで作った`.vrm`をvrm4uで読み込み、一旦、ueを終了するとその後、materialがおかしくなります。 + +しかし、`vrm1`の出力は正常なので、それを読み込んで生成されたmaterialを`SK_${name}`にセットしています。 + + diff --git a/book/issue/blender/blender_03.md b/book/issue/blender/blender_03.md new file mode 100644 index 0000000..b668683 --- /dev/null +++ b/book/issue/blender/blender_03.md @@ -0,0 +1,8 @@ +# 髪の毛が頭に追従しなくなる事がある + +激しく動いたときなど、髪の毛と頭が分離してしまうことがありますが、これはウェイトが正しく塗られていないことが原因です。 + +armature(bone)を統合したとき、`head`,`neck`, `J_Bip_C_Head`, `J_Bip_C_Neck`に混在してウェイトが塗られていることがあります。 + +例えば、赤く塗るのは`J_Bip_C_Head`だけにしましょう。`耳`と`後頭部の内部(髪色部分)`が重要です。 + diff --git a/book/issue/city/README.md b/book/issue/city/README.md new file mode 100644 index 0000000..f98f431 --- /dev/null +++ b/book/issue/city/README.md @@ -0,0 +1 @@ +https://forums.unrealengine.com/search?q=city%20sample diff --git a/book/issue/city/city_01.md b/book/issue/city/city_01.md new file mode 100644 index 0000000..5ea9397 --- /dev/null +++ b/book/issue/city/city_01.md @@ -0,0 +1,14 @@ +## buildが遅い場合 + +もしcity sampleのmapを使わない場合は、buildが遅くなってしまいます。 + +ueのpackage化が遅い場合、使用するmap以外をbuildしないようにすることで、処理時間を短縮できます。以下の手順で設定を行います。 + +1. `プロジェクト設定`を開きます。 +2. 「パッケージ化」セクションに移動します。 +3. 「マップのみをクック」オプションにチェックを入れます。 +4. 「パッケージ化されたビルドに含めるマップのリスト」に、必要なマップ(.umapファイル)を指定します。 + +この設定により、指定したmapのみがpackage化され、データサイズが小さくなり、処理時間も短縮されます。 + + diff --git a/book/issue/city/city_02.md b/book/issue/city/city_02.md new file mode 100644 index 0000000..3bd475a --- /dev/null +++ b/book/issue/city/city_02.md @@ -0,0 +1,39 @@ +## ue5.5ではbuildが通らない + +`2024-11-18`時点ではcity sampleはue5.5でbuildが通りません。ue5.4では通ります。 + +`Engine/Plugins/Performance/AutomatedPerfTestingにAutomatedPerfTestConfig.cs`, `AutomatedPerfTestNode.cs`が含まれていないため`${project}/Build/Script/CitySample.Automation.csproj`に記述されているcompileが通らないのです。`AutomatedPerfTesting`は5.5で追加されたpluginです。 + +```html + + + + + net8.0 + + + + + + + + +``` + +> Experimental release of Automated Perf Testing Plugin v0.1, providing Gauntlet Test Controllers, UAT Test Nodes, and BuildGraph macros for adding common automated performance tests to a project’s automated build and test. + +- https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-5.5-release-notes +- https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/AutomatedPerfTesting + +これはgithubにあるsrcから持ってくるしかありません。アクセスするにはorgに参加します。 + +https://github.com/EpicGames/UnrealEngine/tree/release/Engine/Plugins/Performance/AutomatedPerfTesting/Build/Scripts + +1. `$(EngineDir)\Plugins\Performance\AutomatedPerfTesting\Build\Scripts`フォルダを作ります。`$(EngineDir)`はueがインストールされているディレクトリです。 +2. githubの[src](https://github.com/EpicGames/UnrealEngine/tree/release/Engine/Plugins/Performance/AutomatedPerfTesting/Build/Scripts)から持ってきた`$(EngineDir)\Plugins\Performance\AutomatedPerfTesting\Build\Scripts\AutomatedPerfTestConfig.cs`, `$(EngineDir)\Plugins\Performance\AutomatedPerfTesting\Build\Scripts\AutomatedPerfTestNode.cs`を同ディレクトリに置きます。 + +また、`CitySampleCookedEditor.Target.cs`を削除するとbuildが通ったという報告があります。 + +https://forums.unrealengine.com/t/automatedperftesting-plugin-does-not-build-when-building-city-sample-in-ue5-5/2134722/9 + + diff --git a/book/issue/city/city_03.md b/book/issue/city/city_03.md new file mode 100644 index 0000000..d33ac4f --- /dev/null +++ b/book/issue/city/city_03.md @@ -0,0 +1,7 @@ +## 問題が起こったときにresetする + +`/Content/Map/Small_City_LVL.umap`と`/Content/__ExternalActors__/Map/Small_City_LVL`を上書きします。copy元は`VaultCache`からでもいいですし、新しく作った`CitySample`のprojectからでもいいです。 + +基本的に新しいprojectを作成するときは`VaultCache`からcopyされます。これがないとdownloadから`VaultCache`が生成されます。 + + diff --git a/book/issue/city/city_04.md b/book/issue/city/city_04.md new file mode 100644 index 0000000..43c0d26 --- /dev/null +++ b/book/issue/city/city_04.md @@ -0,0 +1,29 @@ +## playerが地面に埋まってしまう + +GASPと統合するとcity sampleに置かれた物体に触れられません。collisionが発生しないのです。 + +原因は`Gameplay Camera`というpluginです。`$project/Config/DefaultEngine.ini`に`DDCVar.NewGameplayCameraSystem.Enable`を追加し、関数である`Setup Camera`を実行している場合、characterのcollisionが機能せず地面に埋まってしまう問題があります。 + +- Gameplay Camera +- Setup Camera +- `DDCVar.NewGameplayCameraSystem.Enable` + +```sh +[/Script/Engine.DataDrivenConsoleVariableSettings] ++CVarsArray=(Type=CVarBool,Name="DDCVar.NewGameplayCameraSystem.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=True) +``` + +`Setup Camera`を実行しないようにするか、`DDCVar.NewGameplayCameraSystem.Enable`をfalseにします。 + +### Collision Trace Channel + +`Collision Trace Channel`を設定するには、`Config/DefaultEngine.ini`を編集する必要があります。以下の手順で行います。GASPは`traversable`を追加します。これが追加されていないと動きません。 + +`ECC_GameTraceChannel${n}`に注意してください。 + +```sh +[/Script/Engine.CollisionProfile] ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel11,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Traversable") +``` + + diff --git a/book/issue/city/city_05.md b/book/issue/city/city_05.md new file mode 100644 index 0000000..72f0ad0 --- /dev/null +++ b/book/issue/city/city_05.md @@ -0,0 +1,7 @@ +## 他のmapとの統合 + +mapにはactorがまとめられているものがあり、それはmapにくっついていません。移動できない場合があります。 + +基本的にはmap[A]とmap[B]はある程度位置を完成させてからcopyしましょう。 + + diff --git a/book/issue/city/city_06.md b/book/issue/city/city_06.md new file mode 100644 index 0000000..b409db9 --- /dev/null +++ b/book/issue/city/city_06.md @@ -0,0 +1,22 @@ +# BGMを変更する + +例えば、BGMの一部を変更したい場合は、`プロジェクト設定 -> ゲーム -> World Audio Data`を見てください。 + +私はmatrix(マトリックス)のテーマを消したかったので、`/Content/Audio/MetaSounds/Music/`にある`music_leavebehind_New_Mix_Meta`, `music_leavebehind_New_Mix_NHT_Meta`の音量を`0.0`にしました。 + +## 音楽を作る + +ゲームには音楽が欠かせません。普段は中毒性のあるゆったりした音楽を流しながら、ここぞという場面では、場を盛り上げる音楽を流します。ポケモンの音楽が好きですね。 + +このような演出は、ゲームの出来栄えの50%以上を占めると考えています。 + +つまり、音楽のパワーはゲームでは特に重要になります。そして、音楽はそのゲームやキャラクターの印象を決定づける力があります。気をつけましょう。 + +では、音楽を作るにはどうすればいいのでしょう。 + +私は`suno`でBGMを自作しています。 + +- https://suno.com/ + +AIで作るとしても、そこには意味を込めなければなりません。キャラクターのテーマソングを思い浮かべください。その人はどんな人で、ここはどのような場所なのか。それがわかれば、プレイヤーの気持ちを思い浮かべることができるはずです。キャラクターや場所に合った曲を目指します。 + diff --git a/book/issue/city/city_07.md b/book/issue/city/city_07.md new file mode 100644 index 0000000..955eff5 --- /dev/null +++ b/book/issue/city/city_07.md @@ -0,0 +1,32 @@ +# 表示されなくなったサイト + +昔は表示され操作もできたいくつかのサイトがweb browser pluginで操作も表示もされない現象が発生しています。ずっと待機中になります。 + +- https://web.syu.is/profile/ai.syu.is +- https://eyes.nasa.gov/apps/solar-system + +一つは自分が管理しているサイトですが、cloudflareを使用しています。おそらく、cloudflareのセキュリティが動作しているのだと思います。web browserのbrowser versionが低いことも要因の一つかもしれません。 + +```json +{ + "time": "2024-10-20T08:00:00.00Z", + "id": "1", + "remote_ip": "ipv6", + "host": "web.syu.is", + "method": "GET", + "uri": "/", + "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ++UE5+Release-5.4-CL Chrome/90.0.4430.212 Safari/537.36", + "status": 200, + "error": "", + "latency": 0, + "latency_human": "1.0ms", + "bytes_in": 0, + "bytes_out": 0 +} +``` + +## 今のところうまく表示されているサイト + +なぜか`solar-system`と同じものを使用している`asteroids`は表示されます。そのうち制限されるかもしれませんが。それともサイトの作りでしょうか。 + +- https://eyes.nasa.gov/apps/asteroids/#/planets/earth diff --git a/book/issue/gasp/README.md b/book/issue/gasp/README.md new file mode 100644 index 0000000..70c0b0b --- /dev/null +++ b/book/issue/gasp/README.md @@ -0,0 +1 @@ +https://forums.unrealengine.com/search?q=gasp diff --git a/book/issue/gasp/gasp_01.md b/book/issue/gasp/gasp_01.md new file mode 100644 index 0000000..f675b9a --- /dev/null +++ b/book/issue/gasp/gasp_01.md @@ -0,0 +1,18 @@ +## GameplayCameraをdisableにする + +GASPで使用されるGameplayCamera(plugin)が壊れているため、これを削除する人が多いです。 + +削除方法は簡単で`/Content/Blueprints/CBP_SandboxCharacter`の`GameplayCamera`というcomponentを削除し、err箇所のnodeを修正すると完了です。 + +仕組みを解説すると、このcomponentでCameraに`/Blueprints/Cameras/CameraAsset_SandboxCharacter`を指定しています。そして、`SetupCamera`という関数でenable(有効)にします。関数では`$project/Config/DefaultEngine.ini`にある`DDCVar.NewGameplayCameraSystem.Enable`の値がtrueなら使用されます。 + +```sh +[/Script/Engine.DataDrivenConsoleVariableSettings] ++CVarsArray=(Type=CVarBool,Name="DDCVar.NewGameplayCameraSystem.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=True) +``` + +`DDCVar.NewGameplayCameraSystem.Enable`をfalseにするか、あるいは`branch`の処理を削除し、false後の処理(Set View Target with Blend)につなげるかで機能をdisable(無効)にすることができます。 + +私はなるべく最新機能を使用したいと思っています。ですが、先に述べたように色々と壊れているため、問題がたくさん発生します。原因が`GameplayCamera`にあることを突き止めるのも苦労しますから、disableにしておくのが正解かもしれません。 + + diff --git a/book/issue/gasp/gasp_02.md b/book/issue/gasp/gasp_02.md new file mode 100644 index 0000000..49ebf0a --- /dev/null +++ b/book/issue/gasp/gasp_02.md @@ -0,0 +1,9 @@ +## cameraが急接近する + +よじ登ったり、柵を超えたりするとき、camera(カメラ)が急接近することがあります。 + +これは`GameplayCamera`の`CameraRig_CollisionOffset`が原因です。`/Content/Blueprints/CBP_SandboxCharacter`の`SetupCamera`という関数で使われていますので、その部分だけ外しておきましょう。 + +ただし、床が透けて映ってしまうようになります。 + + diff --git a/book/issue/gasp/gasp_03.md b/book/issue/gasp/gasp_03.md new file mode 100644 index 0000000..8982fe6 --- /dev/null +++ b/book/issue/gasp/gasp_03.md @@ -0,0 +1,25 @@ +## characterのcomponentが初期化される + +buildすると動きやカメラがおかしくなっていることに気づくかもしれません。 + +これはcomponentが初期化されていることが原因です。 + +通常、`/Content/Blueprints/CBP_SandboxCharacter`にあるcomponentは`/Content/Blueprints/RetargetedCharacters/CBP_SandboxCharacter_${name}`と共通しますが、これが初期化されているのです。例えば、100という値が入れられていたとして、初期設定が1なら、1に戻されるということです。 + +原因はわかりませんが、これが起こるとcameraがおかしくなったり、`IA_Sprint`でダッシュできなくなったりすることがあります。 + +これを解決する方法は、`/Content/Blueprints/CBP_SandboxCharacter`の`Event BeginPlay`でcomponentの初期設定を追加することです。 + + + +この方法でも解決しない場合があります。mapを開いて一度再生したあとにbuildするとうまくいくことがあります。 + +また、それ以外の方法として、初期設定を全部`CBP_SandboxCharacter_${name}`の`Construction Script`ほうに書き出すことが考えられます。 + + + +1. mapを開いて、問題の動作を実行したあとにbuildする +2. `CBP_SandboxCharacter`の`Event BeginPlay`に書いてみる +3. `CBP_SandboxCharacter_${name}`の`Construction Script`に書いてみる + + diff --git a/book/issue/gasp/gasp_04.md b/book/issue/gasp/gasp_04.md new file mode 100644 index 0000000..b639019 --- /dev/null +++ b/book/issue/gasp/gasp_04.md @@ -0,0 +1,7 @@ +## IA_Sprintのダッシュができなくなる + +ダッシュは`/Content/Blueprints/RetargetedCharacters/CBP_SandboxCharacter_${name}`の`Event BeginPlay`を削除することで解消しました。 + +nodeをつなげていなくてもevent自体を削除しなければなりません。 + + diff --git a/book/issue/gasp/gasp_05.md b/book/issue/gasp/gasp_05.md new file mode 100644 index 0000000..225541f --- /dev/null +++ b/book/issue/gasp/gasp_05.md @@ -0,0 +1,8 @@ +## traversableが機能しなくなる + +突然、traversable(トラバーサブル)、つまり、よじ登ったりする機能が使えなくなることがあります。 + +いくつか原因が考えられますが、project設定の`collision > trace channel : Traversable`に問題があるのかもしれません。 + +collision trace channelに問題が発生するときはけっこう大変です。色々とbugがあり、一度削除して同じ名前で作り直せば動作することもありますが、余計に壊れることもあります。例えば、削除したときにBPのnodeに他のtrace channelが自動で入ってしまうことも要因になります。 + diff --git a/book/issue/ue/README.md b/book/issue/ue/README.md new file mode 100644 index 0000000..d5c4859 --- /dev/null +++ b/book/issue/ue/README.md @@ -0,0 +1 @@ +https://forums.unrealengine.com/categories?tag=unreal-engine diff --git a/book/issue/ue/ue_01.md b/book/issue/ue/ue_01.md new file mode 100644 index 0000000..be19c55 --- /dev/null +++ b/book/issue/ue/ue_01.md @@ -0,0 +1,37 @@ +# error II-E1001 + +`Epic Games Launcher`に非常によく出るerrorです。 + +新しいassetをインストールする際に出ます。 + +時間を待てば解消されることがあります。例えば、ゲームエンジンを読み込める段階で解消されます。 + +それでも解消されない場合は、以下の方法を試してみてください。 + +## 概要 + +エラーコード「II-E1001」は、主にEpic Games LauncherまたはUnreal Engineでのプロジェクト作成やコンテンツダウンロード時に発生する問題です。このエラーの原因と解決策を以下にまとめます。`Epic Games Launcher`を再インストールすることでしか治らないこともあります。 + +1. キャッシュの破損 +> Epic Games LauncherのVault Cacheに破損したデータが残っている場合、エラーが発生することがあります7。 +2. ダウンロード中のクラッシュ +> コンテンツのダウンロード中にPCがクラッシュした場合、未完了のデータが原因でエラーが発生することがあります7。 +3. 外部ストレージの使用 +> ライブラリが外部ハードドライブ上にある場合、ランチャーが正しく認識できないことがあります7。 + +## 解決策 + +1. Vault Cacheフォルダを確認・削除 +> Epic Games Launcherの「設定」からVault Cacheの場所を確認します。 +> 対象コンテンツのフォルダを削除します(フォルダが空の場合も削除可能)。 +> 他のフォルダを選択して、元のフォルダに戻すと解消されることがあります。 +2. Vault Cacheフォルダの属性変更 +> Vault Cacheフォルダを右クリックし、「読み取り専用」のチェックを外して適用します。 +3. Epic Games Launcherの再起動 +> ランチャーを再起動し、問題が解消されるか確認します。 +> 必要であればPC自体も再起動してください。 +4. 外部ストレージの確認 +> ライブラリが外部ストレージ上にある場合、ランチャー設定で適切なキャッシュフォルダが指定されているか確認します7。 +5. Epic Games Launcherの再インストール +> キャッシュをクリアした後、Epic Games Launcherを再インストールします。 +> これらの手順で解決しない場合は、Epic Gamesサポート(公式ヘルプページ)に問い合わせることをお勧めします。 diff --git a/book/issue/vrm4u/README.md b/book/issue/vrm4u/README.md new file mode 100644 index 0000000..74946d6 --- /dev/null +++ b/book/issue/vrm4u/README.md @@ -0,0 +1,3 @@ +# vrm4u + +https://github.com/ruyo/VRM4U/issues diff --git a/book/issue/vrm4u/vrm4u_01.md b/book/issue/vrm4u/vrm4u_01.md new file mode 100644 index 0000000..0f00382 --- /dev/null +++ b/book/issue/vrm4u/vrm4u_01.md @@ -0,0 +1,8 @@ +# customで衣装の半分が灰色になる + +普段の衣装ではライトの加減で服に変な影がうっすら浮き上がる問題がありました。 + +これを解消するために`type:custom(MI_PostToon)`を当てましたが、customにすると衣装の半分が灰色になる問題が出ました。 + +これを解消するためにはcustomの`/custom/SK_${model}`に設定されているmaterialを編集し、`MI_PostToon`から`/Plugins/VRM4UContents/MaterialUtil/UE5/Material/MI_VrmMToonOptUnlitOpaque`に切り替えると解消されました。 + diff --git a/book/json/01_varest.md b/book/json/01_varest.md new file mode 100644 index 0000000..aaeca8f --- /dev/null +++ b/book/json/01_varest.md @@ -0,0 +1,5 @@ +# apiから情報を取得する + +[varest](https://github.com/ufna/VaRest)などのpluginを使うと便利です。しかし、supportが終了しているため独自にbuildする必要があります。あるいは有料のものを購入するのもいいでしょう。 + + diff --git a/book/json/README.md b/book/json/README.md new file mode 100644 index 0000000..942b924 --- /dev/null +++ b/book/json/README.md @@ -0,0 +1,3 @@ +# json blueprint utilities + +`json`を扱う。 diff --git a/book/package.json b/book/package.json new file mode 100644 index 0000000..228e0c7 --- /dev/null +++ b/book/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "got": "^14.4.5" + }, + "devDependencies": { + "honkit": "^6.0.2" + } +} diff --git a/book/pixel/01_server.md b/book/pixel/01_server.md new file mode 100644 index 0000000..7779ea3 --- /dev/null +++ b/book/pixel/01_server.md @@ -0,0 +1,5 @@ +# 基本事項 + +pcのdisplay(ディスプレイ)が必要になる。画面の電源もつけておく必要があります。 + + diff --git a/book/pixel/README.md b/book/pixel/README.md new file mode 100644 index 0000000..189b212 --- /dev/null +++ b/book/pixel/README.md @@ -0,0 +1,32 @@ +# pixel streaming + +`pixel streaming`は`.exe`をサーバー(server)に置いてwebからプレイするためのものです。 + +[pixel streaming 2](https://github.com/EpicGamesExt/PixelStreamingInfrastructure/)が最新です。[ガイド](https://github.com/EpicGamesExt/PixelStreamingInfrastructure/blob/master/Docs/pixel-streaming-2-migration-guide.md)に従い構築しましょう。 + +1. projectのpluginで`pixel streaming`をdisableにし、`pixel streaming 2`をenableにする。 +2. これをpackage buildして、app.exeを作ります。引数は以下のようにしてください。 + +なお、sshなどで作業している場合はfirewallの許可が出ませんので、local-desktopで作業してください。または手動でruleを更新してください。 + +```sh +./$project/Windows/app.exe -AudioMixer -RenderOffScreen -PixelStreamingSignallingURL="ws://127.0.0.1:8888" +``` + +次にserverの設定です。 + +```sh +# git clone https://github.com/EpicGamesExt/PixelStreamingInfrastructure.git +$ git clone --branch UE5.5 https://github.com/EpicGamesExt/PixelStreamingInfrastructure.git +$ cd PixelStreamingInfrastructure/SignallingWebServer/platform_scripts/cmd +$ ./setup.bat +$ ./start.bat +``` + +`PixelStreamingInfrastructure/SignallingWebServer/config.json`の書き換えと起動。特に注意すべきは`http_root`です。Publicからwwwに変更されています。path(パス)にも注意してください。 + +```sh +$ cd PixelStreamingInfrastructure/SignallingWebServer +$ vim config.json +$ npm start -- --public_ip localhost +``` diff --git a/book/plan/01_flying.md b/book/plan/01_flying.md new file mode 100644 index 0000000..0c80fd4 --- /dev/null +++ b/book/plan/01_flying.md @@ -0,0 +1,32 @@ +# superhero flight animations + +[superhero flight animations](https://www.fab.com/ja/listings/41185c19-5191-4153-8293-8cc9901efa95) + +GASと連携するには飛行モードを有効にするときだけABPを切り替えます。いくつかの調整が必要になります。 + + + +## スピードとカメラ設定 + +|component|name|body| +|---|---|---| +|Character Movement|Max Fly Speed|基本スピード。これを上げてスピードを調整する| +|SFA|Sprint Fly Speed|基本スピード。現時点では機能しないみたい| +|SFA|Sprint Acceleration|徐々にスピードを上げていく値。大きいほどすぐに上昇する| +|SFA|Flight Breaking Deceleration|小さいと飛行後のダウンタイムが発生| +|SprintArm|Target Arm Length|最大でどれだけカメラを離すか| +|SprintArm|Camera Lag Speed|ターゲットに到達する速度。大きいほど遅くなる| +|SprintArm|Camera Lag Max Distance|遅れを取る最大距離| + +## アニメーションの変更 + +これはBPで変更できるものもあれば、ABPで変更しなければいけないものもあります。 + +例えば、idleのanimを変更します。 + +1. `/Content/SuperheroFlight/Characters/Mannequins/Animations/ABP_Player_UE5`を開いて、AnimGraphのHoverFlightIdleを見ます。 +2. そこにSequence Playerがありますが、`A_Flight_Idle_A`を変更します。 +3. 私はMagicalAnimSet(有料)を使いました。`/Content/MagicalAnimSet/Animations/locomotion/Inplace/run_f_loop`を右クリックして、アニメリターゲットで`Content/SuperheroFlight/Characters/Mannequins/Meshes/SKM_Quinn`をターゲットに参照します。superheroで動くanimの`run_f_loop`が作成されます。 +4. `HoverFlightIdle`のところで`A_Flight_Idle_A -> run_f_loop`と入れ替えます。 + +この要領でanimを変更していきます。 diff --git a/book/plan/02_uds.md b/book/plan/02_uds.md new file mode 100644 index 0000000..7e6176e --- /dev/null +++ b/book/plan/02_uds.md @@ -0,0 +1,56 @@ +# ultra dynamic sky + +[ultra dynamic sky](https://docs.google.com/document/d/1xAr0Hd3mY7Mp0g0waKLUvJaddUPaVxEeRoEEFXctCE0/) + +blueprintなどでも`uds`と略されます。 + +1. `/Content/UltraDynamicSky/Blueprints/Ultra_Dynamic_Sky`, `Ultra_Dynamic_Weather`をlevelに置きます。 +2. `Ultra_Dynamic_Weather(Self)`の詳細から`Random Weather Variation:Hourly`にします。これで天候がすぐに変わります。 + +## planet systemを作る + +地上から宇宙にシームレスに移動できるmapを作ります。といっても様々な問題があり、完全には難しいです。一応、[WorldScape Plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2)というものがあります。 + +1. `/Content/UltraDynamicSky/Blueprints/Ultra_Dynamic_Sky`を開きます。 +2. そこに地球と月と太陽のBPを入れます。各自が用意してください。なお、地球は`SkyAtmosphere`の下に置いてください。 +> 名前は 地球(BP_Earth), 月(BP_Moon), 太陽(BP_Sun) としておきます。 +3. `BP_Earth`は詳細から`transform-location-z:-636000000`, `transform-scale:6360000`にします。 +4. `Sky_Sphere_Mesh`の`transform-scale:50000`にします。 +5. 関数の`Current Star Color(pure)`にて高度を取得できるため、各componentの表示と非表示(visibility)を切り替えます。 + + + +- `BP_Earth`: `transform-location-z:-636000000`, `transform-scale:6370000` +- `Sky_Sphere_Mesh`: `transform-scale:50000` + +## issue: mapのcollisionがおかしくなる + +これはearthを`SkyAtmosphere`の下に置くと発生します。親子関係を解除しましょう。 + +## issue: earthの下に黒丸(影)がある + +earthのscaleを636から637に変更することで解消できます。 + +earthを下に見ると、黒い丸が映り込みます。これは、udsをupdateすると発生し始めました。 + +また、`Captured Scene Sky Lightの`Real Time Capture`をdisableにすると雲も影も無くなります。したがって、条件でon/offを切り変える方法で緩和できます。この方法は使用しなくても良いです。 + +> リアルタイムキャプチャが有効なスカイライトがシーンにあります。少なくともskyatmosphereコンポーネント、volumetriccloudコンポーネント、またはisksyとしてマテリアルタグが付いたメッシュが必要です。これらがない場合は黒になります。 + +## issue: 地平線を消す + +これは`Fog Max Opacity:0.0`にします。 + +## issue: 透明な地上が目立つ + +Fogを消すと透明な地上が目立つようになります。特に目立つのは夜ですね。 + +これは`SkyAtmosphere`の色合いで調整しましょう。 + +## 雪を積もらせる + +1. landscapeにあるmaterialを編集します。 +2. ultra dynamic weatherと検索して追加します。 +3. base color, normalなどのpinがあればつなげます。 + + diff --git a/book/plan/03_ocean.md b/book/plan/03_ocean.md new file mode 100644 index 0000000..464b03b --- /dev/null +++ b/book/plan/03_ocean.md @@ -0,0 +1,28 @@ +# ocean waves + +[ocean waves](https://www.unrealengine.com/marketplace/ja/product/ocean-waves) + +必要なものを`/Content/OceanWaves/Levels/EarthSizedOceanPlanet`からcopyして持ってきましょう。 + +- `BP_EarthSizedSphericalMesh` +- `BP_EarthSizedOcean` +- `WaterVolume` + +`BP_EarthSizedSphericalMesh`の`transform-location-z:-63600000`にします。`Sphere Radius:63600000`にします。`SphereEdge Length:16000000`になるはずです。 + +次に海上の影問題を修正するため`Material Overrides`, `Material Outer/Inner`をすべて変更します。私は`/Vefects/Water/VFX/WaterMaterials`を使用しました。 + +次に`BP_EarthSizedOcean`の`Volume Maaterials`で`WaterVolume`をセットします。`Above/Underwater`を`/Vefects/Water/VFX/UnderWater`に変更します。`height:0`にします。これは海に入って出たときに海中を適用する高さを設定します。 + +## city sampleで使うと空間にロードされていないアクタを参照 + +> WaterVolume: 空間にロードされていないアクタを参照しています。 + +これは`BP_EarthSizedOcean`, `BP_EarthSizedSphericalMesh`の詳細から`is spatially loaded`のチェックを外します。 + +## ocean wavesが遅い理由 + +これは`/Content/OceanWaves/Blueprints/BP_SphericalMesh`の`CreateMeshAsyncIteration`にある`Set Timer for Next Tick by Event`が原因です。 + +しかし、取り除くと海が消えます。ロードを待つほかありません。 + diff --git a/book/plan/04_item.md b/book/plan/04_item.md new file mode 100644 index 0000000..a02379a --- /dev/null +++ b/book/plan/04_item.md @@ -0,0 +1,10 @@ +# nice interaction system + +[nice interaction system](https://www.fab.com/ja/listings/63b61e4a-dc11-4ee0-a6b1-f4860bd29198) + +1. [docs](https://niceshadow.gitbook.io/nice-interaction-system)があります。基本的にGame Modeの設定に入っているPlayer Controller, Game Stateのファイルを開きます。GASは`GM_Snadbox`などがそれにあたります。これらのBPにcomponentを追加します。 +2. Player Controller: `AC_PC_Interaction` +> The only thing you need to do now is open your Player Controller and add the AC_PC_Interaction component: +3. Game State: `AC_GS_Interaction` +> Now just add the AC_GS_Interaction component to your game state: +4. project設定にてcollisionのtrace channelに`LookAtTrace`を`ignore`で追加します。 diff --git a/book/plan/05_chair.md b/book/plan/05_chair.md new file mode 100644 index 0000000..408affe --- /dev/null +++ b/book/plan/05_chair.md @@ -0,0 +1,57 @@ +# replicated interaction kit vol 3 + +その後、動作が気に入らなかったので[replicated interaction kit vol 3](https://www.fab.com/ja/listings/3ce13688-fd10-462f-b90d-964c85a090ad)というassetを購入しました。しかし、キャラの背丈が合わない場合の調整が難しく、あまりおすすめしません。 + +また、用意されているものすべてを使わないと設定できません。難易度は高めです。具体的には`BP_Chair`, `BP_InteractKitVol3`, `ABP_Manny`, `BP_ThirdPersonCharacter`を使ってGASPの`CBP_SandboxCharacter`に組み込みます。 + +```sh +/Content/InteractionKitVol3/Blueprint/Blueprint/BP_Chair --> map(level) +/Content/InteractionKitVol3/Blueprint/ActorComponent/BP_InteractKitVol3 --> CBP_SandboxCharacter[Component] +/Content/InteractionKitVol3/Demo/ThirdPerson/Blueprints/BP_ThirdPersonCharacter --> CBP_SandboxCharacter[key-E, key-Space] +/Content/InteractionKitVol3/Demo/Characters/Mannequins/Animations/ABP_Manny --> CBP_SandboxCharacter[Set Anim Instance Class] +``` + +もしanimを作りたい場合は、`/Content/InteractionKitVol3/Demo/Characters/Mannequins/Rigs/RTG_UE5toUE5`を利用してください。 + +まずcomponentを`CBP_SandboxCharacter`に入れて、ABPを呼び出す方法があります。GASPの`Pre CMC Tick`の処理に注意してください。`InteractionKitVol3`を使用する場合は停止しなければなりません。 + + + +しかし、ABPを呼び出して椅子から降りるときにもとに戻す方法では、その後動作がおかしくなります。 + +## 椅子から降りるとなにかにぶつかる + +椅子から降りるとなにかにぶつかるようになるのは、`/Content/InteractionKitVol3/Blueprint/ActorComponent/BP_InteractKitVol3`の`Set Collision Response to Channel`の処理が原因です。 + +この処理をすべて削除しましょう。 + +しかし、座っている間は動けるようになるので、`IA_Move`に処理を入れます。 + + + +## 背の低いキャラを座らせる + +椅子とアニメーションを改造してちょうどいいように座らせることができます。矢印の向きが座る方向になります。これを逆にしてください。 + + + +色々と問題が多いです。collisionを一時的に無効化する処理を削除しているため、`manny`は椅子と距離が離れています。これ以上近づけると、逆に椅子の上に浮き上がってしまうためです。 + +## Enable Auto Blend Outを使わない + +ABPを利用せずGASPと統合する方法を紹介します。 + +そのままだと椅子に座ったあとにすぐ立ち上がってしまいます。これを修正するには`/Content/InteractionKitVol3/Animations/AnimationMontage/AS_F_Start`に以下の設定を行います。 + +> `/Content/InteractionKitVol3/Animations/AnimationMontage/AS_F_Start` + +1. `Enable Auto Blend Out`をfalseにする +2. 終了時に通知で`End`という名前を作る +3. `/Content/InteractionKitVol3/Blueprint/ActorComponent/BP_InteractKitVol3`を修正する + +`Enable Auto Blend Out`にすると終了を受け取れなくなります。なので通知から受け取って処理するように書き換えます。 + + + +これで正常に椅子に座る、椅子から降りる、という動作ができるようになりました。 + diff --git a/book/plan/06_dragonik.md b/book/plan/06_dragonik.md new file mode 100644 index 0000000..59d5c59 --- /dev/null +++ b/book/plan/06_dragonik.md @@ -0,0 +1,23 @@ +# dragon ik plugin + +[dragon ik plugin](https://www.fab.com/ja/listings/d3f8d256-d8d9-4d27-91c1-c61e55e984a6)を使って、`chinese dragon`を動かします。 + +1. [codehawk64/dragonik-exampleproject](https://github.com/codehawk64/dragonik-exampleproject)を自分のprojectの`$project/Content/`にcopyします。 +```sh +$ git clone https://github.com/codehawk64/DragonIK-ExampleProject.git +$ cp -rf DragonIK-ExampleProject/Content $project/ +``` +2. pluginで`dragon ik`を有効にする。 +3. `/Content/Maps/ChineseDragonSolver_Map`を開く。 +4. `/Content/CharacterExamples/Quadruped/ChineseDragonSolverExamples/ChineseDragon2/ChineseDragon2_Control`を開いて編集する。 + + + +> [ InputAxis -> EnhancedInput ] 修正されているかもしれません。 + +ue5.3では、"InputAxis Turn"は通常マウスの横方向の移動量を取得するために使用されます。これは、カメラやキャラクターの水平回転(ヨー)を制御するのに適しています。 + +しかし、ue5.5でInputAxisを使うと`不明な軸を...`というerrorが出るので、`EnhancedInput`を使います。ここではGASPの`/Content/Input/IMC_Sandbox`を使用します。 + +Enhanced Inputシステムを使用している場合、これは2D軸入力アクションとして設定できます。この場合、X軸の値がTurnに対応し、Y軸の値がLookUp(縦方向の視点変更)に対応します。 + diff --git a/book/plan/07_wsp.md b/book/plan/07_wsp.md new file mode 100644 index 0000000..276ebfb --- /dev/null +++ b/book/plan/07_wsp.md @@ -0,0 +1,11 @@ +# worldscape plugin + +[worldscape plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2) + +本格的な惑星を構築できます。 + +現在、ue5.5をsupportしていませんので、まだ使用できていません。購入者は[discord](https://discord.gg/JD8jvKpmkh)でベータ版の提供を受けることが可能です。 + +## city sampleや他のmapと統合できるのか + +わかりません。 diff --git a/book/plan/README.md b/book/plan/README.md new file mode 100644 index 0000000..ea7d217 --- /dev/null +++ b/book/plan/README.md @@ -0,0 +1,54 @@ +# 有料アセット + +|name|rank|latest|body|docs| +|---|---|---|---|---| +|[ultra dynamic sky](https://www.fab.com/ja/listings/84fda27a-c79f-49c9-8458-82401fb37cfb)|3|20250203|空や天候を自動化|[docs](https://docs.google.com/document/d/1xAr0Hd3mY7Mp0g0waKLUvJaddUPaVxEeRoEEFXctCE0/)| +|[nice interaction system](https://www.fab.com/ja/listings/63b61e4a-dc11-4ee0-a6b1-f4860bd29198)|3|20250206|アイテムを取得する|[docs](https://niceshadow.gitbook.io/nice-interaction-system)| +|[magicalanimset](https://www.fab.com/ja/listings/a63386b8-7cad-42cd-8b81-a9de147e1f08)|3|20241222|少女の戦闘アニメーション|| +|[logicdriver](https://www.fab.com/ja/listings/a3e2fc1f-2aaa-49a1-bc26-4d5d38f7d82f)|3|20241212|ロジックのシステム|[docs](https://logicdriver.com/docs/pages/prochangelog/)| +|[dragon ik plugin](https://www.fab.com/ja/listings/d3f8d256-d8d9-4d27-91c1-c61e55e984a6)|3|20250122|animをターゲットに追従|[docs](https://dragonik.eternalmonke.com/)| +|[superhero flight animations](https://www.fab.com/ja/listings/41185c19-5191-4153-8293-8cc9901efa95)|2|20241217|空を飛ぶシステム|| +|[clazy runner action pack](https://www.fab.com/ja/listings/3f4f4475-c9d1-46e8-992c-4a8f3aff58ed)|1|20240518|ダッシュのシステム|| +|[rts camera system](https://www.fab.com/ja/listings/d063c9c9-6df3-4eeb-b7f3-797b5507379e)|1|20231123|カメラシステム|[docs](https://docs.google.com/document/d/e/2PACX-1vQevvLmKDkw0Z6okftdwGCTTLYOYFO-71mvyV6co4wN8oMuJFJDQAGXCx4CckKcpd-FQEUz5i8QHeQS/pub)| +|[space frontier stations & ships](https://www.fab.com/listings/79323b40-dc56-43bf-8aea-b13800266329)|1|20241114|宇宙船のシステム|[docs](https://docs.google.com/document/d/1p5MY13cpTlVtqP7sCQpAoE_k5VHklmndZ4cHeBy105Y/)| +|[replicated interaction kit vol 3](https://www.fab.com/ja/listings/3ce13688-fd10-462f-b90d-964c85a090ad)|1|20241115|椅子に座るシステム|| +|[ocean waves](https://www.fab.com/ja/listings/bfb5c9f8-4e57-4cbe-8273-c88540965412)|1|20241217|惑星の海を作る|[docs](https://www.youtube.com/playlist?list=PLvRH9sjZUdXfuLpvStHfpKyESQoOq28R7)| +|[overlay outline material](https://www.fab.com/ja/listings/5d42ff7a-6198-4443-b1a1-eb60348407fe)|1|20241124|アウトラインのエフェクト|| +|[worldscape plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2)|1|5.4|惑星を構築するplugin|[docs](https://iolacorp-1.gitbook.io/worldscape-plugin)| + +`rank`は更新頻度(追加)や価格から判断されます。`3`のassetがオススメです。 + +## アセット購入の基本 + +私のasset購入の基本指針を紹介します。 + +- saleのときだけ購入する + +saleのときだけ購入するようにします。それ以外で購入することはありません。年末のsaleがおすすめです。 + +- mapは購入しない + +mapを見ていると買いたくなるのはわかります。しかし、mapのassetは購入すべきではありません。無料で使えるものがたくさんありますし、ゲームの本質ではないので、完成後に購入するか、付属品を使うようにします。 + +- 高いassetを購入しない + +高いものには良いものもあります。が、良くないもの、使えないものもたくさんあります。最初は手を出すべきではありません。安くて良いassetがたくさんあります。高いものより結局そっちを使うことになることのほうが多いです。ある程度わかってきたら購入するのはいいかもしれません。その際は独自性を見るようにしています。 + +- 長らく更新されているassetを購入する + +更新されていないものを購入してもいずれ動かなくなります。 + +- 作者を確認する + +assetを購入する際は必ず作者を確認してください。他にどのようなassetを出しているか、評価はどうか、今も活動しているかがわかります。 + +- 機能をまとめる + +使うassetは少なければ少ないほど良いです。依存関係は少なくしましょう。`epic games`が提供するdefault(デフォルト)のものだけで作るのが一番ですが、それだけでは時間がかかったり、クオリティが低かったりします。そんなとき有料assetに頼ることになります。しかし、「使うassetを少なくする」のは有効です。シンプルな設定で使えるもの、たくさんの機能をまとめて使えるものがオススメです。 + +## 検討中 + +|name|latest|body|docs| +|---|---|---|---| +|[mocap tools](https://www.fab.com/ja/listings/7608fd4d-4c2c-40be-9a06-274e6f7ef6cc)|5.4|root motionの修正|[docs](https://docs.google.com/document/d/1OVx8H7VGQ1_XdaPFxRNlVYDktbdolx7KWTXBbxJLyac/)| + diff --git a/book/project/01_ep.md b/book/project/01_ep.md new file mode 100644 index 0000000..983a5ad --- /dev/null +++ b/book/project/01_ep.md @@ -0,0 +1,122 @@ +# 自己紹介 + +自己紹介では、自分の紹介と、何をやっているか、何をやっていきたいかを明確にします。 + +長くてはいけません。できれば1行で動画の枠に収まるよう短くします。配色も考えておきます。 + +## 名前 + +`syui`という名前で活動していること。youtubeチャンネルが`syai`となっている理由。`syui`という名前は既に他の人が使っており、選択できなかったので、使用するキャラクターの`ai`を合体させた名前。または`syui.ai`というドメインの略。 + +[youtube](/project/01_youtube.html)に関しては、ゲーム制作を紹介したり、活動していく上で必要かもしれないので、考えを残しておくことにします。 + +## ゲーム開発 + +目指すゲームは、現実をゲームに反映すること。 + +最初に取り掛かったのはゲーム作りそのものではなく、現実をゲームに反映するためのアカウントシステムを考えることだった。 + +## なぜアカウントが重要 + +これからのゲームは、ゲーム性よりも、より個人に近いアカウントが重要になると考えている。 + +どれほどすごいゲーム、面白いゲームでも、その記録が残らないのは悲しい。 + +ゲーム作りで最も重要、最初に始めるべきことはなんだろう。 + +私は記録(を残す)システムを作ることだと思った。 + +より現実の個人に近いアカウントにゲームプレイの内容が反映される方法を考え、実装することにした。 + +## 記録装置を作ったあとは + +記録するシステム、つまりアカウントシステムを作ったあとは、特徴のあるゲームを作ろうと思った。 + +特徴のあるゲームとは「このゲームは何なのか、他のゲームとの違いは」を一言で表すことができる。 + +例えば、立ち絵一つで表現できればそれで合格だと思っている。ゼルダや原神、ゲームのパッケージを見れば作品のことがひと目で分かる。 + +既存のゲームをそのまま真似してそっくりなものを作っても意味がない。 + +誰にでも好きなものはあるはずで、原点がある。それは普遍的、自然的なもの。そういったものの組み合わせ。 + +私の場合は`宇宙`だった。宇宙とアイ、一枚の青写真を描いた。 + +## 宇宙とアイ + +ゲームは基本的に平面で作られていて、それはどこまで行っても地平線が広がっているだけの世界。月や太陽があっても背面の絵を動かしているだけだったりする。 + +このゲームは現実の反映を目指している。だからマップを作る際も現実に合わせた形にすることを目指す。空の上を高く高く飛んでいくと、そこには大気圏が広がり、それを抜けると宇宙に出られる。そこには実際に行ける月があり、太陽がある。全てはつながっていて、そこに行くことができる世界を目指します。これを`planet system`と呼んでいる。 + +ゲームプレイ中に行けないような場所、見えないようなところもちゃんと作る。そのような思いで開発に取り組む。 + +## 体験はどこに + +体験はどこに帰属し、どこにあるのだろう。 + +私は、プレイヤーが持つ唯一性だと思う。だから、このゲームでは、プレイヤーはゲーム内で唯一性を持つようにしたいと考えている。 + +しかし、これは難しい。よって、現実的に可能な範囲で、プレイヤーがゲーム内で唯一性を持てるようにすること。現実世界とゲームを強く結びつけることを目指していきたい。 + +例えば、ゲーム内キャラクター追加に関するルールがある。vtuberのような個人モデルを持つ者が申請でき、申請が通ると新たなキャラクターが追加される。キャラクターは原則通りの1攻撃、1スキル、1バーストというステータスを持つ。ただし、本人にしか使えないユニークスキルがあり、それは一人のプレイヤーにしか使えない。 + +## システム + +現在作っているシステムを紹介。システム名は今後変更されるかもしれない。 + +- `at system`: atproto(atmosphere)を採用するアカウントシステム +- `yui system`: プレイヤーの唯一性を担保するためのシステム +- `ai system`: キャラクターの属性に関するシステム。キャラクターは1つの属性を持つ。原子、陽子、中性子など。 +- `planet system`: 宇宙の物理方式(マップ)を目指すシステム + +## 物語 + +物語はこの世界で最も小さい物質の探求から始まる。 + +量子というものがある。観測すると結果が変わるらしい。でもじつは違う。結果が変わるのは物質が当たるからだ。物質が当たると結果が変わるのは当然のこと。物質を小さくしていくと、それは意識の領域に到達する。それは物質でもあり、意識でもあった。特に違いはない。そして、これ以上分割できない最小単位、この世界で最も小さい物質を「存在の意識」という。つまり、物質は意識が集まってできている。これをアイと名付けよう。 + +キャラクターの属性について + +各属性は1つの次属性と関連反応を起こし、ダメージ倍率が変換します。属性には原子核、陽子、電子、中性子、アクシオン、クォークなどがあります。 + +```json +{ + "system": { + "text": "各システムの名前と概要", + "body": "現実をゲームに反映", + "enum": [ "ai", "yui", "at", "planet","story" ], + "ai": { + "text": "ability", + "lang": { + "ja": "属性" + }, + "body": "キャラクターの属性。キャラクターは1属性を持つ", + "enum": [ "ai", "yui", "axion", "quark", "atom", "proton", "neutron", "atomic", "electron" ] + }, + "yui": { + "text": "unique", + "lang": { + "ja": "唯一性" + }, + "body": "プレイヤーの唯一性。ユニークスキル" + }, + "at": { + "text": "account", + "lang": { + "ja": "アカウント" + }, + "body": "ゲームのプレイ履歴はat protocolのpdsに保存される", + "tag": [ "atproto", "atmosphere", "@", "bluesky" ] + }, + "planet": { + "text": "map", + "lang": { + "ja": "マップ" + }, + "body": "惑星形式でマップを作る" + } + } +} +``` + + diff --git a/book/project/01_youtube.md b/book/project/01_youtube.md new file mode 100644 index 0000000..1bb6acf --- /dev/null +++ b/book/project/01_youtube.md @@ -0,0 +1,27 @@ +# youtube + +youtubeに投稿するとしたら、どのような内容がいいのかを考え、その下書きを投稿することにします。 + +1. 成功より失敗を見せる +2. 完成より進捗を見せる +3. 文字と配色 +4. 投稿の継続 + +## 成功より失敗を見せる + +正確に言うと配信者が行う配信内容は、成功したことより、失敗したことを見せるほうが重要だと感じます。 + +そして、ただ失敗を見せるのではなく、見せ方も大切です。 + +つまり、失敗したことを笑い話に変え話すこと、そういった演出が視聴者が面白いと思うポイントだと感じます。 + +実際の例でいうと、unrealengineの解説動画を検索すると、より多く再生された動画が表示されます。そして、ただ解説しているだけ、成功した実装を見せるだけの動画よりも、うまくいかなかったゲーム開発のシーンを面白おかしく見せているだけの動画のほうが、より多く再生されているようです。また、私が視聴して面白いと思う動画もこのタイプになります。 + +## 完成より進捗を見せる + +視聴者といっしょにゴールに向かっている感じがいいと思いました。 + +配信者の技術が完成されたあと、それを教えるという方向性の動画よりも、配信者はまだまだ成長過程で、その成長する姿を見てもらう、視聴者とともに成長していく、という方向性の動画のほうが面白いと感じます。 + +その他重要な要素として、`文字と配色`や`投稿の継続`が挙げられます。 + diff --git a/book/project/02_ep.md b/book/project/02_ep.md new file mode 100644 index 0000000..c447985 --- /dev/null +++ b/book/project/02_ep.md @@ -0,0 +1,72 @@ +# 最初の体験 + +どんな作品でも一番重要なのが第一話だと思う。それはゲームであっても変わらない。 + +だからゲーム開発では、最初の体験にそのゲームのすべてを詰め込まなければならない。 + +ただ詰め込むだけではなく、そのゲームでできることや考え方、何を楽しめばいいのかをプレイヤーにちゃんと伝えるということ。 + +このゲームではミッション(mission)というシステムを作り実現を目指す。ゲームを開始するとミッションがあり、ミッションをクリアするまでが第一話となる。 + +```json +{ + "system": { + "enum": [ "ai", "yui", "at", "planet", "mission" ], + "mission": { + "text": "story", + "lang": { + "ja": "物語" + }, + "body": "物語はこの世界で最も小さい物質の探求から始まる" + } + } +} +``` + +## 最初のミッションは月に行くこと + +プレイヤーは最初、アイというキャラクターを扱うことになる。物語があり、アイを使って月に行き、ボスを倒すとクリアとなる。 + +ボスのドロップアイテムは個人のsnsアカウントに保存される。と同時にゲーム内でも確認できる。例えば、アイの家には白い机と椅子があり、獲得したものは机に置かれる。 + +ここまでで、このゲームではどんな事ができるのか、何をテーマにしているのか伝えることができると思う。 + +1. blueskyのアカウントでログイン +2. ミッション月に行く +3. ボス戦 +4. 獲得したアイテムをアカウントに反映 + +ちなみに、物語はこんな構成(シーン)を考えている。 + +> 幻獣(動物)たちが宇宙船の中にある檻に入れられているようだ。黄色い光が窓の外に見えたような気がした。 +> +> 「ぼくたちどうなっちゃうのかな」「あれ、今なんか光ったよ」「お前そんなこと言ってる場合か」 +> +> 動物たちはお互いを知っているようだった。 +> +> しばらくすると、船内、外の見張りがざわつきだした。 +> +> 「おい、あれが出たって?交渉はどうなってる」と慌てている様子だ。 +> +> 船内が大きく揺れ、遠くで爆発が起こる。 +> +> そして、地面が傾き、宇宙船は下の星に落ちていった。 +> +> 動物たちは小さな浜辺にいた。橋が見える。大きな街があるようだ。 +> +> 「助けを求めよう」「でも怖い人達だったらどうしよう」 +> +> そんな話をしながら橋を歩いた。 +> +> するとみすぼらしい身なりの人間の子供が道路の真ん中で寝転んでいる。寝ているようだ。 +> +> 「あれこんなところに人がいるよ」「こんな子どもが放置されてるなんて、この星は大丈夫か」「え、きみあれが人間の子供だってよくわかったね。ぼくなんてみんな同じに見える」 +> +> 動物たちは寝ている子どもを通り越して街に向かった。 +> +> 数時間前...。 +> +> ドライ「ねえ、ぼくのいとこが誘拐されたみたいなんだ。今君がいるところの上の方を飛んでるらしい。なんとかしてよ」 +> +> アイ「うん、いいよ」 + diff --git a/book/project/03_ep.md b/book/project/03_ep.md new file mode 100644 index 0000000..71c058c --- /dev/null +++ b/book/project/03_ep.md @@ -0,0 +1,7 @@ +# 自分が毎日プレイするゲーム + +私は、昔、pokemongoというゲームをやっていた。その後、原神を始め、今でもプレイしている。とても素晴らしいゲームだと思う。 + +けど、最近、全く不満はないのに何故かやる気が無くなってきているのを感じる。おそらく、次にやるゲームを探しているのだろう。そういう時期だと思う。 + +自分が毎日遊ぶゲームには何が必要なのだろう。 diff --git a/book/project/04_ep.md b/book/project/04_ep.md new file mode 100644 index 0000000..275b696 --- /dev/null +++ b/book/project/04_ep.md @@ -0,0 +1,10 @@ +# 自由と不自由 + +ゲームは自由であればあるほどつまらなく、不自由であればあるほど面白くなります。もちろん、程度の問題ですが、基本的にこのような原理で動きます。 + +現在、キャラクターを新しくゲームに追加する際のルールを考えています。 + +## キャラクターの統一感 + +統一感あるキャラクターを追加する方式のほうがいいと考えています。 + diff --git a/book/project/README.md b/book/project/README.md new file mode 100644 index 0000000..86b6d1e --- /dev/null +++ b/book/project/README.md @@ -0,0 +1,4 @@ +# project + +ここではゲーム制作における自分の考えをまとめます。 + diff --git a/book/ue.json b/book/ue.json new file mode 100644 index 0000000..e0b5e60 --- /dev/null +++ b/book/ue.json @@ -0,0 +1,53 @@ +{ + "system": { + "text": "各システムの名前と概要", + "body": "現実をゲームに反映", + "enum": [ "ai", "yui", "at", "planet" ], + "ai": { + "text": "ability", + "lang": { + "ja": "属性" + }, + "body": "キャラクターの属性。キャラクターは1属性を持つ", + "enum": [ "ai", "yui", "axion", "quark", "atom", "proton", "neutron", "atomic", "electron" ] + }, + "yui": { + "text": "unique", + "lang": { + "ja": "唯一性" + }, + "body": "プレイヤーの唯一性。ユニークスキル" + }, + "at": { + "text": "account", + "lang": { + "ja": "アカウント" + }, + "body": "ゲームのプレイ履歴はat protocolのpdsに保存される", + "tag": [ "atproto", "atmosphere", "@", "bluesky" ] + }, + "planet": { + "text": "map", + "lang": { + "ja": "マップ" + }, + "body": "惑星形式でマップを作る" + }, + "mission": { + "text": "story", + "lang": { + "ja": "物語" + }, + "body": "物語はこの世界で最も小さい物質の探求から始まる", + "episode": { + "1": { + "body": "幻獣たちが宇宙船の中にある檻に入れられている。黄色い閃光が窓の外に見えた気がした。 \n「ぼくたちどうなっちゃうのかな」「あれ、今なんか光ったよ」「お前そんなこと言ってる場合か」 \n動物たちはお互いを知っているようだ。 \nしばらくすると、外の見張りがざわつきだした。 \n「おい、あれが出たって?交渉はどうなってる」と慌てている様子だ。 \n船内が大きく揺れ、遠くで爆発が起こる。 \nそして、地面が傾き、宇宙船は下の星に落ちていった。 \n動物たちは小さな浜辺にいた。橋が見える。大きな街があるようだ。 \n「助けを求めよう」「でも怖い人達だったらどうしようか」 \nそんな話をしながら橋を歩いていた。 \nするとみすぼらしい身なりの人間の子供が道路の真ん中で寝転んでいる。寝ているようだ。 \n「あれこんなところに人がいるよ」「こんな子どもが放置されてるなんて、この星は大丈夫か」「え、きみあれが人間の子供だってよくわかったね。ぼくなんてみんな同じに見えるよ」 \n動物たちは寝ている子どもを通り越して街に向かった。 \n数時間前...。 \nドライ「ねえ、ぼくのいとこが誘拐されたみたいなんだ。今君がいるところの上の方を飛んでるらしい。なんとかできない?」 \nアイ「うん、いいよ」", + "boss": { + "name": "mech", + "drop": "coin" + } + } + } + } + } +} diff --git a/book/unity/01_fbx.md b/book/unity/01_fbx.md new file mode 100644 index 0000000..692edd6 --- /dev/null +++ b/book/unity/01_fbx.md @@ -0,0 +1,25 @@ +# animation clipをueで使う + +## fbxでexportする + +unityのmotionはanimation clipといいます。fbxでexportするには`fbx`, `recorder`を使います。 + +1. `.vrm`を読み込みます。vrmを読み込むpackage(plugin/addon)を追加してください。 +2. Sceneにmodel(object)をD&Dします。 +3. animation clipをmodelにD&Dします。すると、Animatorが追加されます。具体的には`Entry -> Animation Clip`になります。再生するとmotionが再生されます。 +4. package-managerの`unity registry`でfbxとrecorderを検索し、packageをinstallします。 +5. `Window -> General -> Recorder -> Recorder Window -> Add: FBX`を追加します。 +6. GameObjectの欄にmodelをD&Dします。そして、Start Recordingを実行します。止めると`.fbx`が保存されます。 + +## vrmaでexportする + +ueでfbxをimportしてもリターゲットが設定されていません。これは非常に面倒です。したがって、`.vrma`でexportして、ue(vrm4u)で読み込む方法があります。 + +今回は、原神やProject Mugenなどに出てくる通称、アラレちゃん走りを作ってみます。 + +https://booth.pm/ja/items/2845548 + +1. unityの[AnimationClipToVrmaSample](https://github.com/malaybaku/AnimationClipToVrmaSample)を使って`.vrma`にexportする。 +2. `${model}/RTG_UEFN_${animation_clip}`を開く。この際、`ルートボーンに垂直オフセットを適用`します。 +3. そこでグローバル設定にて`ルートを有効化`のチェックを外します。そして、animをexportします。 + diff --git a/book/unity/README.md b/book/unity/README.md new file mode 100644 index 0000000..c81d091 --- /dev/null +++ b/book/unity/README.md @@ -0,0 +1,13 @@ +# unity + +[unity](https://unity.com/ja) + +unityを開いて、package-managerを起動し、名前で検索してください。 + +|package|body| +|---|---| +|https://github.com/vrm-c/UniVRM|vrmを読み込む| +|https://github.com/malaybaku/AnimationClipToVrmaSample|animation clipをvrmaにexportする| +|fbx|fbxをimport/exportする| +|recorder|animation clipをexportする| + diff --git a/book/vrm4u/01_make.md b/book/vrm4u/01_make.md new file mode 100644 index 0000000..57f0aac --- /dev/null +++ b/book/vrm4u/01_make.md @@ -0,0 +1,18 @@ +# キャラクターを作る + +ueで読み込むには`vrm4u`というpluginを使用します。 + + + +1. [vrm4u](https://github.com/ruyo/VRM4U/releases)をダウンロード(download)して、`$project/Plugins`に入れる。 +> $project/Plugins/VRM4U/VRM4U.uplugin +2. editorのファイルエクスプローラーでモデルファイルの`.vrm`をD&Dします。色々と聞かれますが適当にokや選択します。配色タイプが聞かれます。例えば、`$project/Content/Characters`に`model`フォルダを作り`model.vrm`をimport(インポート)した場合で解説します。 +> $project/Content/Characters/$model + +モデル(model)は[こちら](https://hub.vroid.com/users/36144806)からdownloadすることができます。私は、`vrm 1.0`を使用ていますが、`vrm 0.0`のほうが安定しています。 + +重要なファイルは`$project/Content/Characters/$model/SK_$model`, `ABP_Post_$model`, `RTG_UEFN_$model`になります。 + +https://vrm.dev/vrm1/ + + diff --git a/book/vrm4u/02_yubi.md b/book/vrm4u/02_yubi.md new file mode 100644 index 0000000..a2a30a8 --- /dev/null +++ b/book/vrm4u/02_yubi.md @@ -0,0 +1,6 @@ +# 指の角度を調整する + +`RTG_UEFN_$model`で調整します。各指にある線を選択して値を変更します。 + +- `回転アルファ:0.5` + diff --git a/book/vrm4u/03_hair.md b/book/vrm4u/03_hair.md new file mode 100644 index 0000000..623f2a7 --- /dev/null +++ b/book/vrm4u/03_hair.md @@ -0,0 +1,69 @@ +# 前髪の角度を調整する + +前髪が少し浮き上がっていたので、角度を調整する方法を紹介します。 + +これは`/Content/Character/$model/VM_${model}_VrmMeta`で調整します。具体的には以下のような値にすればいいでしょう。 + +```json +[ + { + "bone Name": "J_Sec_Hair1_03", + "Hit Radius": 0 + }, + { + "bone Name": "J_Sec_Hair2_03", + "Hit Radius": 0.01 + }, + { + "bone Name": "J_Sec_Hair3_03", + "Hit Radius": 0.01 + } +], +[ + { + "bone Name": "J_Sec_Hair1_04", + "Hit Radius": 0 + }, + { + "bone Name": "J_Sec_Hair2_04", + "Hit Radius": 0.01 + }, + { + "bone Name": "J_Sec_Hair3_04", + "Hit Radius": 0.01 + } +], +[ + { + "bone Name": "J_Sec_Hair1_05", + "Hit Radius": 0 + }, + { + "bone Name": "J_Sec_Hair2_05", + "Hit Radius": 0.01 + }, + { + "bone Name": "J_Sec_Hair3_05", + "Hit Radius": 0.01 + } +] +``` + +飛行時に髪が爆散する問題は以下です。 + +```json +{ + "bone Name": "J_Sec_Hair2_03", + "Hit Radius": 0.0 +}, +{ + "bone Name": "J_Sec_Hair1_09", + "Hit Radius": 0.01 +}, +{ + "bone Name": "J_Sec_Hair1_10", + "Hit Radius": 0.01 +} +``` + + diff --git a/book/vrm4u/04_outline.md b/book/vrm4u/04_outline.md new file mode 100644 index 0000000..3330111 --- /dev/null +++ b/book/vrm4u/04_outline.md @@ -0,0 +1,8 @@ +# アウトラインを追加する + +アウトライン(outline) + +1. `/Content/Blueprints/RetargetedCharacters/CBP_SandboxCharacter_$model`を作成します。前と同じ要領で新しいキャラクターを追加し、GASPで使えるようにします。 +2. componentで`BP_VrmOutlineComponent`を追加します。 + + diff --git a/book/vrm4u/05_toon.md b/book/vrm4u/05_toon.md new file mode 100644 index 0000000..bdde15c --- /dev/null +++ b/book/vrm4u/05_toon.md @@ -0,0 +1,10 @@ +# トーンを変える + +これには様々なやり方が存在します。 + +私はcomponentの`VrmPoseableMesh`を追加して、そこに配色タイプの`custom`を当てることで調整しています。ベースは配色タイプの`unlit`を使用します。もし`unlit`で`.vrm`をimportしていない場合は再度importしてください。 + +1. アセットブラウザで`All/Plugins/`を見えるようにします(プラグインコンテンツを表示)。 +2. `/All/Plugins/VRM4U/Util/Actor/PostShadow/BP_PoseCopyToon`と`/All/Content/Blueprints/Characters/${name}/SK_${name}`をmapに配置します。そして、`BP_PoseCopyToon`に`SK_${name}`を選択します。 +3. `/All/Plugins/VRM4U/Util/Actor/PostShadow/MI_PostToon`が更新されているので`/All/Plugins/VRM4U/ImportData/DS_VRMCustom`を開いて、全部をMI_PostToonにする +4. `.vrm`を`custom`で読み込む。そして、`/All/Content/Blueprints/CBP_SandboxCharater`のcomponentで`Vrm Poseable Mesh`を追加して、`custom/SK_${name}`を選択します。 diff --git a/book/vrm4u/README.md b/book/vrm4u/README.md new file mode 100644 index 0000000..93fbd7f --- /dev/null +++ b/book/vrm4u/README.md @@ -0,0 +1,6 @@ +# vrm4u + +[vrm4u](https://github.com/ruyo/VRM4U)の使い方を紹介します。 + +`vrm4u`は`.vrm`をimportするためのpluginです。`.vrm`は[vroid](https://vroid.com/)などから作成します。 + diff --git a/book/web/01_three.md b/book/web/01_three.md new file mode 100644 index 0000000..0eafc4d --- /dev/null +++ b/book/web/01_three.md @@ -0,0 +1,213 @@ +# three.js + +reactの`tsx`で書きます。 + +```sh +$ npx create-react-app galaxy --template typescript +``` + +これで準備はできましたが、設定ファイルを見てみます。 + +> tsconfig.json + +```json +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src" + ] +} +``` + +`es5`, `react-jsx`を使っているようです。 + +buildなどはwebpackではなく`react-scripts`ですね。 + +> package.json + +```json + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + } +``` + +> src/App.tsx + +```ts +import React from 'react'; +import './App.css'; +import { ThreeFiberGalaxy } from './pages/galaxy'; + +function App() { + return +} + +export default App; +``` + +> src/pages/galaxy.tsx + +```ts +// https://gist.github.com/artokun/fb7f0c68a01ba5d9813abb3ccce254c4 + +import * as THREE from 'three' +import { Points, useGLTF } from '@react-three/drei' +import { GLTF } from 'three-stdlib' +import { useFrame, Canvas } from '@react-three/fiber' +import { useMemo, useRef } from 'react' +import { EffectComposer, SelectiveBloom } from '@react-three/postprocessing' + +type GLTFResult = GLTF & { + nodes: { + Object_2: THREE.Mesh + } + materials: { + ['Scene_-_Root']: THREE.PointsMaterial + } +} + +export function Galaxy(props: JSX.IntrinsicElements['group']) { + const ref = useRef(null!) + const galaxyCenterLightRef = useRef(null!) + const { nodes } = useGLTF('./models/galaxy.glb') as GLTFResult + const [positions, colors] = useMemo(() => { + nodes.Object_2.geometry.center() + const positions = new Float32Array( + nodes.Object_2.geometry.attributes.position.array.buffer + ) + const colors = new Float32Array(positions.length) + + const getDistanceToCenter = (x: number, y: number, z: number) => + Math.sqrt(x * x + y * y + z * z) + + // make colors closer to 0,0,0 be more reddish and colors further away be more blueish + const color = new THREE.Color() + for (let i = 0; i < positions.length; i += 3) { + const x = positions[i] + const y = positions[i + 1] + const z = positions[i + 2] + const distanceToCenter = getDistanceToCenter(x, y, z) + const normalizedDistanceToCenter = distanceToCenter / 100 + + // make colors closer to 0,0,0 be more reddish and colors further away be more blueish (do not use hsl) + // color.setHSL( + // (0.15 * (0.21 + Math.cos(distanceToCenter * 0.02))) / 2, + // 0.75, + // 0.6 + // ) + color.setRGB( + Math.cos(normalizedDistanceToCenter), + THREE.MathUtils.randFloat(0, 0.8), + Math.sin(normalizedDistanceToCenter) + ) + color.toArray(colors, i) + } + + return [positions, colors] + }, [nodes]) + //const starTexture = useLoader(THREE.TextureLoader, '/star.png') + + // slowly rotate the galaxy + useFrame(({ clock }) => { + ref.current.rotation.z = clock.getElapsedTime() / 5 + // zoom in and out + // ref.current.scale.setScalar(Math.sin(clock.getElapsedTime() / 2) + 1.5) + }) + + // make particles glow + + return ( + + + + + + + + + + ) +} + +useGLTF.preload('./models/galaxy.glb') +``` + +`App.tsx`で読み込むため以下を追記します。 + +> src/pages/galaxy.tsx + +```ts +export const ThreeFiberGalaxy = () => { + return ( + + + + + + ) +} +``` + +`.glb`は[こちら](https://sketchfab.com/3d-models/need-some-space-d6521362b37b48e3a82bce4911409303)からダウンロードして、`public/models/galaxy.glb`に置いてください。 + +```sh +$ npm run start +``` + +controlを追加します。 + +```sh +import { Points, useGLTF, OrbitControls } from '@react-three/drei' + +export const ThreeFiberGalaxy = () => { + return ( + + + + + + + ) +} +``` + diff --git a/book/web/02_three-vrm.md b/book/web/02_three-vrm.md new file mode 100644 index 0000000..8dac41d --- /dev/null +++ b/book/web/02_three-vrm.md @@ -0,0 +1,212 @@ +# three-vrm + +今回は`react-three-fiber`と`three-vrm-animation`を使います。 + +react-three-fiberはsceneなどを自動でやってくれて、コードもシンプルになります。 + +> `react-three-fiber`で書く場合に`.vrma`の動きがおかしくなりました。私の環境では`unity + vrm 1.0`でexportしたものを使うと正常に動きました。 + +```sh +$ npx create-react-app vrm-model --template typescript +$ npm i +$ npm run start +``` + +> src/pages/vrm-model.tsx + +```ts +import * as THREE from 'three' +import React, { useState, useEffect, useRef } from 'react'; +import { OrbitControls } from '@react-three/drei' +import { useFrame, Canvas } from '@react-three/fiber'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; +import { VRM, VRMUtils, VRMLoaderPlugin } from '@pixiv/three-vrm'; +import { VRMAnimationLoaderPlugin, VRMAnimation, createVRMAnimationClip } from "@pixiv/three-vrm-animation"; + +interface ModelProps { + url: string + url_anim: string +} + +const VRMModel: React.FC = ({ url, url_anim }) => { + + const [vrm, setVrm] = useState(null); + const mixerRef = useRef(null); + + useEffect(() => { + const loader = new GLTFLoader(); + loader.register((parser) => new VRMLoaderPlugin(parser)); + loader.register((parser) => new VRMAnimationLoaderPlugin(parser)); + loader.load(url, (gltf) => { + const vrmModel = gltf.userData.vrm as VRM; + VRMUtils.removeUnnecessaryJoints(vrmModel.scene); + setVrm(vrmModel); + const mixer = new THREE.AnimationMixer(vrmModel.scene); + mixerRef.current = mixer; + loader.load(url_anim, (animGltf) => { + const vrmAnimations = animGltf.userData.vrmAnimations as VRMAnimation[]; + if (vrmAnimations && vrmAnimations.length > 0) { + const clip = createVRMAnimationClip(vrmAnimations[0], vrmModel); + mixer.clipAction(clip).play(); + } + }); + }); + }, [url, url_anim]); + + useFrame((state, delta) => { + if (mixerRef.current) mixerRef.current.update(delta); + if (vrm) vrm.update(delta); + }); + + return vrm ? : null; +}; + +export const VRMModelCanvas = () => { + return ( +
+ + + + + + + + + + + + +
+ ) +} +export default VRMModelCanvas; +``` + +重要な箇所は以下のポイントです。 + +```html + +``` + +ファイルはこの場所から読み込みますので、ダウンロードする場合は[.vrm](https://vroid.pixiv.help/hc/ja/articles/31627266179865-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84), [.vrma](https://booth.pm/ja/items/5512385)をここに置きます。 + +> src/App.tsx + +```ts +import React from 'react' +import VRMModelCanvas from './pages/vrm_model' + +const App = () => { + return ( + + ) +} + +export default App; +``` + +> package.json + +```json +{ + "name": "vrm-model", + "version": "0.1.0", + "private": true, + "dependencies": { + "@pixiv/three-vrm": "^3.0.0", + "@pixiv/three-vrm-animation": "^3.0.0", + "@react-three/drei": "^9.109.2", + "@react-three/fiber": "^8.16.8", + "@react-three/postprocessing": "^2.16.2", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.104", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/three": "^0.167.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-scripts": "5.0.1", + "three": "^0.167.1", + "three-stdlib": "^2.30.5", + "typescript": "^4.9.5", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} +``` + +> tsconfig.json + +```json +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src" + ] +} +``` + diff --git a/book/web/README.md b/book/web/README.md new file mode 100644 index 0000000..eb6adb6 --- /dev/null +++ b/book/web/README.md @@ -0,0 +1,13 @@ +# web + +webで動くゲームを開発する技術を紹介します。 + +3Dモデルには様々な形式があります。ここでは`.glb`, `.vrm`を扱います。 + +これらをwebに表示することができます。例えば、[tyrano builder](https://b.tyrano.jp/)と組み合わせノベルゲームを作成できます。 + +|url|body| +|---|---| +|https://github.com/mrdoob/three.js/|3Dモデルをwebに表示| +|https://github.com/pixiv/three-vrm/|vrmをthree.jsで扱う| + diff --git a/github/PixelStreamingInfrastructure/Public/player.html b/github/PixelStreamingInfrastructure/Public/player.html new file mode 100644 index 0000000..59b073e --- /dev/null +++ b/github/PixelStreamingInfrastructure/Public/player.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + Pixel Streaming + + + + + + + + + diff --git a/github/restreamer/compose.yaml b/github/restreamer/compose.yaml new file mode 100644 index 0000000..3639ad8 --- /dev/null +++ b/github/restreamer/compose.yaml @@ -0,0 +1,13 @@ +services: + + restreamer: + image: datarhei/restreamer + #image: datarhei/restreamer:cuda-latest + ports: + - 8080:8080 + - 1935:1935 + - 6000:6000/udp + restart: always + volumes: + - ./data/config:/core/config + - ./data/data:/core/data diff --git a/github/rust-bbs/Cargo.toml b/github/rust-bbs/Cargo.toml new file mode 100644 index 0000000..b950790 --- /dev/null +++ b/github/rust-bbs/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rust-bbs" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix-web = "4.0" +url = "2.3.1" +rusqlite = { version = "0.28", features = ["bundled"] } +serde = { version = "1.0", features = ["derive"] } +askama = "*" diff --git a/github/rust-bbs/Dockerfile b/github/rust-bbs/Dockerfile new file mode 100644 index 0000000..658c0fa --- /dev/null +++ b/github/rust-bbs/Dockerfile @@ -0,0 +1,8 @@ +FROM syui/aios + +WORKDIR /app +COPY ./src ./src +COPY ./templates ./templates +COPY ./Cargo.toml ./Cargo.toml +RUN cargo build --release +CMD ["/app/target/release/rust-bbs"] diff --git a/github/rust-bbs/compose.yml b/github/rust-bbs/compose.yml new file mode 100644 index 0000000..d4e3dd7 --- /dev/null +++ b/github/rust-bbs/compose.yml @@ -0,0 +1,7 @@ +services: + web: + build: . + ports: + - 8080:8080 + volumes: + - ./sqlite.db:/app/sqlite.db diff --git a/github/rust-bbs/src/main.rs b/github/rust-bbs/src/main.rs new file mode 100644 index 0000000..a970690 --- /dev/null +++ b/github/rust-bbs/src/main.rs @@ -0,0 +1,127 @@ +use askama::Template; +use serde::{Deserialize, Serialize}; +use rusqlite::{Connection, Result as SqliteResult}; +use actix_web::{web, App, HttpServer, HttpResponse, Responder, HttpRequest, Error}; +use actix_web::error::{ErrorInternalServerError}; + +use std::fmt; +impl fmt::Display for Post { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "@{} {}", self.handle.as_deref().unwrap_or("anonymous"), self.content) + } +} + +#[derive(Deserialize, Default)] +struct QueryParams { + handle: Option, +} +#[derive(Serialize, Deserialize)] +struct Post { + id: i32, + handle: Option, + content: String, +} + +#[derive(Template)] +#[template(path = "index.html")] +struct IndexTemplate { + posts: Vec, +} + +#[derive(Template)] +#[template(path = "post.html")] +struct PostTemplate {} + +fn init_db() -> SqliteResult<()> { + let conn = Connection::open("sqlite.db")?; + conn.execute( + "CREATE TABLE IF NOT EXISTS posts ( + id INTEGER PRIMARY KEY, + handle TEXT NOT NULL, + content TEXT NOT NULL + )", + [], + )?; + Ok(()) +} + +async fn index() -> impl Responder { + let conn = Connection::open("sqlite.db").unwrap(); + let mut stmt = conn.prepare("SELECT id, handle, content FROM posts ORDER BY id DESC").unwrap(); + let posts = stmt.query_map([], |row| { + Ok(Post { + id: row.get(0)?, + handle: row.get(1)?, + content: row.get(2)?, + }) + }).unwrap().filter_map(Result::ok).collect::>(); + + let template = IndexTemplate { posts }; + HttpResponse::Ok().body(template.render().unwrap()) +} + +async fn post_form() -> impl Responder { + let template = PostTemplate {}; + HttpResponse::Ok().body(template.render().unwrap()) +} + +#[derive(Deserialize)] +struct FormData { + handle: String, + content: String, +} + +async fn submit_post( + req: HttpRequest, + form: web::Form +) -> Result { + let query = web::Query::::from_query(req.query_string()) + .unwrap_or_else(|_| web::Query(QueryParams { handle: None })); + //let handle = query.handle.clone().filter(|h| !h.is_empty()); + //println!("Debug: Extracted handle: {:?}", handle); +let handle = if !form.handle.is_empty() { + form.handle.clone() +} else { + query.handle.clone().unwrap_or_default() +}; + +println!("Debug: Using handle: {:?}", handle); + + let conn = Connection::open("sqlite.db") + .map_err(|_| ErrorInternalServerError("Database connection failed"))?; + let result = conn.execute( + "INSERT INTO posts (handle, content) VALUES (?1, ?2)", + &[&form.handle, &form.content], + ); + match result { + Ok(_) => { + let redirect_url = if !handle.is_empty() { + format!("/?handle={}", handle) + } else { + "/".to_string() + }; + Ok(HttpResponse::SeeOther() + .append_header(("Location", + redirect_url)) + .finish()) + }, + + //Ok(_) => Ok(web::Redirect::to("/" + "?handle=" + handle).see_other()), + Err(_) => Err(ErrorInternalServerError("Failed to insert post")), + } +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + init_db().unwrap(); + + HttpServer::new(|| { + App::new() + .route("/", web::get().to(index)) + .route("/post", web::get().to(post_form)) + .route("/submit", web::post().to(submit_post)) + }) + .bind("0.0.0.0:8080")? + .run() + .await +} diff --git a/github/rust-bbs/templates/index.html b/github/rust-bbs/templates/index.html new file mode 100644 index 0000000..135db2c --- /dev/null +++ b/github/rust-bbs/templates/index.html @@ -0,0 +1,79 @@ + + + + Simple BBS + + +
+
+ + + +
+
+
+
    + {% for post in posts %} +
  • {{ post }}
  • + {% endfor %} +
+
+ + + + + + + diff --git a/github/rust-bbs/templates/post.html b/github/rust-bbs/templates/post.html new file mode 100644 index 0000000..0246b13 --- /dev/null +++ b/github/rust-bbs/templates/post.html @@ -0,0 +1,14 @@ + + + + New Post + + +

New Post

+
+ +
+ +
+ + diff --git a/github/slidev/.gitignore b/github/slidev/.gitignore new file mode 100644 index 0000000..52f2323 --- /dev/null +++ b/github/slidev/.gitignore @@ -0,0 +1,7 @@ +node_modules +.DS_Store +dist +*.local +.vite-inspect +.remote-assets +components.d.ts diff --git a/github/slidev/.npmrc b/github/slidev/.npmrc new file mode 100644 index 0000000..05932b8 --- /dev/null +++ b/github/slidev/.npmrc @@ -0,0 +1,3 @@ +# for pnpm +shamefully-hoist=true +auto-install-peers=true diff --git a/github/slidev/README.md b/github/slidev/README.md new file mode 100644 index 0000000..0b3e721 --- /dev/null +++ b/github/slidev/README.md @@ -0,0 +1,15 @@ +# Welcome to [Slidev](https://github.com/slidevjs/slidev)! + +To start the slide show: + +- `npm install` +- `npm run dev` +- visit + +Edit the [slides.md](./slides.md) to see the changes. + +Learn more about Slidev at the [documentation](https://sli.dev/). + +```sh +$ slidev build --base /slide +``` diff --git a/github/slidev/components/Counter.vue b/github/slidev/components/Counter.vue new file mode 100644 index 0000000..eaa6a79 --- /dev/null +++ b/github/slidev/components/Counter.vue @@ -0,0 +1,37 @@ + + + diff --git a/github/slidev/netlify.toml b/github/slidev/netlify.toml new file mode 100644 index 0000000..9f91d0e --- /dev/null +++ b/github/slidev/netlify.toml @@ -0,0 +1,16 @@ +[build] +publish = "dist" +command = "npm run build" + +[build.environment] +NODE_VERSION = "20" + +[[redirects]] +from = "/.well-known/*" +to = "/.well-known/:splat" +status = 200 + +[[redirects]] +from = "/*" +to = "/index.html" +status = 200 diff --git a/github/slidev/package.json b/github/slidev/package.json new file mode 100644 index 0000000..e069d20 --- /dev/null +++ b/github/slidev/package.json @@ -0,0 +1,17 @@ +{ + "name": "slidev", + "type": "module", + "private": true, + "scripts": { + "build": "slidev build", + "dev": "slidev --open", + "export": "slidev export" + }, + "dependencies": { + "@slidev/cli": "^0.49.29", + "@slidev/theme-default": "latest", + "@slidev/theme-seriph": "latest", + "slidev-theme-eloc": "^1.0.2", + "vue": "^3.4.38" + } +} diff --git a/github/slidev/pages/imported-slides.md b/github/slidev/pages/imported-slides.md new file mode 100644 index 0000000..3fff217 --- /dev/null +++ b/github/slidev/pages/imported-slides.md @@ -0,0 +1,27 @@ +# Imported Slides + +You can split your slides.md into multiple files and organize them as you want using the `src` attribute. + +#### `slides.md` + +```markdown +# Page 1 + +Page 2 from main entry. + +--- + +## src: ./subpage.md +``` + +
+ +#### `subpage.md` + +```markdown +# Page 2 + +Page 2 from another file. +``` + +[Learn more](https://sli.dev/guide/syntax.html#importing-slides) diff --git a/github/slidev/slides.md b/github/slidev/slides.md new file mode 100644 index 0000000..8ce5869 --- /dev/null +++ b/github/slidev/slides.md @@ -0,0 +1,135 @@ +--- +theme: eloc +class: text-center +highlighter: shiki +lineNumbers: false +info: | + ## Slidev Starter Template + Presentation slides for developers. + + Learn more at [Sli.dev](https://sli.dev) +drawings: + persist: false +transition: slide-left +title: Unreal Engine 5.5 | aiue +--- + +# `aiue` + +物語は空と海に囲まれた西の都(みやこ)からはじまる... + +--- + +## 配信で使える最新技術の紹介 + +### `unreal engine` + +- vrm4u, vmc, livelink, streaming +- chatgpt, atproto +- `ai` + `ue` + +--- + +## `unreal engine` + +- ue 5.5.0p +- ue 5.4.4 + +--- + +## `vrm4u` + +キャラクターを表示しよう + +--- + +`vmc`と`livelink`で体の動きを反映 + +- vmcはABP +- livelinkはCBP + +--- + +## `web browser` + +WBPからwebを使おう + +--- + +- widget3dをworldに表示させると画質が悪いので`EngineMaterials/Widget3DPassThrough`以外のmaterialを使います + + + +https://blueprintue.com/blueprint/-49_059w/ + +--- + +## `pixel streaming` + +webでゲーム配信や操作ができる + +```sh +$ git clone https://github.com/EpicGamesExt/PixelStreamingInfrastructure +$ cd ./PixelStreamingInfrastructure/SignallingWebServer/platform_scripts/cmd/ +$ ./Start_SignallingServer_nopublic.ps1 +``` + +--- + +## `atproto` + +blueskyが使っているprotocol + +--- + +## `game animation sample` + +キャラクターの基本操作をカスタマイズ + +--- + +## `city sample` + +人や車が動く最先端の街 + +--- + +## `ultra dynamic sky` + +- `sky atmoshpere` + `volumetric cloud` + +--- + +## `whisper` + `chatgpt` + `elevenlabs` + +キャラ設定と会話 + +- whisper : RuntimeSpeechRecognizer + +--- + +```sh +# perplexity.ai +$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \ + -H "xi-api-key: YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "text": "Hello world!", + "model_id": "eleven_monolingual_v1", + "voice_settings": { + "stability": 0.5, + "similarity_boost": 0.5 + } + }' \ + --output output.mp3 +``` + +--- + +@syui.ai + +
+ + diff --git a/github/slidev/snippets/external.ts b/github/slidev/snippets/external.ts new file mode 100644 index 0000000..40c109b --- /dev/null +++ b/github/slidev/snippets/external.ts @@ -0,0 +1,12 @@ +/* eslint-disable no-console */ + +// #region snippet +// Inside ./snippets/external.ts +export function emptyArray(length: number) { + return Array.from({ length }) +} +// #endregion snippet + +export function sayHello() { + console.log('Hello from snippets/external.ts') +} diff --git a/github/slidev/vercel.json b/github/slidev/vercel.json new file mode 100644 index 0000000..9276941 --- /dev/null +++ b/github/slidev/vercel.json @@ -0,0 +1,7 @@ +{ + "rewrites": [ + { "source": "/(.*)", "destination": "/index.html" } + ], + "buildCommand": "npm run build", + "outputDirectory": "dist" +} diff --git a/img/T__02.PNG b/img/T__02.PNG new file mode 100644 index 0000000..8b0898c Binary files /dev/null and b/img/T__02.PNG differ diff --git a/img/ai.png b/img/ai.png new file mode 100644 index 0000000..375a45f Binary files /dev/null and b/img/ai.png differ diff --git a/img/ai_make_v1.png b/img/ai_make_v1.png new file mode 100644 index 0000000..9c36787 Binary files /dev/null and b/img/ai_make_v1.png differ diff --git a/img/ai_make_v2.png b/img/ai_make_v2.png new file mode 100644 index 0000000..97d7bd6 Binary files /dev/null and b/img/ai_make_v2.png differ diff --git a/img/ai_min.png b/img/ai_min.png new file mode 100644 index 0000000..1827ea0 Binary files /dev/null and b/img/ai_min.png differ diff --git a/img/aiverse.png b/img/aiverse.png new file mode 100644 index 0000000..66c406b Binary files /dev/null and b/img/aiverse.png differ diff --git a/img/character.png b/img/character.png new file mode 100644 index 0000000..fb31001 Binary files /dev/null and b/img/character.png differ diff --git a/img/ep1.png b/img/ep1.png new file mode 100644 index 0000000..db97e19 Binary files /dev/null and b/img/ep1.png differ diff --git a/img/ep2.png b/img/ep2.png new file mode 100644 index 0000000..ecad274 Binary files /dev/null and b/img/ep2.png differ diff --git a/img/ep3.png b/img/ep3.png new file mode 100644 index 0000000..8b05fee Binary files /dev/null and b/img/ep3.png differ diff --git a/img/n.mdp b/img/n.mdp new file mode 100644 index 0000000..9829d80 Binary files /dev/null and b/img/n.mdp differ diff --git a/img/ue.mdp b/img/ue.mdp new file mode 100644 index 0000000..8c47613 Binary files /dev/null and b/img/ue.mdp differ diff --git a/img/ue.png b/img/ue.png new file mode 100644 index 0000000..5abfddb Binary files /dev/null and b/img/ue.png differ diff --git a/issue/img/issue-9-0001.png b/issue/img/issue-9-0001.png new file mode 100755 index 0000000..08389bc Binary files /dev/null and b/issue/img/issue-9-0001.png differ diff --git a/issue/img/issue-9-0002.png b/issue/img/issue-9-0002.png new file mode 100755 index 0000000..e87c6b9 Binary files /dev/null and b/issue/img/issue-9-0002.png differ diff --git a/issue/img/issue-9-0003.png b/issue/img/issue-9-0003.png new file mode 100755 index 0000000..1539db6 Binary files /dev/null and b/issue/img/issue-9-0003.png differ diff --git a/issue/img/issue-9-0004.png b/issue/img/issue-9-0004.png new file mode 100755 index 0000000..7bb0701 Binary files /dev/null and b/issue/img/issue-9-0004.png differ diff --git a/issue/img/ue-2024-10-31-151413.png b/issue/img/ue-2024-10-31-151413.png new file mode 100644 index 0000000..e8ee7f7 Binary files /dev/null and b/issue/img/ue-2024-10-31-151413.png differ diff --git a/issue/img/ue-2024-11-18-220316.png b/issue/img/ue-2024-11-18-220316.png new file mode 100644 index 0000000..cc0bad0 Binary files /dev/null and b/issue/img/ue-2024-11-18-220316.png differ diff --git a/issue/img/ue-2024-11-18-220359.png b/issue/img/ue-2024-11-18-220359.png new file mode 100644 index 0000000..bc6b6c7 Binary files /dev/null and b/issue/img/ue-2024-11-18-220359.png differ diff --git a/issue/img/ue-2024-11-18-220524.png b/issue/img/ue-2024-11-18-220524.png new file mode 100644 index 0000000..540ae36 Binary files /dev/null and b/issue/img/ue-2024-11-18-220524.png differ diff --git a/issue/img/ue-2024-11-18-220605.png b/issue/img/ue-2024-11-18-220605.png new file mode 100644 index 0000000..c800ac6 Binary files /dev/null and b/issue/img/ue-2024-11-18-220605.png differ diff --git a/issue/img/ue5.5-2024-12-02 093031.png b/issue/img/ue5.5-2024-12-02 093031.png new file mode 100644 index 0000000..cf4675f Binary files /dev/null and b/issue/img/ue5.5-2024-12-02 093031.png differ diff --git a/issue/img/ue5.5-2024-12-02 093116.png b/issue/img/ue5.5-2024-12-02 093116.png new file mode 100644 index 0000000..0d2c649 Binary files /dev/null and b/issue/img/ue5.5-2024-12-02 093116.png differ diff --git a/issue/img/ue5.5-2024-12-02 093118.png b/issue/img/ue5.5-2024-12-02 093118.png new file mode 100644 index 0000000..09f5b36 Binary files /dev/null and b/issue/img/ue5.5-2024-12-02 093118.png differ diff --git a/issue/img/ue5.5-2024-12-02 093119.png b/issue/img/ue5.5-2024-12-02 093119.png new file mode 100644 index 0000000..5584e60 Binary files /dev/null and b/issue/img/ue5.5-2024-12-02 093119.png differ diff --git a/issue/img/ue5.5-2024-12-02 093130.png b/issue/img/ue5.5-2024-12-02 093130.png new file mode 100644 index 0000000..e60e3fa Binary files /dev/null and b/issue/img/ue5.5-2024-12-02 093130.png differ diff --git a/issue/img/ue5.5-2024-12-21 093031.png b/issue/img/ue5.5-2024-12-21 093031.png new file mode 100644 index 0000000..3511701 Binary files /dev/null and b/issue/img/ue5.5-2024-12-21 093031.png differ diff --git a/issue/img/ue5.5-2024-12-21 093032.png b/issue/img/ue5.5-2024-12-21 093032.png new file mode 100644 index 0000000..3b46e33 Binary files /dev/null and b/issue/img/ue5.5-2024-12-21 093032.png differ diff --git a/issue/img/wiki-frontpage-0001.png b/issue/img/wiki-frontpage-0001.png new file mode 100644 index 0000000..7990327 Binary files /dev/null and b/issue/img/wiki-frontpage-0001.png differ diff --git a/json/v1_syui.json b/json/v1_syui.json new file mode 100644 index 0000000..baf8696 --- /dev/null +++ b/json/v1_syui.json @@ -0,0 +1,42 @@ +{ + "did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn", + "$type": "ai.syui.game.user", + "version": 1, + "aiten": 10, + "limit": false, + "login": false, + "gender": "famale", + "handle": "syui.ai", + "character": { + "ai": { + "hp": 999, + "lv": 1, + "exp": 0, + "img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy@jpeg", + "mode": 1, + "rank": 1, + "group": "origin", + "attach": 1, + "season": 0, + "critical": 1, + "critical_d": 1, + "attach_post": 1 + }, + "chinese": { + "hp": 50, + "lv": 1, + "exp": 0, + "img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreidlealfybajqzwv5eoz4jshnsijc2vnktlhpw4ph47krwj6aigqby@jpeg", + "mode": 1, + "rank": 1, + "group": "origin", + "attach": 1, + "season": 0, + "critical": 1, + "critical_d": 1, + "attach_post": 1 + } + }, + "createdAt": "2001-01-01T00:00:00+09:00", + "updatedAt": "2001-01-01T00:00:00+09:00" +} diff --git a/json/v2_ai.json b/json/v2_ai.json new file mode 100644 index 0000000..a7029a8 --- /dev/null +++ b/json/v2_ai.json @@ -0,0 +1,34 @@ +{ + "uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game/ai", + "cid": "bafyreiglmj347wv2pmqczo7zwalhzlygzwbqrwryu22mkwgl7b2lr3it4m", + "value": { + "did": "did:plc:4hqjfn7m6n5hno3doamuhgef", + "$type": "ai.syui.game", + "handle": "yui.syui.ai", + "player": { + "aiten": 0, + "limit": false, + "login": false, + "gender": "none" + }, + "version": 2, + "character": { + "ai": { + "hp": 1, + "lv": 1, + "exp": 0, + "img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy@jpeg", + "mode": 2, + "rank": 0, + "group": "origin", + "attack": 0, + "season": 0, + "critical": 0, + "critical_d": 0, + "attack_post": 0 + } + }, + "createdAt": "2020-01-01T00:00:00+09:00", + "updatedAt": "2020-01-01T00:00:00+09:00" + } +} diff --git a/json/v2_syui.json b/json/v2_syui.json new file mode 100644 index 0000000..c87552b --- /dev/null +++ b/json/v2_syui.json @@ -0,0 +1,34 @@ +{ + "uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game/syui", + "cid": "bafyreiczvkjpurcaud3ywwpptpnfpb5yxutax5rffdg6y552i7qecvzile", + "value": { + "did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn", + "$type": "ai.syui.game", + "handle": "syui.ai", + "player": { + "aiten": 0, + "limit": false, + "login": false, + "gender": "male" + }, + "version": 2, + "character": { + "chinese": { + "hp": 1, + "lv": 1, + "exp": 0, + "img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreidlealfybajqzwv5eoz4jshnsijc2vnktlhpw4ph47krwj6aigqby@jpeg", + "mode": 0, + "rank": 0, + "group": "fantasy", + "attack": 0, + "season": 1, + "critical": 0, + "critical_d": 0, + "attack_post": 0 + } + }, + "createdAt": "2020-01-01T00:00:00+09:00", + "updatedAt": "2020-01-01T00:00:00+09:00" + } +} diff --git a/music/aidream.mp3 b/music/aidream.mp3 new file mode 100644 index 0000000..d6263dd Binary files /dev/null and b/music/aidream.mp3 differ diff --git a/music/aiend.wav b/music/aiend.wav new file mode 100644 index 0000000..83fc495 Binary files /dev/null and b/music/aiend.wav differ diff --git a/music/aihouse.wav b/music/aihouse.wav new file mode 100644 index 0000000..c5fd910 Binary files /dev/null and b/music/aihouse.wav differ diff --git a/music/aimoon.wav b/music/aimoon.wav new file mode 100644 index 0000000..1966eb1 Binary files /dev/null and b/music/aimoon.wav differ diff --git a/music/aipalette.mp3 b/music/aipalette.mp3 new file mode 100644 index 0000000..9ed42d8 Binary files /dev/null and b/music/aipalette.mp3 differ diff --git a/music/aiskill.wav b/music/aiskill.wav new file mode 100644 index 0000000..1f1adaa Binary files /dev/null and b/music/aiskill.wav differ diff --git a/music/aiverse.wav b/music/aiverse.wav new file mode 100644 index 0000000..f41c4d0 Binary files /dev/null and b/music/aiverse.wav differ diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..a092b6a --- /dev/null +++ b/readme.md @@ -0,0 +1,8 @@ +# yui + +- [aiverse](https://git.syui.ai/ai/ue/wiki/project) project +- [aiue](https://git.syui.ai/ai/ue/wiki/system) system + +see [ue.json](https://git.syui.ai/ai/ue/src/branch/main/ue.json) + + diff --git a/ue.json b/ue.json new file mode 100644 index 0000000..2d1adfb --- /dev/null +++ b/ue.json @@ -0,0 +1,945 @@ +{ + "aiue": { + "name": "aiue", + "description": "aiue system", + "repo": "https://git.syui.ai/ai/ue", + "ref": "https://git.syui.ai/ai/ue/wiki/system", + "body": { + "text": "[ai] [u]nreal [e]ngine, system overview, game naming conventions", + "lang": { + "ja": "ai Unreal Engine, システムの概要, ゲームの命名規則" + } + }, + "lexicon": { + "ai.syui.game": { + "uri": "https://git.syui.ai/ai/ue/src/branch/main/lexicons/ai/syui/game.json" + }, + "ai.syui.game.user": { + "uri": "https://git.syui.ai/ai/ue/src/branch/main/lexicons/ai/syui/game/user.json" + }, + "ai.syui.game.character": { + "uri": "https://git.syui.ai/ai/ue/src/branch/main/lexicons/ai/syui/game/character.json" + } + }, + "system": { + "enum": [ + "character", + "atmosphere", + "universe" + ], + "atmosphere": { + "name": "atmosphere", + "repo": "https://github.com/bluesky-social/atproto", + "uri": "https://atproto.com/ja/guides/glossary", + "ref": "https://en.wikipedia.org/wiki/atmosphere_of_earth", + "lang": { + "ja": "大気圏" + }, + "exoshere": { + "name": "exo", + "lang": { + "ja": "外気圏" + }, + "km": [ + { + "min": 700, + "max": 10000 + } + ], + "enum": [ + "universe" + ] + }, + "thermoshere": { + "name": "thermo", + "lang": { + "ja": "熱圏" + }, + "km": [ + { + "min": 80, + "max": 700 + } + ], + "enum": [ + "aurora" + ] + }, + "mesoshere": { + "name": "meso", + "lang": { + "ja": "中間圏" + }, + "km": [ + { + "min": 50, + "max": 80 + } + ], + "enum": [ + "meteor", + "aimoji", + "plc" + ], + "aimoji": { + "name": "aimoji", + "repo": "https://git.syui.ai/ai/moji", + "body": { + "text": "aimoji takes the first character from the at-uri domain. each character is assigned to a different domain", + "lang": { + "ja": "アイ文字はat-uriのドメインから最初の一文字を取ります。ドメインを名前とした各キャラクターが割り当てられます" + } + }, + "enum": [ + "ai", + "com", + "org", + "jp", + "us", + "io", + "social" + ] + }, + "plc": { + "name": "plc", + "repo": "https://github.com/did-method-plc/did-method-plc/tree/main/packages/server", + "tag": [ + "did" + ] + } + }, + "stratoshere": { + "name": "strato", + "lang": { + "ja": "成層圏" + }, + "km": [ + { + "min": 12, + "max": 50 + } + ], + "enum": [ + "ozone", + "bigsky" + ], + "bigsky": { + "name": "bgs", + "service": [ + { + "name": "bgs", + "repo": "https://github.com/bluesky-social/indigo/tree/main/cmd/bigsky" + } + ] + }, + "ozone": { + "service": [ + { + "name": "ozone", + "repo": "https://github.com/bluesky-social/atproto/tree/main/services/ozone" + } + ] + } + }, + "troposhere": { + "name": "tropo", + "lang": { + "ja": "対流圏" + }, + "km": [ + { + "min": 0, + "max": 12 + } + ], + "enum": [ + "bluesky" + ], + "bluesky": { + "name": "bsky", + "service": [ + { + "name": "pds", + "repo": "https://github.com/bluesky-social/atproto/tree/main/services/pds" + }, + { + "name": "bsky", + "repo": "https://github.com/bluesky-social/atproto/tree/main/services/bsky", + "tag": [ + "api", + "appview" + ] + }, + { + "name": "bsync", + "repo": "https://github.com/bluesky-social/atproto/tree/main/services/bsync" + }, + { + "name": "social-app", + "repo": "https://github.com/bluesky-social/social-app", + "tag": [ + "web" + ] + }, + { + "name": "oauth", + "repo": "https://github.com/bluesky-social/cookbook/tree/main/python-oauth-web-app" + }, + { + "name": "feed", + "repo": "https://github.com/bluesky-social/feed-generator" + }, + { + "name": "stream", + "repo": "https://github.com/bluesky-social/jetstream" + } + ] + } + } + }, + "character": { + "body": { + "text": "character system is the core of this game", + "lang": { + "ja": "キャラクターシステムはこのゲームの核。yui, evolution, attributeの3つのシステムで構成される" + } + }, + "enum": [ + "yui", + "evolution", + "gender", + "attribute", + "status" + ], + "gender": { + "name": "gender", + "full": "gender system", + "body": { + "text": "a genitalia system created using blender. aiming to reproduce the shape and movement of reality.", + "lang": { + "ja": "blenderで作った性器システムのこと。gender systemという。現実の形状や動きの再現を目指す。アイは原作で性別が不明、性別がないので、gender systemから除外される" + } + } + }, + "status": { + "name": "status", + "body": { + "text": "the status system determines the overall status of the character", + "lang": { + "ja": "ステータスシステムはキャラクター全般のステータスを規定する" + } + }, + "enum": [ + "lv", + "constellation", + "nature", + "stone" + ], + "lv": { + "lang": { + "ja": "レベル" + }, + "min": 1, + "max": 7, + "body": { + "text": "character level system", + "lang": { + "ja": "キャラクターのレベルシステム" + } + } + }, + "constellation": { + "lang": { + "ja": "星座" + }, + "min": 0, + "max": 3, + "body": { + "text": "character duplication system. in japanese it is called convex, but in english it is often abbreviated to [c]", + "lang": { + "ja": "キャラクターの重複システム。日本語では凸と言われるが、英語では[c]と略されることが多い" + } + } + }, + "natrue": { + "lang": { + "ja": "天性" + }, + "enum": [ + "skill", + "burst", + "attack" + ], + "min": 1, + "max": 7 + }, + "stone": { + "lang": { + "ja": "石" + }, + "body": { + "text": "stone system modeled after birthstones", + "lang": { + "ja": "誕生石をモデルにした石システム" + } + }, + "enum": [ + "garnet", + "amethyst", + "aquamarine", + "diamond", + "emerald", + "pearl", + "ruby", + "peridot", + "sapphire", + "opal", + "topaz", + "turquoise" + ], + "min": 1, + "max": 12 + } + }, + "yui": { + "body": { + "text": "yui system that aims to guarantee [unique]ness for characters", + "lang": { + "ja": "キャラクターに唯一性の担保を目指す、唯システム" + } + }, + "rule": { + "text": "characters are divided into groups. groups change with each season. they do not return to the previous season. the number of pickups starts at 1, and when it reaches 0, the chance to get that character disappears. the first character assigned will have a unique skill. characters acquired through pickups will not be able to use unique skills.", + "lang": { + "ja": "キャラクターはグループに分けられる。グループはシーズンで移行する。前シーズンに戻ることはない。ピックアップ数は1から始まり0になると手に入れる機会が消滅。最初に割り当てられたキャラクターはユニークスキルを持つ。ピックアップで手に入れたものはユニークスキルを使えない" + } + }, + "enum": [ + "color", + "skill", + "constellation" + ], + "color": { + "name": "color", + "body": { + "text": "the color system determines the color of the character", + "lang": { + "ja": "色システムはキャラクターの色を規定する。ガチャで手に入れたキャラクターはすべて色違いとなる。色違いは2種類あり、特殊なエフェクトが付いている。なお、低確率でオリジナルに近い色違いが排出される。rankが高い色で上書きされる" + } + } + }, + "skill": { + "name": "unique-skill" + }, + "constellation": { + "name": "c4" + } + }, + "evolution": { + "enum": [ + "animal", + "human", + "divinity" + ], + "body": { + "text": "each character has three stages of evolution", + "lang": { + "ja": "1キャラクターにつき3段階の進化[変身]がある" + } + } + }, + "attribute": { + "enum": [ + "ai", + "atom", + "molecule" + ], + "body": { + "text": "each character has one attribute", + "lang": { + "ja": "1キャラクターにつき1属性を持つ。id+1と連鎖反応。id=idは無効。id-1は弱点。その属性グループの最後のidはグループ全体にバフ/デバフ" + } + }, + "ai": { + "name": "ai", + "group": [ + "origin" + ], + "lang": { + "ja": "アイ" + }, + "ref": "at://syui.ai", + "body": { + "text": "the smallest unit in this world, smaller than a quark. the smaller it is, the more it can gather together. it generates enormous gravity, and black holes are made up of these particles. this world is the world of existence. existence is made up of the consciousness of existence. the consciousness of existence is the smallest thing in this world, and all matter is a collection of this consciousness.", + "lang": { + "ja": "クォークよりも小さいこの世界の最小単位。ブラックホールもこの物質で構成されると考えられている" + }, + "effect": { + "enum": [ + "gravity", + "all" + ], + "gravity": { + "body": { + "text": "immediately before attacking, perform a powerful pull", + "lang": { + "ja": "攻撃の直前、強力な引き寄せを行う" + } + } + }, + "all": { + "body": { + "lang": { + "ja": "すべてのid+1(すべての属性と連鎖反応を起こす)" + } + } + } + } + }, + "enum": [ + "ai", + "yui" + ], + "ai": { + "name": "ai", + "id": 0, + "color": "#fff700", + "effect": { + "gravity": 1, + "all": 1 + }, + "lang": { + "ja": "アイ" + }, + "body": { + "text": "There is something called a quantum. It is said that when it is observed, the results change. But in fact, that is not the case. The reason the results change is because matter hits it. It is natural that things move when matter hits them, so it is only natural that the results change. When you make things smaller, you reach the realm of consciousness. You can call it matter or consciousness. There is no particular difference. And the smallest unit that cannot be divided any further, the smallest matter, is called 'consciousness of existence.' Matter is also made up of a collection of consciousnesses. Let's call this the eye. The story begins with 'the quest for the smallest matter.'", + "lang": { + "ja": "量子というものがある。観測すると結果が変わるらしい。でもじつは違う。結果が変わるのは物質が当たるからだ。物質が当たると結果が変わるのは当然のこと。物質を小さくしていくと、それは意識の領域に到達する。それは物質でもあり、意識でもあった。特に違いはない。そして、これ以上分割できない最小単位、この世界で最も小さい物質を「存在の意識」という。つまり、物質は意識が集まってできている。これをアイと名付けよう。物語は「最も小さな物質の探求」から始まる" + } + } + }, + "yui": { + "name": "yui", + "id": 1, + "color": "#313131", + "lang": { + "ja": "ユイ" + }, + "body": { + "text": "there is nothing the same in this world. even though we may seem to be looking at the same thing, we are actually looking at something different. there is uniqueness in everything", + "lang": { + "ja": "この世に同じものは何一つない。同じものを見ているように見えても、実は違うものを見ている。すべての存在は唯一性を持つ" + } + } + } + }, + "atom": { + "name": "atom", + "group": [ + "fantasy" + ], + "lang": { + "ja": "原子" + }, + "ref": "https://en.wikipedia.org/wiki/atom", + "body": { + "text": "the word atom comes from the greek word atmos, which means indivisible. an atom consists of an atomic nucleus, which is made up of protons and neutrons, and electrons distributed around the nucleus", + "lang": { + "ja": "アトムはギリシャ語のアトモス、これ以上分割できないという単語が由来。原子は陽子と中性子からなる原子核と、その周囲に分布する電子から構成される" + } + }, + "enum": [ + "proton", + "neutron", + "atomic", + "electron", + "quark" + ], + "quark": { + "name": "quark", + "id": 2, + "color": "#9b59b6", + "lang": { + "ja": "クォーク" + }, + "effect": { + "gravity": 0.5 + } + }, + "proton": { + "name": "proton", + "id": 3, + "color": "#e74c3c", + "lang": { + "ja": "陽子" + }, + "effect": { + "gravity": 0.1 + } + }, + "neutron": { + "name": "neutron", + "id": 4, + "color": "#cacfd2", + "lang": { + "ja": "中性子" + }, + "effect": { + "gravity": 0.4 + } + }, + "atomic": { + "name": "atomic", + "id": 5, + "color": "#1abc9c", + "lang": { + "ja": "核" + }, + "effect": { + "gravity": 0.3 + } + }, + "electron": { + "name": "electron", + "id": 6, + "color": "#3498db", + "lang": { + "ja": "電子" + }, + "effect": { + "gravity": 0.2 + } + } + }, + "molecule": { + "name": "molecule", + "group": [ + "animal" + ], + "lang": { + "ja": "分子" + }, + "ref": "https://en.wikipedia.org/wiki/molecule", + "body": { + "text": "a neutrally charged substance made up of two or more atoms", + "lang": { + "ja": "2つ以上の原子から構成される電荷的に中性な物質" + } + }, + "enum": [ + "water", + "wind", + "rock", + "ice", + "fire" + ], + "water": { + "name": "water", + "id": 7, + "color": "#blue", + "lang": { + "ja": "水" + } + }, + "fire": { + "name": "fire", + "id": 8, + "color": "#red", + "lang": { + "ja": "火" + } + }, + "ice": { + "name": "ice", + "id": 9, + "color": "#ebf5fb", + "lang": { + "ja": "氷" + } + }, + "rock": { + "name": "rock", + "id": 10, + "color": "#f0b27a", + "lang": { + "ja": "岩" + } + }, + "wind": { + "name": "wind", + "id": 11, + "color": "#green", + "lang": { + "ja": "風" + } + } + } + } + }, + "universe": { + "name": "universe", + "lang": { + "ja": "宇宙" + }, + "body": { + "text": "mainly the map (level) system, aim to reflect reality. create as many invisible and inaccessible areas as possible", + "lang": { + "ja": "主にマップ(レベル)のシステム。現実の反映を目指す。できる限り見えない部分、行けない場所を作る" + } + }, + "system": { + "enum": [ + "choices", + "diagnosis", + "fate" + ], + "body": { + "text": "this world is made up of three elements: choices, diagnosis, and fate", + "lang": { + "ja": "この世界はchoices(選択), diagnosis(診断)、fate(運)という3つの要素で構成されます" + } + } + }, + "uri": "https://eyes.nasa.gov/apps/solar-system", + "ref": "https://en.wikipedia.org/wiki/universe", + "enum": [ + "earth", + "moon", + "sun", + "mercury", + "venus", + "mars", + "jupiter", + "saturn", + "uranus", + "neptune", + "neutronstar", + "blackhole", + "galaxy" + ], + "earth": { + "name": "earth", + "lang": { + "ja": "地球" + }, + "mass": 1.0 + }, + "moon": { + "name": "moon", + "lang": { + "lang": { + "ja": "月" + }, + "mass": 0.0123 + }, + "sun": { + "name": "sun", + "enum": [ + "solar" + ], + "lang": { + "ja": "太陽" + }, + "mass": 333000.0 + }, + "mars": { + "name": "mars", + "lang": { + "ja": "火星" + }, + "mass": 0.107 + }, + "mercury": { + "name": "mercury", + "lang": { + "ja": "水星" + }, + "mass": 0.055 + }, + "venus": { + "name": "venus", + "lang": { + "ja": "金星" + }, + "mass": 0.815 + }, + "jupiter": { + "name": "jupiter", + "lang": { + "ja": "木星" + }, + "mass": 317.8 + }, + "saturn": { + "name": "saturn", + "lang": { + "ja": "土星" + }, + "mass": 95.16 + }, + "uranus": { + "name": "uranus", + "lang": { + "ja": "天王星" + }, + "mass": 14.54 + }, + "neptune": { + "name": "neptune", + "lang": { + "ja": "海王星" + }, + "mass": 17.15 + }, + "neutronstar": { + "name": "neutronstar", + "lang": { + "ja": "中性子星" + }, + "mass": 466666.0 + }, + "blackhole": { + "name": "blackhole", + "lang": { + "ja": "ブラックホール" + }, + "mass": 1000000000000.0 + }, + "galaxy": { + "name": "galaxy", + "ref": "https://en.wikipedia.org/wiki/galaxy", + "lang": { + "ja": "銀河" + }, + "enum": [ + "milkyway", + "andromeda", + "ringnebula" + ], + "milkyway": { + "name": "milkyway", + "lang": { + "ja": "天の川" + } + }, + "andromeda": { + "name": "andromeda", + "lang": { + "ja": "アンドロメダ" + } + }, + "ringnebula": { + "name": "ringnebula", + "lang": { + "ja": "環状" + } + } + } + } + } + }, + "character": { + "ref": "https://git.syui.ai/ai/ue/src/branch/main/lexicons/ai/syui/game/user.json", + "lang": { + "ja": "キャラクター" + }, + "body": { + "text": "character status, groups, attributes, etc.", + "lang": { + "ja": "キャラクターのステータス、グループ、属性など" + } + }, + "enum": [ + "ai", + "chinese", + "manny", + "quinn", + "phoenix", + "kirin", + "leviathan", + "wyvern", + "cerberus", + "dragon", + "kitsune", + "pegasus", + "whale", + "lion", + "elephant", + "eagle", + "snake" + ], + "ai": { + "lang": { + "ja": "アイ" + }, + "body": { + "text": "ai age and origin are unknown. she is described as having lived longer than a dragon. she calls herself ai. she is registered in the government system as [tsukimi yui] her birthday is 01/23, and she is also the same height. this is a reference to the mass of the moon. she has black hair and black eyes. she likes pineapples and dislikes mushrooms.", + "lang": { + "ja": "年齢や出身は不明。ドラゴンより長く生きているという描写がある。自らをアイと名乗る。政府のシステムには[月見唯(つきみゆい)]で登録されている。誕生日は01/23、身長も同じ。月の質量が由来。黒髪、黒い瞳をしている。パイナップルが好物でキノコが苦手" + } + }, + "img": "bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy", + "season": 0, + "group": "origin", + "attribute": "ai", + "day": "0123" + }, + "manny": { + "lang": { + "ja": "マニー" + }, + "img": "bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy", + "season": 1, + "group": "test", + "attribute": "test" + }, + "quinn": { + "lang": { + "ja": "クイーン" + }, + "img": "bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy", + "season": 1, + "group": "test", + "attribute": "test" + }, + "chinese": { + "lang": { + "ja": "シンリュウ" + }, + "img": "bafkreidlealfybajqzwv5eoz4jshnsijc2vnktlhpw4ph47krwj6aigqby", + "season": 1, + "group": "fantasy", + "attribute": "quark" + }, + "phoenix": { + "lang": { + "ja": "フェニックス" + }, + "img": "bafkreich7fsumke2yvumvixkruonzrcevk3f6g2cntzfwdn4n2c2vox5dm", + "season": 1, + "group": "fantasy", + "attribute": "proton" + }, + "kirin": { + "lang": { + "ja": "キリン" + }, + "img": "bafkreiegpqedlrfa4ljhssdnkrr5hyd5huy2xhh2zszj5wq2wuuzejggmq", + "season": 1, + "group": "fantasy", + "attribute": "neutron" + }, + "leviathan": { + "lang": { + "ja": "リヴァイアサン" + }, + "img": "bafkreig6vszkx3c4dcortjwfsz6sa6zwqgj7zpxj4lxfrrkwql4xhiu5ou", + "season": 1, + "group": "fantasy", + "attribute": "electron" + }, + "wyvern": { + "lang": { + "ja": "ワイバーン" + }, + "img": "bafkreiacjvagsekhiiljz3j237b6klrt6pkptxljt7kltprgg5276gv25q", + "season": 1, + "group": "fantasy", + "attribute": "proton" + }, + "cerberus": { + "lang": { + "ja": "ケルベロス" + }, + "img": "bafkreihpni4lp55jysalcntulzal5rbhidtbseanlucpyucagzxmv6xj24", + "season": 1, + "group": "fantasy", + "attribute": "atomic" + }, + "dragon": { + "lang": { + "ja": "ドラゴン" + }, + "img": "bafkreia3huw2gdenqatoobx3hcft74chced46bw4znfgepo5aenegobkri", + "season": 1, + "group": "fantasy", + "attribute": "atomic" + }, + "kitsune": { + "lang": { + "ja": "キュウビ" + }, + "img": "bafkreidy74aieb6ie646xhosginox5zbnbnrtd76cnt4pbn73hrxgfnple", + "season": 1, + "group": "fantasy", + "attribute": "neutron" + }, + "pegasus": { + "lang": { + "ja": "ペガサス" + }, + "img": "bafkreifnbfj27fr6nv7qeqqmwdibf7qrw4lauvzoknw5hexbifmwqt6kmq", + "season": 1, + "group": "fantasy", + "attribute": "electron" + }, + "lion": { + "lang": { + "ja": "ライオン" + }, + "season": 2, + "group": "animal", + "attribute": "fire" + }, + "elephant": { + "lang": { + "ja": "ゾウ" + }, + "season": 2, + "group": "animal", + "attribute": "rock" + }, + "eagle": { + "lang": { + "ja": "ワシ" + }, + "season": 2, + "group": "animal", + "attribute": "wind" + }, + "snake": { + "lang": { + "ja": "ヘビ" + }, + "season": 2, + "group": "animal", + "attribute": "ice" + }, + "whale": { + "lang": { + "ja": "クジラ" + }, + "season": 2, + "group": "animal", + "attribute": "water" + } + } + }, + "aiverse": { + "name": "aiverse", + "description": "aiverse project", + "repo": "https://git.syui.ai/ai/ue/src/branch/main/verse", + "ref": "https://git.syui.ai/ai/ue/wiki/project", + "body": { + "text": "ideas and philosophies when building a system. aiming to fuse games and reality", + "lang": { + "ja": "システムを構築する際の思想と哲学。個人(現実)とゲームの融合を目指す" + } + }, + "enum": [ + "unique", + "game", + "real" + ] + } +} diff --git a/video/op.mp4 b/video/op.mp4 new file mode 100644 index 0000000..f394cdc Binary files /dev/null and b/video/op.mp4 differ diff --git a/video/opload.mp4 b/video/opload.mp4 new file mode 100644 index 0000000..97ba933 Binary files /dev/null and b/video/opload.mp4 differ