This commit is contained in:
syui 2025-03-19 12:08:19 +09:00
parent 4d453a2b7b
commit 1139510bbd
Signed by: syui
GPG Key ID: 5417CFEBAD92DF56
14 changed files with 540 additions and 20 deletions

View File

@ -2,10 +2,13 @@
* [Unreal Engine Guild Book](README.md)
* [default](default/README.md)
* [asset/plugin](default/00_asset.md)
* [asset](default/00_asset.md)
* [start](default/01_start.md)
* [install](default/02_install.md)
* [tips](default/03_tips.md)
* [powershell](pwsh/README.md)
* [git](pwsh/01_git.md)
* [ssh](pwsh/02_ssh.md)
* [game animation sample](gasp/README.md)
* [キャラクターを追加する](gasp/01_character.md)
* [飛びつける高さを増やす](gasp/02_jump.md)
@ -29,6 +32,7 @@
* [家を作る](city/03_house.md)
* [BGMを作る](city/04_bgm.md)
* [ブラウザを作る](city/05_browser.md)
* [惑星を動かす](city/06_spline.md)
* [gameplay camera](camera/README.md)
* [もっと近づける](camera/01_close.md)
* [json blueprint utilities](json/README.md)
@ -86,5 +90,6 @@
* [最初の体験](project/02_ep.md)
* [毎日プレイ](project/03_ep.md)
* [自由と不自由](project/04_ep.md)
* [ロードマップ](project/05_ep.md)
* [youtube](project/01_youtube.md)
* [end](end/README.md)

10
book/city/06_spline.md Normal file
View File

@ -0,0 +1,10 @@
# 惑星を動かす
splineで惑星を動かします。
1. `BP_Spline`を作成し、componentでsplineを追加し、右クリックで生成パネルを出す
2. 円弧を選択し、90のところを360にする。あとは大きさを変更する数値を大きくする
3. 次にsplineで動かしたいBPを開いて、`BP_Spline`を入れます。
4. 処理をTickに追加する。なお、`BP_Spline(子アクター)`から持ってくる場合は`Get Child Actor`, `Get Component by Class: Spline Component`を使用します。
<iframe src="https://blueprintue.com/render/8gfrd45h/1" scrolling="no" width="100%" height="450px" allowfullscreen=""></iframe>

View File

@ -1,4 +1,4 @@
# asset/plugin
# asset
現在使用しているplugin(プラグイン)やasset(アセット)の`version(バージョン)`を記述します。

View File

@ -42,12 +42,3 @@ C:\Program Files\Epic\UE_5.5\Engine\Binaries\Win64\UnrealEditor.exe
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|

View File

