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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2811閲覧

ゲーム画面のボタンを離したとき、動きを止めたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/07/02 18:11

いつも教えて頂きありがとうございます。

現在、スマホ上でボタンを押して操作をできるようにしたいと思っています。
イメージ説明
そのため、ボタンにEvent Triggerのコンポーネントを使って、ボタンをクリックしたら移動する関数を呼び出すようにしています。
イメージ説明
しかし、ゲーム画面左下にある左右のボタンを押すと、ボタンを離しても動き続けてしまいます。
おそらく移動する関数をUpdate関数の中に入れてないからだと思うのです。
しかしこの関数は外から呼び出すことになるのでpublicをつけることになると思うのですが、そうするとUpdate関数の中に入れるとerrorが生じてしまいます。
どうすればunityからボタンを押したときだけ移動するような関数を呼び出すことができますか。

以下、スクリプトです。

using UnityEngine; using UnityEngine.SceneManagement; public class PlayerManager : MonoBehaviour { //public public float xspeed; public float jumpPower; public GroundCheck ground; public GameManager gameManager; //SE [SerializeField] AudioClip jumpSE; public Traps trap1; public Trap2 trap2; public Trap3 trap3; //private private bool isGround = false; float speed; bool isDead = false; AudioSource audioSource; public enum DIRECTION_TYPE { STOP, RIGHT, LEFT } DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; Rigidbody2D rigidbody2D; Rigidbody2D trapSpike1; Animator animator; private void Start() { rigidbody2D = GetComponent<Rigidbody2D>(); trapSpike1 = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); audioSource = GetComponent<AudioSource>(); // デバッグ用 Debug.Log("trap1 " + trap1); Debug.Log("trap2 " + trap2); Debug.Log("trap3 " + trap3); } void Update() { isGround = ground.IsGround(); if (isDead) { return; } //接地判定を得る float x = Input.GetAxis("Horizontal"); //speedというパラメータにxを代入 animator.SetFloat("speed", Mathf.Abs(x)); /* if (x == 0) { //止まっている direction = DIRECTION_TYPE.STOP; } else if (x > 0) { //右に動く direction = DIRECTION_TYPE.RIGHT; } else if (x < 0) { //左に動く direction = DIRECTION_TYPE.LEFT; } switch (direction) { case DIRECTION_TYPE.STOP: speed = 0; break; case DIRECTION_TYPE.RIGHT: speed = xspeed; transform.localScale = new Vector3(1, 1, 1); break; case DIRECTION_TYPE.LEFT: speed = -xspeed; transform.localScale = new Vector3(-1, 1, 1); break; } */ } public void GoLeft() //ボタンをクリックしたら右へ移動 <==================問題の箇所 { rigidbody2D.velocity = new Vector2(-xspeed, rigidbody2D.velocity.y); transform.localScale = new Vector3(-1, 1, 1); } public void GoRight() //ボタンをクリックしたら左へ移動 <==================問題の箇所 { rigidbody2D.velocity = new Vector2(xspeed, rigidbody2D.velocity.y); transform.localScale = new Vector3(1, 1, 1); } public void Jump() //ボタンをクリックしたら右へ移動 { if (isGround) { //上に力を加える rigidbody2D.AddForce(Vector2.up * jumpPower); animator.SetBool("isJumping", true); audioSource.PlayOneShot(jumpSE); // Debug.Log("ジャンプしました"); } } private void OnTriggerEnter2D(Collider2D collision) { if (isDead) { return; } if (collision.gameObject.tag == "Trap") { Debug.Log("GameOver"); gameManager.GameOver(); PlayerDeath(); } if (collision.gameObject.tag == "Finish") { Debug.Log("GameClear"); gameManager.GameClear(); Invoke("GameClear",2f); } //トラップSwitchのタグ if (collision.gameObject.tag == "Switch1") { Debug.Log("罠1起動"); trap1.Trap1Activate(); } if (collision.gameObject.tag == "Switch2") { trap2.Trap2Activate(); // Debug.Log(trap2); } if (collision.gameObject.tag == "Switch3") { Debug.Log("罠3起動"); // Debug.Log(trap3); Invoke("AppearblocInvokek", 2.0f);//ブロック出現 } } void AppearblocInvokek()//ブロック出現のためのInvoke { trap3.Appearblock(); } void GameClear()//ブロック出現のためのInvoke { SceneManager.LoadScene("Title"); } void PlayerDeath() { BoxCollider2D boxCollider2D = GetComponent<BoxCollider2D>(); Destroy(boxCollider2D); rigidbody2D.velocity = new Vector2(0, 0); rigidbody2D.AddForce(Vector2.up * 400); animator.Play("PlayerDeathAnimation"); gameManager.GameOver(); isDead = true; } } コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

Pointer Downに加えてPointer Upも併用してみるのはどうでしょうかね?

たとえばPlayerManagerに下記のようなメソッドを追加して...

lang

1 public void StopHorizontalMovement() //ボタンを離したら停止 2 { 3 rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y); 4 }

左ボタン、右ボタンにそれをセットしてやればどうでしょうか。

図

ただし、左ボタンと右ボタンが同時に押される可能性がある場合は「同時押しした左右ボタンのうちいずれかを離すと、その時点で移動停止処理が行われるため、まだもう一方のボタンを押しているのにもかかわらず停止する」といった現象が発生するかもしれません。それがゲームプレイ上問題になるようでしたら、もう少し詳しくボタンの押し離し状態を管理する必要があるでしょうね。

投稿2021/07/02 20:27

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2021/07/02 21:00

なるほど!思いつきませんでした! スクリプトばっかりを気にしてたら駄目なんですね。 ありがとうございます、助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問