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

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

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

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

Unity

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

Q&A

解決済

2回答

3080閲覧

Unity2D バネの挙動について(キャラクターがバネの動作直前にジャンプ動作(クリック)するとバネに設定した値より高く飛んでしまいます)

Z_Silver

総合スコア27

C#

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

Unity

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

0グッド

1クリップ

投稿2019/08/01 09:46

編集2019/08/01 11:57

###前提・実現したいこと
キャラクターが当たる(又は乗る)と飛ぶバネのギミックを作成したのですが
キャラクターがバネに当たる直前にジャンプ動作(画面をクリック)すると
ジャンプ力が加算されてさらに高く飛んでしまいます。
ジャンプ力が加算されないようにするにはどうしたらいいのでしょうか?
回答よろしくお願いします。

バネの動作
イメージ説明

当たる直前にジャンプ動作(クリック)した場合
イメージ説明
###該当のソース

※キャラクター側のソース JumpPowerは450fです void FixedUpdate() { --------処理省略-------- //ジャンプ力分上に加速 if (isJumpFlg) { rd2D.AddForce(Vector2.up * JumpPower); isJumpFlg = false; } } void Update() { //地面判定 isGroud = rd2D.IsTouching(filter2d); //ボタンをクリック(タップ)した時 if (isGroud && Input.GetMouseButtonDown(0)) { //ヤラレタ場合,クリアした場合ジャンプ不可 if ((playerState == PLAYER_STATE.DOWN) || (!isAlive)) { return; } animator.SetBool("isDash", false); //ダッシュアニメフラグ animator.SetTrigger("Jump"); //ジャンプトリガー isJumpFlg = true; //ジャンプフラグ判定を戻す } } --------処理省略-------- //バネに当たった時 void OnTriggerEnter2D(Collider2D col) { if (col.gameObject.tag == "Spring") { rd2D.velocity = transform.up * 12f; //バネによるジャンプ動作 animator.SetBool("isDash", false); //ダッシュアニメフラグ animator.SetTrigger("Jump"); //ジャンプトリガー audiosource.PlayOneShot(JumpCV3); //ジャンプ;ボイス } } ``` ###バネ側の処理

※バネ側はアニメーションの再生処理(再生1回)のみになります。
private Animator animator;

void Start() { animator = GetComponent<Animator>(); } void OnTriggerEnter2D(Collider2D col) { animator.SetTrigger("AnimeTrigger"); }
###補足情報(言語/FW/ツール等のバージョンなど) Unity 2019.1.6f1 言語:C#

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

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

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

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

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

guest

回答2

0

isJumpFlg が falseになってないから、バネでジャンプ中は再度ジャンプができるのが原因かと思います

それでも1フレームで大ジャンプ出来てしまうので、先にバネジャンプを判定し、その後にキーによるジャンプの判定を行う方が良いと思います

投稿2019/08/01 10:09

izmktr

総合スコア2856

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

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

Z_Silver

2019/08/01 12:54 編集

ご回答ありがとうございます。 OnTriggerEnter2Dの処理に isJumpFlg=falseを追加しました。 ただこのままだとizmktr様が仰る通り1フレームで大ジャンプ出来てしまいます。 そのため「先にバネジャンプを判定」とありますがOnTriggerEnter2Dの処理を優先するということでしょうか? また、その場合の処理はどのように組み込めばよろしいのでしょうか? よろしくお願い致します。
izmktr

2019/08/01 13:09

その変、うまく行かないのなら私にもよくわからないので、適当に対応してください 問題は、AddForceしているのにvelocityも変更してしまえば大ジャンプするので、 両方を同時に行わないようにフラグ管理するだけですから、なんか探せばいい方法があると思います
Z_Silver

2019/08/01 14:18

承知しました。 とりあえず検索してみます。 有難うございました。
guest

0

自己解決

改良したソース

※キャラクター側のソース void Update() { //ボタンをクリック(タップ)した時 if (isGroud && Input.GetMouseButtonDown(0)) { //ヤラレタ場合,クリアした場合ジャンプ不可 ----ここに↓isSpringを追加----  if ((playerState == PLAYER_STATE.DOWN) || (!isAlive)|| (isSpring)) { return; } } } --------処理省略-------- //バネに当たった時 void OnTriggerEnter2D(Collider2D col) { if (col.gameObject.tag == "Spring") {       ----↓追加処理---- isSpring = true; rd2D.velocity = transform.up * 12f; //バネによるジャンプ動作 animator.SetBool("isDash", false); //ダッシュアニメフラグ animator.SetTrigger("Jump"); //ジャンプトリガー audiosource.PlayOneShot(JumpCV3); //ジャンプ;ボイス } } ----↓追加処理---- void OnTriggerExit2D(Collider2D col) { if (col.gameObject.tag == "Spring") { isSpring = false; } } ``` **これにより無事バネの処理が問題なく動作しましたので問題が解決しました**

投稿2019/08/01 17:33

編集2019/08/01 17:40
Z_Silver

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問