質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2334閲覧

コントローラースティックの傾き加減により加速する移動の仕組みが理解できない

ITATI

総合スコア14

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/01/16 14:26

編集2019/01/22 14:50

前提・実現したいこと

書籍「Unityではじめる2Dゲーム作り徹底ガイド」を参考にし、
水平移動のソースを利用して垂直移動を作りたいと考えています。

発生している問題

水平移動のソースにコントローラースティックの傾き加減により加速させる仕様があるため、計算式がよくわからない事になっています。
移動に使われているソースを抜粋しました。

PlayerController.cs

public class PlayerController : BaseCharacterController {  public override void Horizontal_Move(float n)//水平移動 { if (!activeSts){return;} // 初期化 float dirOld = dir; breakEnabled = false; // アニメーション指定 moveSpeed = Mathf.Clamp(Mathf.Abs(n), -1.0f, +1.0f); animator.SetFloat("MovSpeed", moveSpeed); if (n != 0.0f) { // 移動 dir = Mathf.Sign(n);//方向転換を指示する命令 moveSpeed = (moveSpeed < 0.5f) ? (moveSpeed * (1.0f / 0.5f)) : 1.0f; if (grounded || movement_active) { speedVx = initSpeed * moveSpeed * dir;//歩行時の移動量 } } else { breakEnabled = true; }// 移動停止    if (dirOld != dir){ breakEnabled = true; }//その場で振り向きチェック      }

疑問点

moveSpeed = (moveSpeed < 0.5f) ? (moveSpeed * (1.0f / 0.5f)) : 1.0f;

moveSpeedが、0.5f以下なら(moveSpeed * (1.0f / 0.5f))の計算を行いmoveSpeedへ格納するものと思われますが、
0.5f以上場合は1.0fにして、0.5f以下の場合にmoveSpeedを2倍すると移動としておかしなものになる様な気がします。
この計算式(moveSpeed * (1.0f / 0.5f))部分は何を行っているものでしょうか?

②[無意味なコードであったことが分かりましたので、質問と言えず削除しました。]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

② は自作のコードということでしょうか。質問がよく分かりませんでした。

取り急ぎ、① のみ回答します。

moveSpeed = (moveSpeed < 0.5f) ? (moveSpeed * (1.0f / 0.5f)) : 1.0f;

このコードは、

  • moveSpeed が 0.5 未満なら、その値を2倍する
  • moveSpeed が 0.5 以上なら、1f とする

というものですね。

図にするとこんな感じです。
イメージ説明

投稿2019/01/16 15:42

negitama

総合スコア943

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ITATI

2019/01/16 16:06

アドバイスありがとうございます。 >>② は自作のコードということでしょうか。質問がよく分かりませんでした。 ②に記載した部分は自作のコードです。 元々記載されていたのが水平方向に移動する為のコードでしたので、それを複製してX部分をYに変えればよいのではないかという考えでした。 >>moveSpeed が 0.5 未満なら、その値を2倍する >>moveSpeed が 0.5 以上なら、1f とする 図まで提供いただき、ありがとうございます。 式はそのままの意味でしたか・・・。(1.0f / 0.5f)という書き方に何らかの意味があるのではと混乱していました。
negitama

2019/01/16 16:18 編集

(1.0f / 0.5f) という書き方の意味は、0.5f の値を変えてみるとどうなるか考えてみると分かりやすいかもしれません。 たとえば 0.6f に変えると、 moveSpeed = (moveSpeed < 0.6f) ? (moveSpeed * (1.0f / 0.6f)) : 1.0f; のようなコードにできます。これの意味は、 ・moveSpeed が 0.6 未満なら、その値を (1.0f / 0.6f) 倍する ・(moveSpeed が 0.6 のとき、ちょうど 1 になる) ・moveSpeed が 0.6 以上なら、1 とする ということです。 さきほどの回答の図で、「元の値」に示している場所が 0.5 から 0.6 に変わるイメージです。
negitama

2019/01/16 16:57

話がそれてしまいますが、書籍「Unityではじめる2Dゲーム作り徹底ガイド」については私も以前(途中まで)やってみました。そのときの情報をまとめているので、よかったらこちらも参考にしてみてください。 http://negi-lab.blog.jp/archives/18587781.html
ITATI

2019/01/22 14:42

②についてですが、ご指摘の通り記述が無茶苦茶だったようで、全く意味のないコードになっていました。 キャラクターがY方向に作用させる為の変数、計算式を用意する必要がありました。現状、不完全ながらY方向に力がかかるようになりました。
negitama

2019/01/22 14:50

「Y方向に力をかける」というのは、上方向にジャンプすることでしょうか。それとも別の移動方法を言っているのでしょうか。そのあたりがイメージできず、回答できませんでした。ジャンプであればそちらの書籍に書いてありますし。
ITATI

2019/01/22 15:02 編集

最終的には梯子を使う為の上下移動(Y方向)を追加しようと思っており、 その前段階としてどこででも↑↓ボタンを押すと上下にオブジェクトが移動するようにしたかったのですが、先日のコードでは↑↓ボタンを押してもX方向に力がかかっていたり、歩行停止時にブレーキが利かなくなっていたりと、全く使い様が無いコードになってた事が質問後にわかりました。 我ながら酷いコードでした・・・。
negitama

2019/01/22 15:12

なるほど、ハシゴでの移動だったのですね。失礼しました。 float inputY = Input.GetAxis("Vertical"); で上下キーやW/Sキーなどでの入力を取れると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問