いつも教えて頂きありがとうございます。
現在、スマホ上でボタンを押して操作をできるようにしたいと思っています。
そのため、ボタンに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; } } コード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/07/02 21:00