@ -8,7 +8,8 @@ ue5でゲームを作成するまでの過程をまとめます。
|name|latest|body|
|---|---|---|
|[unreal engine](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-5.5-release-notes)|5.5.3|ゲームエンジン|
|[Unreal Engine](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-5.5-release-notes)|5.5.4|公式サイト|
|[EpicGames/UnrealEngine](https://github.com/EpicGames/UnrealEngine)|src|github|
## パソコンのスペック

View File

@ -51,4 +51,6 @@ 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/)|
|[ultimate gameplay camera](https://www.fab.com/listings/4d3a1a73-a38d-4704-b552-8b543f24fd25)|5.5|gameplay camera plugin|[docs](https://coda.io/@aurora-devs/documentation-ultimate-gameplay-camera)|
|[fluid ninja vfx tools](https://www.fab.com/ja/listings/90266972-0597-4404-a54a-8c0b7e00a005)|5.5|台風を作る|[docs](https://drive.google.com/file/d/1eRQtcUtkkL6idelmbsfXCO03pbqBuwRu/edit)|

View File

@ -8,3 +8,7 @@
統一感あるキャラクターを追加する方式のほうがいいと考えています。
## 動物型 -> 人型 -> 神性型
現在、各キャラクターは`動物型 -> 人型 -> 神性型`の順に変身する形式を考えています。

77
book/project/05_ep.md Normal file
View File

@ -0,0 +1,77 @@
# ロードマップ
ポケモン初代を徹底的に分解してゲームの面白さを探求しようと思う。
ポケモン初代はある程度の自由度はあるものの、やること、次に行く場所が非常に明白なゲームになっている。街があり、その街にジムがある。倒すとバッジがもらえる。集めるとチャンピオンリーグに参加できる。街と街は一本道で構成されている。ここまでならどのゲームでも良くありそうだ。しかし、以外とこういったシンプルなものを実装できているゲームは少ない。また、普通に進んでいけばゲームを楽しくプレイできる工夫もある。
もう一つポケモンには他には真似できない要素がある。それがポケモンであり、ポケモンというのはキャラクターだ。あれほど多くのキャラクターを実装しているゲームは少ない。
これらの要素を自分のゲームに徹底的に取り入れる。そういった事を考えている。もちろん、真似する部分は表面的なところではない。その根源に隠された考え方の部分だ。
例えば、キャラクターをあれほど多く実装することは普通できない。だからポケモンでは技やタイプというものを作り、それを共通させることで圧縮を図っているのだと思う。そのような工夫をすることで、冒険には常に新しいキャラクターと出会えるワクワクが生み出せる。
つまり、ここで参考にすべき考え方というのは「常にワクワクを生み出せる仕組みづくり」「他に真似できない部分を作る」「普通はできないことを工夫によって実現する」ということ。
だから、そのままポケモンに似たモンスターを登場させ、それを捕まるモンスターボールを使って、プレイヤーがモンスターを使役する、という表面的なところだけ真似しても仕方ないと思う。それではただポケモンの劣化版が生まれるだけだろう。それでも大変なことだとは思うけど、自分のやりたいことではないので、取り入れるとしたら考え方の部分だと思う。
色々と考えはあるものの、まずはプロトタイプでも作らないと話にならないので、次はこの辺をやっていこうと思う。
1. 次に行く場所を明確にする
2. やることが決まっている
3. 自然とプレイヤーに違いが生まれる仕組み
4. 「常にワクワクを生み出せる仕組み」「真似できない部分はあるか」「できないことを工夫で実現」
## 世界と平和
ポケモンの世界は、平和である。動物と人間が共存しており、自然がある。街のシステムも完成されている。
もちろん、モンスターボールで捉えられるポケモンがかわいそうなどの意見はあると思うが、そういった哲学的な話はさておき、人間にとって平和な世界である事が重要だと思う。
そして、これは設定の問題だ。哲学の問題ではない。もちろん、考えさせられる部分はあってもいいが、ゲームはそれを目的としていない。
普通の人間がプレイする価値観を基準に考える。
## 博士
ポケモン博士にポケモンをもらって旅に出る。ライバルがいる。
## 悪の組織
そんな平和な世界にもロケット団という悪が存在する。これも設定の話なので、何が悪で何が善であるという問題ではない。悪の組織と設定されたのがロケット団であり、ロケット団はポケモンを自らの権力拡大の道具に使っている。
その組織を一人で壊滅させるのが主人公の役割。そして、これは冒険の目的ではない。
冒険の目的はチャンピオンになること。(またはポケモン図鑑)
## チャンピオン
最後のジムリーダーはロケット団のボスだった。主人公に敗北したサカキが故郷(昔の古巣)に戻っていた。
最後のバッジを集めた主人公はポケモンリーグに向かうことになる。
伝説のドラゴンタイプを使う四天王のマサルを倒して終わったと思ったら新チャンピオンになったばかりのライバルが登場する。
ライバルは主人公と同じ時期に旅に出た幼馴染でマサラタウンの地で家が隣だった人物。
## ピカチュウとミュウツー
最初の盛り上げポイントとして、でんきタイプのピカチュウを置いたのは意図的だったのかも。
まず、一番最初に登場する唯一のでんきタイプ、かつ遭遇率も低めに設定されているのがピカチュウだった。とはいえ、今のように一番人気のポケモンになるとは思ってなかったと思う。
ポケモンにはいくつか盛り上げポイントが設定されている。伝説の3鳥やドラゴンタイプ、そして、ミュウツーなど。
ミュウツーは人間の実験によって生み出された悲劇のポケモンというストーリーが用意されており、クリア後に遭遇できる。つまり、最後の盛り上げポイントとなるポケモンがミュウツーだった。
## 最初のポケモン
最初に3匹の中から好きなポケモンを選ぶ。
それが主人公とライバルの切り札になるポケモンだ。
チャンピオンバトルでも最後に登場する。
主人公の名前とタイトルにはカラーが付けられていて、レッド、ブルー、グリーンの3色だった。ポケモンもそれに対応している。
色というのはとても普遍的なもので、それを採用したのも興味深い。

177
book/pwsh/01_git.md Normal file
View File

@ -0,0 +1,177 @@
# git
gitはバージョン(version)管理ツールです。linus(linuxを作った人)が開発しています。
projectにverを付けて、いつでも古いverに戻したり、あるいは新しい機能を別の場所(branch)で開発し、開発が完了したら統合(merge)するようにしたりします。そのほうがprojectが管理しやすいからです。
```sh
$ winget install git.git
```
## tui
[jesseduffield/lazygit](https://github.com/jesseduffield/lazygit)を使います。
```
$ winget install jesseduffield.lazygit
$ lazygit
```
`q`で終了です。`vim`の操作感で使用できます。
## gitの解説
gitでやることは基本的なことさえ理解していればokです。
ようはコードの修正履歴の管理です。
基本的にprojectフォルダのrootから操作を行います。
ここに`git init``.git/`を作成し、`.git/config`が設定ファイルになります。
> $project/.git/config
```sh
$ cd $project
$ git init
$ git remote add origin https://github.com/OWNER/REPOSITORY.git
---
$ cat .git/config
[remote "origin"]
url = https://github.com/OWNER/REPOSITORY.git
fetch = +refs/heads/*:refs/remotes/origin/*
```
`git remote add``.git/config`に書き込んでいるだけなので、直接ファイルを編集しても構いません。git-commandは基本的に`.git/`以下のファイルを変更しているに過ぎないからです。
### config
gitは変更履歴ですが、誰がどのような変更をしたかわかるようになっています。
最初にuserを設定しましょう。mailが必要です。これは、`.git/config`に書いてもいいですが、共通する設定は`~/.gitconfig`に書いておくと便利です。
> ~/.gitconfig
```sh
[user]
name = syui
email = syui@users.noreply.github.com
```
もしmailを公開したくない場合は、`$USER@users.noreply.github.com`にしておくとよいでしょう。
### commit
```sh
# 追加
$ echo # title > README.md
$ git add README.md
# コミット
$ git commit -m "first"
# コミットを確定
$ git push -u origin master
```
まずaddでファイルをgit管理に追加しています。
次に、その変更を名前をつけて保存します。これをcommitといいます。
最後にpushして、localに保存されている変更履歴がurlにupload(アップロード)されます。
ここまでが一連の流れです。履歴の確認は`git log`です。
```sh
$ git log
```
### branch
次に、修正を本体のある部分から分離(branch)して行い、最後に本体に取り込むまでの流れを説明します。
```sh
$ git branch -b new-version
---
# コード(ファイル)を修正する
$ vim README.md
----
#これを繰り返す
$ git add .
$ git commit -m test-1
$ git add .
$ git commit -m test-2
$ git add .
$ git commit -m test-3
---
# 修正をまとめる
$ git rebase @~3
r a45ba54 test-1
f c3d7514 test-2
f 21b8b59 test-3
update new-version (rでタイトルを変更)
---
$ git push -f origin new-version
---
```
そして、pull-requestを作成し、mergeで本体(origin/master)に取り込みます。
```sh
# branchはいつでも切り替えられる
$ git branch
$ git checkout master
# 削除も簡単。変更が取り込まれたら削除して構わない
$ git branch -D new-version
```
### push / pull
gitのすべては`.git/`に保存されています。`.git/config`で設定します。
push/pull先を変更してみます。
```diff
+[remote "origin"]
+ url = git@git.syui.ai:syui/test.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
-[remote "origin"]
- url = https://github.com/OWNER/REPOSITORY.git
- fetch = +refs/heads/*:refs/remotes/origin/*
```
```sh
$ git pull
```
なお、urlのprotocolはhttpのほか`ssh@github.com``git@github.com`などがあります。ただし、urlはprotocolのruleに基づくので注意してください。
```diff
+ git@github.com:syui
- git@github.com/syui
```
ssh, gitは鍵認証でpasswordを省略できます。自身が管理するprojectは`git`にしましょう。
### conflict
gitを使っていて一番厄介な事は、おそらくconflict(衝突)でしょう。
例えば、AさんとBさん、Cさんの三人で開発していたとしましょう。
AさんとBさんは二人とも同じcommitからbranchを切って、作業、つまり、commitを進めていました。一つの丸(commit)があり、そこから別々に枝分かれ(branch)して、丸(commit)が進むイメージです。
ここで、Bさんのほうが早くにpull-reqを出し、新しいコードが本体にmerge、取り込まれました。
次にAさんがpull-reqを出します。しかし、mergeしようとすると、できません。conflictが発生したのです。
AさんもBさんも、同じ箇所に別々の機能を実装しようとしていて、Bさんの変更が先に取り込まれていたからです。
さて、この解消にはいくつか方法があります。Aさんがconflictを解消するコードに修正するか、mergeするCさんが解消するかです。
通常は、Aさんがbranchのcommitを最新のコードに対応したものに作り直します。あるいはpull-reqそのものを作り直すかです。通常は前者になります。branchのcommitを進め、conflictが発生しないように修正するのです。この場合、pull-reqを作り直す必要はありません。
修正は、例えば、他の場所に機能を移すか、Bさんの機能を合体させたものを作るかなどの方法があります。

107
book/pwsh/02_ssh.md Normal file
View File

@ -0,0 +1,107 @@
# openssh
serverにaccess(アクセス)したり、または自身をserverにしたりします。
```sh
$ winget install microsoft.openssh.preview
```
## 他のpcからwindowsに接続する
windowsをssh serverにする方法です。
`sshd_config``c:/programdata/ssh/sshd_config`にあります。
> c:/programdata/ssh/sshd_config
```sh
PasswordAuthentication no
PermitEmptyPasswords yes
AuthorizedKeysFile .ssh/authorized_keys
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
```sh
# server
$ net start sshd
```
client側で`ssh-keygen`を実行して作成した`.pub``~/.ssh/authorized_keys`に追記します。これで鍵認証が通ります。
```sh
# client
$ ssh-keygen -f ~/.ssh/test
$ cat ~/.ssh/test.pub
ssh-rsa AAAAXXXX
---
# server
$ echo "ssh-rsa AAAAXXXX" >> ~/.ssh/authorized_keys
$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAXXXX
```
この処理は`ssh-copy-id`などが使用できる場合は短縮できます。windowsのopensshが対応しているかはわかりませんが。
```sh
# client
$ ssh-copy-id -i ~/.ssh/test $USER@192.168.1.23
```
では他のpcからwindowsにアクセスしてみましょう。
```sh
# client
$ ssh -i ~/.ssh/test $USER@192.168.1.23
```
なお、`~/.ssh/config`に書いておくと省略できます。これはclient側です。
> ~/.ssh/config
```sh
Host windows
User syui
Hostname 192.168.1.23
IdentityFile ~/.ssh/test
Port 22
```
```sh
# client
$ ssh windows
```
file(dir) copyも容易です。
```sh
# server
$ echo 12345 > ~/file.txt
# client
$ scp -r windows:file.txt .
$ cat file.txt
12345
```
## default-shell
デフォルト(default)のshellを`pwsh`に変えます。
default-shellを変更した場合の注意ですが、更新した際にerrが出る場合があります。
> Permission denied (publickey,keyboard-interactive).
default-shellのpathが違うとpassword/publickey認証のどちらも通りませんので注意してください。
```sh
$ New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force
```
例えば、pwsh-previewを使っている場合はこうなります。使用しているpwshのpathを確認してください。
```diff
+ C:\Program Files\PowerShell\7-preview\pwsh.exe
- C:\Program Files\PowerShell\7\pwsh.exe
```

55
book/pwsh/README.md Normal file
View File

@ -0,0 +1,55 @@
# powershell
`pwsh`こと`powershell`を使った開発の紹介します。`cmd`を使ってもいいですが、基本的にはterminal(ターミナル)でcommand(コマンド)を実行します。
まず、`Win`+`R`でpwshを起動します。
## winget
package managerの[winget](https://github.com/microsoft/winget-cli)を入れてください。
- https://github.com/microsoft/winget-cli/releases
commandは`winget install xxx`です。
`.preview`を外すと古いverがinstallされます。
```sh
$ winget install git.git
```
|title|url|command(id)|
|---|---|---|
|terminal|https://github.com/microsoft/terminal|microsoft.windowsterminal.preview|
|pwsh|https://github.com/powershell/powershell|microsoft.powershell.preview|
|openssh|https://github.com/powershell/win32-openssh|microsoft.openssh.preview|
|wsl|https://github.com/microsoft/wsl|microsoft.wsl|
|vscode|https://github.com/microsoft/vscode|microsoft.visualstudiocode|
|vim|https://github.com/vim/vim-win32-installer|vim.vim|
|git|https://github.com/git/git|git.git|
|lazygit|https://github.com/jesseduffield/lazygit|jesseduffield.lazygit|
## その他
|title|command(id)|
|---|---|
|cuda|nvidia.cuda|
|epicgames launcher|epicgames.epicgameslauncher|
|blender|blenderfoundation.blender|
|discord|discord.discord|
|unity|unity.unity|
|unity hub|unity.unityhub|
|godot|godot.godot|
## update
```sh
$ winget source update
$ winget upgrade
---
$ winget upgrade --all
```
## choco, scoop
昔は`winget`よりも[choco](https://chocolatey.org/install)や[scoop](https://github.com/ScoopInstaller/Scoop)を使っていました。

53
json/default.json Normal file
View File

@ -0,0 +1,53 @@
{
"uri": "",
"cid": "",
"value": {
"did": "",
"item": {
"card": {
"cp": 0,
"id": 0,
"rare": 0,
"count": 0
},
"coin": {
"id": 0,
"count": 0
},
"weapon": {
"id": 0,
"tp": 0,
"type": 0,
"count": 0,
"attack": 0
}
},
"$type": "ai.syui.game",
"handle": "",
"player": {
"aiten": 0,
"limit": false,
"login": false,
"gender": "male"
},
"version": 2,
"character": {
"dragon": {
"hp": 1,
"lv": 1,
"exp": 0,
"img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreia3huw2gdenqatoobx3hcft74chced46bw4znfgepo5aenegobkri@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"
}
}

View File

@ -1,8 +1,29 @@
{
"uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game/ai",
"cid": "bafyreiglmj347wv2pmqczo7zwalhzlygzwbqrwryu22mkwgl7b2lr3it4m",
"cid": "bafyreiey75xm4j4uu5iyexymn4jroj3wxdlhhlivxhzqzqeqyisjfsyiqy",
"value": {
"did": "did:plc:4hqjfn7m6n5hno3doamuhgef",
"pds": "bsky.social",
"plc": "plc.directory",
"item": {
"card": {
"cp": 0,
"id": 0,
"rare": 0,
"count": 0
},
"coin": {
"id": 0,
"count": 0
},
"weapon": {
"id": 0,
"tp": 0,
"type": 0,
"count": 0,
"attack": 0
}
},
"$type": "ai.syui.game",
"handle": "yui.syui.ai",
"player": {
@ -17,15 +38,13 @@
"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
"critical_d": 0
}
},
"createdAt": "2020-01-01T00:00:00+09:00",

View File

@ -1,8 +1,29 @@
{
"uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game/syui",
"cid": "bafyreiczvkjpurcaud3ywwpptpnfpb5yxutax5rffdg6y552i7qecvzile",
"cid": "bafyreiabqdtzydrm247wtof6fdhjkdcijp5p6viru5hbg6ixybxpkp62pm",
"value": {
"did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn",
"pds": "bsky.social",
"plc": "plc.directory",
"item": {
"card": {
"cp": 0,
"id": 0,
"rare": 0,
"count": 0
},
"coin": {
"id": 0,
"count": 0
},
"weapon": {
"id": 0,
"tp": 0,
"type": 0,
"count": 0,
"attack": 0
}
},
"$type": "ai.syui.game",
"handle": "syui.ai",
"player": {
@ -17,15 +38,13 @@
"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
"critical_d": 0
}
},
"createdAt": "2020-01-01T00:00:00+09:00",