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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

2回答

4770閲覧

ジャンプが一瞬で終わってしまう。

horitomo

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2016/07/28 15:35

編集2016/07/28 18:58

すみません、質問させてください。

ある3Dキャラをジャンプさせようと思います。
それで以下のスクリプトを書きました。

c#

1 2void Update () { 3 4 //回転と移動 5 Vector3 direction = new Vector3(Input.GetAxis("Horizontal"), 0, 0); 6 if (direction.sqrMagnitude > 0.01f) { 7 Vector3 forward = Vector3.Slerp( 8 transform.forward, direction, rotationSpeed * Time.deltaTime / Vector3.Angle(transform.forward, direction)); 9 transform.LookAt(transform.position + forward); 10 } 11 characterController.Move(direction * Speed * Time.deltaTime); 12 13 //移動アニメ 14 if (Input.GetAxis("Horizontal")!=0) 15 { 16 anim.SetBool("Run", true); 17 Debug.Log("移動してるよ"); 18 } 19 else if (Input.GetAxis("Horizontal") == 0) 20 { 21 anim.SetBool("Run", false); 22 Debug.Log("移動してないよ"); 23 } 24 //攻撃アニメ 25 if (Input.GetKeyDown(KeyCode.Space) ) 26 { 27 anim.SetBool("Attack", true); 28 Debug.Log("攻撃したよ"); 29 } 30 else 31 { 32 anim.SetBool("Attack", false); 33 Debug.Log("攻撃終わったよ"); 34 } 35 //Jump 36 if (Input.GetKeyDown(KeyCode.UpArrow)) 37 { 38 Debug.Log("じゃんぷしたよ"); 39 anim.SetBool("Jump", true); 40 } 41 else 42 { 43 anim.SetBool("Jump", false); 44 Debug.Log("じゃんぷ終わったよ"); 45 } 46 47 } 48

攻撃はうまくできるのですが、Jumpの入力をした際、
アニメーションが一瞬で終わってしまい、ひざがカクってするだけです。
もう少しモーションの発生時間を長くできれば状況が改善すると思うのですが、
どのようにすれば良いのでしょうか?
よろしくおねがいします。
**以下追記

メカニム
メカニムの設定を無理やりいじったら多少改善しました。
何故かジャンプがスローモーションになりますが・・・

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

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

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

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

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

guest

回答2

0

コードを見る限り、Inputの使い方に懸念が見られます。
ジャンプ及び攻撃の入力判断に使用しているInput.GetKeyDown()は押した瞬間を判断する関数です。
その関数のifelseで判断しているため、キーを押してanim.SetBool( "Jump", true );が呼ばれたとしても、翌フレームにはすぐにanim.SetBool( "Jump", false );が呼ばれてしまうため、Jumpステートに入ったらすぐにアニメーションが終わってしまうのではないでしょうか。
mugicyaさんの回答にもあるように少し作りを変える必要があると思いますよ。

その点を確認してみてください。

これは少し余談ですが、アニメーションの遷移情報にHasExitTimeというものがあります。
イメージ説明
これをONにしていると、そのステートのアニメーションが終了しないとステートの遷移が始まらないようになります。
状況次第で使ってみるのもありかもしれません。
アニメーション遷移

HasExitTimeなし
イメージ説明

HasExitTimeあり
イメージ説明

ご参考になればと思います。

投稿2016/07/28 22:45

urahimono

総合スコア714

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

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

horitomo

2016/07/29 01:51

回答ありがとうございます。まずは、HasExitTimeの機能を確認してみようと思います。そのうえで、お二方のご指摘の通り、違った作り(とりあえず簡素な作りの格闘ゲームもしくはアクションゲームのキャラクターのスクリプトを探して、学習する。)を検討してみようと思います。 危うく迷走するところでした。ありがとうございました。
guest

0

このノリで作っていったら、すごく面倒な事になりそうなので、格闘ゲームなどのプレイヤーの作り方を書きます。
あくまで、僕のやり方ですが。

プレイヤーキャラの基本姿勢に必ず戻るような処理を書く。

格闘ゲームなら、フットワークのようなモーションが基本姿勢だと思うのですが、
移動、攻撃、防御、何をしても基本的にフットワークに戻る。
フットワークの処理の場所でいろいろ判断して処理させます。

パッと見た感じ、ジャンプした瞬間、ほかの処理に邪魔されて戻っているだけだと思います。
ただ、if で分岐していては、どんだけややこしくなるか…。
この程度の不具合で「?」となっている状態では、この先破たんするのは目に見えている気がしませんか?

投稿2016/07/28 18:35

mugicya

総合スコア1046

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

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

horitomo

2016/07/28 19:01

回答ありがとうございます。 質問内容を追記しました。 一応、メカニムは、Idleに戻るようにしているのですが。。。 格闘ゲームのキャラをちょっと探してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問