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

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

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

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

Unity

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

Q&A

解決済

1回答

524閲覧

ボタンを押している間オブジェクトがY軸に動くスクリプトがうまく動きません。

YANAGI584

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/24 10:21

編集2018/10/24 11:45

UnityでC#で記述していますズブの初心者です。
ボタンを押している間オブジェクトがY軸に動くスクリプトを作成中どうしてもboolで指定した「PushUpKey」が毎フレーム「false」にされてしまいます。
ボタンを押した瞬間「true」にはなるのですが次のフレームになった瞬間「false」にされてしまいボタンを押しても動いてくれません。
初期値を「true」にした場合は今度は動きっぱなしになってしまい困っています。
void Updateには「PushUpKey」を変化させるものを入れていないのになんでこんなことになるのかわかりません。
もしわかる方いましたらご教授いただければと思います。よろしくお願いいたします。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Player : MonoBehaviour { float ValueY; bool PushUpKey; Spaceship Spaceship; IEnumerator Start(){ Spaceship = GetComponent<Spaceship>(); while (true){ Spaceship.Shot(transform); GetComponent<AudioSource>().Play(); yield return new WaitForSeconds(Spaceship.ShotDelay); } } void Move(Vector2 direction) { Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0)); Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1)); Vector2 pos = transform.position; pos += direction * Spaceship.Speed * Time.deltaTime; pos.x = Mathf.Clamp(pos.x, min.x, max.x); pos.y = Mathf.Clamp(pos.y, min.y, max.y); transform.position = pos; } void Update() { if (PushUpKey == true){ ValueY = 1; Debug.Log("1111");//原因特定用 } else if (PushUpKey == false) { ValueY = 0; Debug.Log("0000");//原因特定用 } Vector2 direction = new Vector2(0, ValueY).normalized; Move(direction); } public void UpKeyDown()//ボタンを押している間 { PushUpKey = true;      Debug.Log(PushUpKey);//原因特定用 } public void UpKeyUp()//ボタンを離したとき { PushUpKey = false;        Debug.Log(PushUpKey);//原因特定用 } }

UpKeyDownメソッドとUpKeyUpメソッドはUNITY上でボタン押下時に実行するよう指定しています。

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/10/24 10:26

UpKeyDownメソッド、UpKeyDownメソッドを呼び出しているコードも記載したほうがよいかと。
退会済みユーザー

退会済みユーザー

2018/10/24 10:35 編集

> UpKeyDownメソッドとUpKeyUpメソッドはUNITY上でボタン押下時に実行するよう指定しています。 ここがうまくいっていない可能性もありそうですが。
YANAGI584

2018/10/24 10:39

上記二つのメソッドにDebug.Log(PushUpKey)を加えてコンソールで参照しましたが値は変わっているようでした。ただ瞬間的に「false」にされてしまうようで…。
退会済みユーザー

退会済みユーザー

2018/10/24 10:40

値を変えているのは、上記二つのメソッドを呼び出している部分ですよね?なので、そこがおかしいので変わってしまうのでは?ということです。
YANAGI584

2018/10/24 10:55

UNITY側のイベントトリガーというコンポーネントでUpKeyDownメソッドはpointerdown(ボタン押下時に呼び出す)、UpKeyUpメソッドはpointerup(ボタンを離す時に呼び出す)の登録しておりチェックしてみましたがおかしいような感じはしませんでした。「true」変化後、瞬間的に変わってるようなのでvoid Update内が怪しいと踏んでるのですが原因わからずなんです…。
退会済みユーザー

退会済みユーザー

2018/10/24 11:04

なるほど。原因特定用に用意されているDebug.Log("")を、2つのメソッドのほうに用意すると動きがもうすこしわかりやすいと思いますよ。
YANAGI584

2018/10/24 11:13

アドバイスありがとうございます。2つのメソッドにDebug.Log("")を追記したところコンソールに表示されましたので、やはり一度は値が変わっているようです。
sakura_hana

2018/10/24 11:19

1.PushUpKeyを他のクラスから操作している可能性はありませんか? 2.このスクリプトが複数のオブジェクトに付いていたりしませんか?
退会済みユーザー

退会済みユーザー

2018/10/24 11:22 編集

私のコードではうまくいきましたので、こちらのコードでも試してみますね。 あと、private変数でも、その前の行に[SerializeField]と書いておくと、インスペクターで確認できるので楽しいですよ。
退会済みユーザー

退会済みユーザー

2018/10/24 11:29 編集

貼っていただいたコードってビルドエラーしますよね。もしかしたらですが、ビルドできていないこときづかず、前に成功したビルドで走っており、なにかしら行った修正が効いていないとか?コードを見る限り、Debug.Log("1111");(もしくはDebug.Log("0000");)と、 Debug.Log(PushUpKey);が同数連続で出力されるところ、されていないので、そんな気がします。
退会済みユーザー

退会済みユーザー

2018/10/24 11:32 編集

ちなみに、エラーとなりえる箇所はここ → IEnumerator Start(){ // voidでは?
YANAGI584

2018/10/24 11:33

→sakura_hanaさま PushUpKeyに関しては他のスクリプトやクラスに記述いていないのでアクセスはしていないかと思います。またチェックしましたがこのスクリプトが他のオブジェクトにはアタッチされてはいませんでした。→ ppnさま アドバイスありがとうございます。便利ですねこれ。インスペクタ上で確認しましたがPushUpKeyのチェックボックスはボタンの押下と正常に連動していましたので動いているようです。
退会済みユーザー

退会済みユーザー

2018/10/24 11:36 編集

ごめんなさい、上のやつ嘘書きました。ビルドできますね。ただ、Debug.Logの出力が変なのは、解決の糸口になるのじゃないかと気になります。
退会済みユーザー

退会済みユーザー

2018/10/24 11:39

ということは、PushUpKeyの値は特に問題なかったということかな…?
YANAGI584

2018/10/24 11:44

PushUpKeyが正常に動いてるとなるとvoidUpdate内のIF文がオカシイのかもしれません。文法的に間違っているのでしょうか?コンソールで帰ってくるのは”0000”ばかりなのです。
退会済みユーザー

退会済みユーザー

2018/10/24 11:50

gameobjectの名前の一緒に出力することで、本当にplayerから出力されたものなのか確認してみてもいいかもしれません(全然見当違いの調べ方だったらごめんなさい
YANAGI584

2018/10/24 11:59

今のところDebug.Logを打ち込んでいるのはこのスクリプトのみでして、他のスクリプトやオブジェクトがログを出力しているということはなさそうです。
sakura_hana

2018/10/24 12:00

Unity2018ですが、このコードで正常に動作しました。if文も間違いではないです。よりスマートに書くなら→ if (PushUpKey) {〜} else {〜}   既にPushUpKeyが正常に動作しているということは本格的に原因不明ですが、Debug.Log("0000");をコメントアウトしてみる・Unity再起動・VisualStudio再起動・スクリプト作り直し等するといいかもしれないです。
YANAGI584

2018/10/24 12:13

検証ありがとうございました。なるほど動きましたか。UnityやVisualStudioを再起動しましたがオブジェクトが動いてくれませんでしたので、また作り直してみるようにします。ありがとうございました。
Bongo

2018/10/26 23:36

もうプロジェクトを作り直してしまったのでしたらかまいませんが、もしまだ前のプロジェクトを削除していなければご確認いただきたいのですが、「Debug.Log("1111");」を「Debug.Log("1111 " + this.GetInstanceID());」に、「Debug.Log("0000");」を「Debug.Log("0000 " + this.GetInstanceID());」に、UpKeyDownとUpKeyUpの「Debug.Log(PushUpKey);」を「Debug.Log(PushUpKey + " " + this.GetInstanceID());」に変えてみると、コンソールの出力はどうなるでしょうか?出力結果の末尾の数字はすべて一致するでしょうか。
YANAGI584

2018/10/27 14:03 編集

→Bongoさま 返信遅れて申し訳ありません。スクリプトは作り直してしまいましたが前の状況を復旧させてご指摘いただいたスクリプトに変更したところ”0000”と”PushUpKey”のIDは異なっていました。これは違うスクリプトの影響を受けているということなのでしょうか?
guest

回答1

0

ベストアンサー

インスタンスIDが違うということは、どうやらBUTTON_Uで操作しているPlayerと、シーン上でUpdateを実行しているPlayerが異なっている様子ですね。

「BUTTON_Uで操作しているPlayer」が何者なのかということですが、疑わしいのは「プロジェクトビューのPrefabフォルダ内のPlayer」ですかね?
誤ってシーン上のプレイヤーオブジェクトではなく、プレハブをボタンに参照させてしまった...といった心当たりはないでしょうか。

制作時点でシーン上にプレイヤープレハブのインスタンスを配置している場合は、そのシーン上のプレイヤーをボタンにセットすればいいでしょう。
もし実行時にInstantiateでプレイヤーを生成している場合はインスペクタを使ってセットするわけにいきませんので、ちょっと面倒になってしまいますが、下記のような手順でスクリプト上からイベントリスナーを追加することになると思います。

C#

1using UnityEngine; 2using UnityEngine.EventSystems; 3using UnityEngine.UI; 4 5public class PlayerSpawner : MonoBehaviour 6{ 7 public Button ButtonU; // 上ボタン 8 public GameObject PlayerPrefab; // プレイヤーのプレハブ 9 10 private void Start() 11 { 12 var playerPosition = Vector3.zero; 13 var playerRotation = Quaternion.identity; 14 15 // もし実行時にInstantiateでプレイヤーオブジェクトを生成しているなら... 16 var playerInstance = Instantiate(this.PlayerPrefab, playerPosition, playerRotation); 17 18 // シーン上に生成されたプレイヤーからPlayerスクリプトコンポーネントを取得し... 19 var playerScript = playerInstance.GetComponent<Player>(); 20 21 // PointerDown用のエントリーを作り... 22 var upButtonDownEntry = new EventTrigger.Entry(); 23 upButtonDownEntry.eventID = EventTriggerType.PointerDown; 24 upButtonDownEntry.callback.AddListener(_ => { playerScript.UpKeyDown(); }); 25 26 // PointerUp用のエントリーを作り... 27 var upButtonUpEntry = new EventTrigger.Entry(); 28 upButtonUpEntry.eventID = EventTriggerType.PointerUp; 29 upButtonUpEntry.callback.AddListener(_ => { playerScript.UpKeyUp(); }); 30 31 // ボタンのEventTriggerを取得し... 32 var buttonUEventTrigger = this.ButtonU.GetComponent<EventTrigger>(); 33 34 // triggersにエントリーを追加する 35 buttonUEventTrigger.triggers.Add(upButtonDownEntry); 36 buttonUEventTrigger.triggers.Add(upButtonUpEntry); 37 } 38}

投稿2018/10/27 20:06

Bongo

総合スコア10807

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

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

YANAGI584

2018/10/28 10:11

Bongoさま ありがとうございました。想定した動きができました!ご指摘の通りInstantiateでプレイヤーを作成していました。これで生成されるとprefabのプレイヤーとは別オブジェクト扱いになるのですね。 勉強になりました。 他の皆様もご協力いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問