ヒトノードンを滑らせる

# 初めに
はじめてゲームプログラミングで空のおさんぽシリーズやサカナのお屋敷シリーズを作っている ASaDa と申します。
不慣れで稚拙な記事ですがご容赦ください。

おさんぽシリーズの一つの「すべる空のおさんぽ」でヒトノードンを滑らしたんじゃが、その方法を解説していくんじゃ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">夕焼けを見ながらの3Dアスレチックゲームを作ってみたんじゃ<br>人ノードンを滑らすのが難しかったんじゃ<br>ゲームID：G 003 XTP TTW<br>ゲーム名：すべる空のおさんぽ<a href="https://twitter.com/hashtag/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#はじめてゲームプログラミング</a><br>これで本当にネタが切れたんじゃ <a href="https://t.co/YrTstJEkTp">pic.twitter.com/YrTstJEkTp</a></p>&mdash; ASaDaWaRa (@ASaDa_WaRa) <a href="https://twitter.com/ASaDa_WaRa/status/1476554824317825024?ref_src=twsrc%5Etfw">December 30, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

記事の内容を仕組みデータとして公開したんじゃ。IDは G 005 2V8 V0K じゃ。

# 完成品じゃ
<iframe width="560" height="315" src="https://www.youtube.com/embed/if2N_ClhPNk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 長所じゃ
- 床の材質に左右されないんじゃ
- 滑る滑らないのオンオフができるんじゃ
- 滑り具合や最高速度の調整ができるんじゃ

## 短所じゃ
- 壁に当たっても減速しないんじゃ
- 床が傾いていても動かないんじゃ
- ジャンプの瞬間や着地の瞬間の挙動に違和感があるんじゃ

改善出来たら教えてほしいんじゃ。

# 理論を考えるんじゃ
※とにかく動けばいい人は[この章](#プログラムを作っていくんじゃ)まで飛ばしてください
いきなり作っていくのではなく、よく考えた方がいいんじゃ。

## 滑るとはなんじゃろか
摩擦力が小さいということじゃ。
人は歩くときに地面を蹴って、その時の摩擦力で前に進んでいるんじゃ。止まるときも同じで、地面との摩擦力で止まっているんじゃ。この力が小さくなるから、進みにくかったり止まりにくかったりするんじゃ。
もう少し詳しく考えるんじゃ。力が小さいとはどういうことじゃろう。力とは物体を加速させるものじゃ。それが小さいということは、物体の加速が小さいということじゃ。加速というのは速度の変化のことじゃな。
つまり、滑るとは速度の変化が小さいということじゃ。ヒトノードンの速度の変化を小さくすれば滑っているように見えるんじゃ。

## 図で表すとこうじゃ
![速度グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/b4b4604b-67d5-2046-c22d-558bf35f7eb7.png)

縦軸がヒトノードンの移動速度、横軸が時間じゃ。このグラフでは速度の変化量はグラフの傾きじゃな。
通常時はスティックを倒した直後に最高速度に到達し、最高速度のまま移動するんじゃ。そしてスティックを放した直後に速度が0になり止まるんじゃ。
滑る時はスティックを倒している間(上限はあるんじゃが)徐々に速くなっていき、スティックを放してもそのままの速度で移動するんじゃ。

# プログラムを作っていくんじゃ 
ヒトノードンにうごかせるものノードン(速度)を付けて、ヒトノードンを動かしていくんじゃ。速度をカウンターに保存して、スティック入力でその速度を変化させていくんじゃ。

## ヒトノードンを動かなくするんじゃ
ヒトノードンの走っているアニメーションを使いたいので、スティックの入力をポートにつなぐ必要があるんじゃ。そうすると勝手に移動してしまうのでまずはそれを止めるんじゃ。
スティックの入力に‐5をかけてうごかせるものノードンに入力するんじゃ。
![2022122400460600_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/328792f6-63c7-5e8a-49ae-776f0344d560.jpeg)

<iframe width="560" height="315" src="https://www.youtube.com/embed/UnwxCqBTRcA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ヒトノードンの大きさや速度によって調節が必要じゃ。
これでうごかせるものノードンの移動がヒトノードンの移動になるんじゃ。

## ヒトノードンを動かすんじゃ
今回は2.5秒間スティックを倒し続けると最高速度になるように作っていくんじゃ。
速度を保存するためにカウンターを使うんじゃ。カウンターの設定を‐150から150のはんい制限にして、変化するタイミングを0以外のときずっとにするんじゃ。
![2022122316192300_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/1623ad7f-0147-8c58-a0b2-62e0231137e7.jpeg)
スティックの入力をカウンターにつなぎ、速度を変化させるんじゃ。その値に0.1をかけることで速度を調節して、うごかせるものノードンに入力するんじゃ。
![2022122316301500_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/5b0b0016-3960-b4e2-7325-493dfa489536.jpeg)

<iframe width="560" height="315" src="https://www.youtube.com/embed/adoTeahAApE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

地上は完成じゃ。

## ジャンプに対応するんじゃ
ジャンプをした時は地面に足がついていないので、滑らないときと同じにするんじゃ。ただしジャンプ前の速度は保ったままじゃ。またゲーム内では空中でも移動できるんじゃが地上よりは動けない(踏ん張りがきかない)、というところも作っていくんじゃ。

ジャンプ中かどうかを知るために足にセンサーを付けるんじゃ。このセンサーの出力が0と等しければ空中、0より大きければ地上ということじゃ。(負の値は考えないんじゃ)
![2022122316201000_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/58e2c9e2-766e-50b1-bacf-bf33f6c7bf7c.jpeg)

地上にいたときは動かないように‐5をかけていたんじゃが、空中では0にするんじゃ。(本当は空中で動く分を打ち消すのがいいんじゃが、空中ダッシュができるようになったりそもそも少ししか動かなかったり、といった理由から0じゃ)　この値を地上にいるかどうかと掛け算するんじゃ。

次に、空中では地上より速度の変化を小さくするんじゃ。
地上ではスティックの入力の1倍をカウンターに入力していたんじゃが、空中では0.5倍したものをカウンターに入力すればいいんじゃ。

まとめるとこうじゃな。
![2022122400421700_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/4d20566e-3797-0664-3b91-f56287d80034.jpeg)

<iframe width="560" height="315" src="https://www.youtube.com/embed/1B34QLSLGu0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

完成じゃ。
センサーやうごかせるモノノードンを見えなくしたり、うごかせるモノノードンの接続をバネバネにしたりするといいんじゃ。

# 省ノードン化じゃ
今回は説明のためにたくさんのノードンを使ったんじゃが、マッピングを駆使するとここまで減らせるんじゃ。
![省ノードン4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075970/4ded02b0-d5fa-0cbe-6cf2-829c1ebb6c62.jpeg)


# 最後に
最後まで読んでいただいてありがとうございました。
割と簡単に滑らせられるのでやってみてほしいんじゃ。
改良出来たら教えてほしいんじゃ。