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

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

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

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

Unity

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

Q&A

解決済

2回答

1529閲覧

UIのボタンをクリックしたら、オブジェクトを動かしたい

qonoha

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/15 02:25

お世話になります。
UNITYを使用し、UIのボタンの設置と、ボタンを押した場合のスクリプト(ログに文字を出してみました)、
ランダムな数だけオブジェクトを動かすスクリプト、それら3つを作ったのですが、ボタンを押したときの動作に組み込んだところ、
エラーは出ないのですが何も起こらない状況になってしまいました。

ボタンにrigidスクリプトを関連づけて、OnClickを選んであげて、という手順を踏みました。
他には設置した画像のレイヤーがUIになっていたので、デフォルトに直したぐらいしかしておりません。

大変お手数ですが、ひとまずオブジェクトが動くようになるよう、直すべき箇所をご指摘頂けないでしょうか。
何卒よろしくお願い致します。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Threading.Tasks; 5 6public class rigid : MonoBehaviour 7{ 8 int j = 0; 9 int k = 0; 10 //ボタンを押した時の処理 11 public void OnClick() 12 { 13 Vector3 targetPosition; 14 float speed = 1.0f; 15 // Use this for initialization 16 async void Start() 17 { 18 targetPosition = GameObject.Find("看板").transform.position; 19 int l = j; 20 string[] a = new string[12] { "Image", "Image (1)", "Image (2)", "Image (3)", "Image (4)", "Image (5)", "Image (6)", "Image (7)", "Image (8)", "Image (9)", "Image (10)", "Image (11)" }; 21 System.Random r1 = new System.Random(); 22 int r2 = r1.Next(0, 4);//0から2 23 for (int i = k; i <= r2 + j; i++) 24 { 25 //Cubuのオブジェクトの位置を取得 26 l = l + 1; 27 targetPosition = GameObject.Find(a[l]).transform.position; 28 await Task.Delay(1100); 29 } 30 k = j; 31 } 32 // Update is called once per frame 33 void Update() 34 { 35 float step = speed * Time.deltaTime; 36 transform.position = Vector3.MoveTowards(transform.position, targetPosition, step); 37 } 38 } 39} 40

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

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

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

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

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

guest

回答2

0

ベストアンサー

startとupdateは外に書かないと動かないと思います。ランダムや遅延でどういう処理をしたいのかあまり読み取れませんでしたが、jとkがインクリメントされていないのでずっと0になってるかと思います。
とりあえずボタンを押すとtargetsの位置に順番に移動していくscriptに修正してみたので以下参考にしてみてください。動かしてないのでちゃんと動くか分かりませんが、、
余談ですが、変数名はちゃんと意味のあるものにしましょう。後から見たらわけわからなくなります。

C#

1using UnityEngine; 2 3public class rigid : MonoBehaviour 4{ 5 System.Random random = new System.Random(); 6 7 GameObject kanban; 8 9 string[] targets = { "Image", "Image (1)", "Image (2)", "Image (3)", "Image (4)", "Image (5)", "Image (6)", "Image (7)", "Image (8)", "Image (9)", "Image (10)", "Image (11)" }; 10 Vector3 targetPosition; //選択中のtargetの位置 11 int nowPosCount = -1; //string targets[12]の何番目にいるか 12 13 float speed = 1.0f; 14 15 bool moving = false; //trueの時MoveObject()呼び出す 16 bool reverse = false; //trueならtargetsの0から11まで順番に,falseなら逆 17 18 void Start() 19 { 20 kanban = GameObject.Find("看板"); 21 targetPosition = kanban.transform.position; 22 } 23 void Update() 24 { 25 if (moving) 26 { 27 MoveObject(); 28 if (kanban.transform.position == targetPosition) 29 { 30 moving = false; 31 } 32 } 33 } 34 void MoveObject() 35 { 36 float step = speed * Time.deltaTime; 37 transform.position = Vector3.MoveTowards(transform.position, targetPosition, step); 38 } 39 void SetTargetPosition(int objectNumber) 40 { 41 targetPosition = GameObject.Find(targets[objectNumber]).transform.position; 42 moving = true; 43 } 44 //ボタンを押した時の処理 45 public void OnClick() 46 { 47 //reverseによってimageを行ったり来たりする 48 if (!reverse) 49 { 50 nowPosCount++; 51 SetTargetPosition(nowPosCount); 52 if (nowPosCount == 11) reverse = true; 53 } 54 else 55 { 56 nowPosCount--; 57 SetTargetPosition(nowPosCount); 58 if (nowPosCount == 0) reverse = false; 59 } 60 } 61}

投稿2020/01/15 03:37

RyotaroIsoyama

総合スコア183

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

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

qonoha

2020/01/15 05:19

ご回答頂きまして、ありがとうございます。 いまさらながら、ダメダメだなと思ってしまい、出直すことにします。 質問しておいて、申し訳ないです。 また、よろしくお願い致します。もうちょっと勉強してきます。 コード、ありがとうございました。
guest

0

スクリプトの設計が間違っていると思います、VisualCodeを使ってスクリプトを編集していればStartとUpdateが一度も使用されていませんと出ていると思うのですが...。
OnClickメソッド内にStartやUpdateを入れても働きません。
ボタンを押した際に処理を実行したいのであればUpdate内に書くのではなく、個別でOnClickメソッドを立ててその中に記述するべきです。

あと多分押した瞬間だけ動くようにするとボタンが押された一瞬しか処理が実行されないので、「"ボタンが押されている間"動かす」方が望む挙動になると思います。
この場合はButtonコンポーネントのOnClickを使うのではなく、EventTriggerのPointDownを使います。
この記事が参考になります。
ボタン長押しでプレイヤー移動

投稿2020/01/15 02:59

Y0241-N

総合スコア1066

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

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

qonoha

2020/01/15 05:18

ご回答頂きまして、ありがとうございます。 いまさらながら、ダメダメだなと思ってしまい、出直すことにします。 質問しておいて、申し訳ないです。 また、よろしくお願い致します。もうちょっと勉強してきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問