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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

3849閲覧

[Unity] UIボタンをクリックした際にジャンプさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/08/02 17:11

編集2021/08/02 18:23

UIのButtonを押した際にプレイヤーを1回のみジャンプさせたいです。

状況

現在プレイヤーにはPlayerScript.cs, Rigidbody, NavMeshAgentが付いています。
NavigationのBakeをしてプレイヤーの歩く範囲を設定しています。
OnClickButton()でのジャンプアニメーションは動作させることはできています。

試したこと

・Rigidbodyを取得してAddForceで上に力を加えてみたり、
プレイヤーにBoxColliderを付け、GroundにGroundタグを設定してみましたが全く動きませんでした。 エラーなどは特に出ていません。
・数値ミスなど確認しましたが特に設定忘れなどは見つかりませんでした。

上記試してみましたが途方に暮れてしまったためアドバイスを頂きたいです。
よろしくお願いします。

追記
ふと思ったのですが、Bakeされている範囲しか移動できないので、ジャンプなどの空中になるとBake範囲外になって動作ができない可能性はありますか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.AI; 5 6public class PlayerScript : MonoBehaviour 7{ 8 public FixedJoystick inputMove; //左画面JoyStick 9 public float moveSpeed = 5.0f; //移動する速度 10 Animator ani; 11 12 private Rigidbody rb; //リジッドボディを取得するための変数 13 public float upForce = 200f; //上方向にかける力 14 private bool isGround; //着地しているかどうかの判定 15 16 float degStop; 17 18 void Start() 19 { 20 //Animatorを取得 21 ani = this.gameObject.GetComponent<Animator>(); 22 //リジッドボディを取得 23 rb = GetComponent<Rigidbody>(); 24 } 25 26 void Update() 27 { 28 Move(); 29 30 if (isGround == true)//着地しているとき 31 { 32 if (Input.GetKeyDown("space")) 33 { 34 isGround = false;// isGroundをfalseにする 35 rb.AddForce(new Vector3(0, upForce, 0)); //上に向かって力を加える 36 } 37 } 38 } 39 40 void Move() 41 { 42 float dx = inputMove.Horizontal; //joystickの水平方向の動きの値、-1~1の値をとる 43 float dy = inputMove.Vertical; //joystickの垂直方向の動きの値、-1~1の値をとる 44 45 float rad = Mathf.Atan2(dx - 0, dy - 0); //原点(0,0)と点(dx,dy)の距離から角度をとってくれる便利な関数 46 47 float deg = rad * Mathf.Rad2Deg; //radianからdegreenに変換する 48 49 this.transform.rotation = Quaternion.Euler(0, deg, 0); //Playerの向きを先ほど取得した角度に当てはめて代入する。今回はy軸方向が回転軸になる。 50 51 if (deg != 0) //joystickの原点と(dx,dy)の2点がなす角度が0ではないとき = joystickを動かしている時 52 { 53 ani.SetBool("Walk", true); //wait→walkへ 54 this.transform.position += this.transform.forward * moveSpeed * Time.deltaTime; //正面方向へプレイヤーを移動させ続ける 55 56 degStop = deg; //停止前のプレイヤーの向きを保存 57 } 58 else //joystickの原点と(dx,dy)の2点がなす角度が0の時 = joystickが止まっている時 59 { 60 ani.SetBool("Walk", false); //walk→waitへ 61 62 this.transform.rotation = Quaternion.Euler(0, degStop, 0); //停止時のプレイヤーの動きの向きを設定 63 } 64 } 65 66 void OnCollisionEnter(Collision other) //地面に触れた時の処理 67 { 68 if (other.gameObject.tag == "Ground") //Groundタグのオブジェクトに触れたとき 69 { 70 isGround = true; //isGroundをtrueにする 71 } 72 } 73 74 //ボタンを押したらジャンプする 75 public void OnClickButton() 76 { 77 ani.SetTrigger("Jump"); 78 } 79}

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

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

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

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

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

guest

回答2

0

ベストアンサー

失礼しました、こちら見落としてました。

OnClickButton()でのジャンプアニメーションは動作させることはできています。

この処理が実装済であればコードとしては下記で良いと思います。

void Update() { Move(); } public void OnClickButton() { if (isGround == true)//着地しているとき { isGround = false; rb.AddForce(new Vector3(0, upForce, 0)); ani.SetTrigger("Jump"); } }

投稿2021/08/05 01:15

YOshim

総合スコア1085

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

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

退会済みユーザー

退会済みユーザー

2021/08/05 03:12

回答ありがとうございます。 上記内容を実装してみましたが、どうしてもジャンプはしませんでした。 isGroundの部分がTrueになっていない?と思われたので、試しにobjectのNameでの取得も試してみましたがそちらもダメでした。 追記部分で記載したNavMeshAgentが怪しいと思い、調べてみたところ下記の記事で標準ではジャンプできないことがわかり記事1と2の方法で実装できました。 回答を頂いたことで勉強になりました。ありがとうございました! ・NavMeshAgentをジャンプさせる方法 https://moon-bear.com/2019/09/12/navmeshagent-jump/ ・[NAVMESH 2] ナビメッシュで障害物やジャンプポイントなどを設定する https://digilab.tech/%E3%80%90unity%E3%80%91navmesh-2-%E3%83%8A%E3%83%93%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A7%E9%9A%9C%E5%AE%B3%E7%89%A9%E3%82%84%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%83%9D%E3%82%A4%E3%83%B3/
YOshim

2021/08/05 04:01 編集

なるほど。 自分の方で確認してみましたが、そもそもNavMeshAgentにかかわらず、私のコードだとジャンプしませんでした。AddForceのForceModeを変更する必要がありました。 rb.AddForce(new Vector3(0, upForce, 0), ForceMode.Impulse); *ボタンクリック等のイベントによるAddForceは一回のみ実行されるため、一般的なForceMode.Forceの場合では移動させるための十分な力が加えられないようです。 NavMeshAgentがある状態でForceMode.Impulseとしてどうなるかは不明ですが、念のため報告させて頂きます。
退会済みユーザー

退会済みユーザー

2021/08/05 14:08

ご報告ありがとうございます。 上記内容にありましたNavMeshAgentがある状態でForceMode.Impulseを付け加えて試してみましたがやはりジャンプしませんでした。NavMeshでは移動範囲を決めれる分、かなり固定されてしまうみたいですね。 別のプロジェクトでジャンプさせる際にまた上記内容を確認してみたいと思います。 勉強になります。ありがとうございます。
guest

0

if (Input.GetKeyDown("space")) { isGround = false;// isGroundをfalseにする rb.AddForce(new Vector3(0, upForce, 0)); //上に向かって力を加える }

上記のコードは、UIボタンではなくスペースキーを押せばジャンプするようになっているかと思います。
UIボタンでジャンプするには、UIボタンのインスペクターのButton内のOnClickの箇所に、実行させたいスクリプトの関数とスクリプトがアタッチされているゲームオブジェクトを指定すればよいです。

ただし、現状のスクリプトはジャンプ処理が関数として切り分けられていないので、多少スクリプトを修正する必要があります。例えばコードの一部を以下のように修正・追加し、UIボタンのインスペクターのOn Click()の関数にJump()を指定すれば、ボタンクリックでJump関数を実行させられます。

void Update() { Move(); } void Jump() { if (isGround == true)//着地しているとき { isGround = false; rb.AddForce(new Vector3(0, upForce, 0)); } }

投稿2021/08/05 01:10

編集2021/08/05 01:11
YOshim

総合スコア1085

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問