🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

2590閲覧

Unity 生成したprefabをジョイスティックで移動させる方法

Jejeje

総合スコア38

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/11/25 09:21

編集2020/11/25 17:53

実現したいこと

ゲーム開始時に生成されるキャラクターをジョイスティックで操作したい

発生している問題

キャラクターのprefabにジョイスティックをアタッチできない
(ジョイスティックのprefabならアタッチできるが,そこからどのようにすればよいか分からない)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Photon.Pun; 5 6public class move_joystick : MonoBehaviourPun 7{ 8public FixedJoystick joystick;//FixedJoystickを取得 9 10private float speed = 5.0f; 11private float jumpPower = 275; 12private float delay = 0f; 13public AudioClip MoveSound; 14public AudioClip JumpSound; 15private Rigidbody rb; 16// Start is called before the first frame update 17void Start() 18{ 19if (photonView.IsMine) 20{ 21rb = GetComponent<Rigidbody>(); 22} 23} 24 25 26// Update is called once per frame 27void Update() 28{ 29var x = joystick.Horizontal; 30var y = joystick.Vertical; 31float radian = Mathf.Atan2(x, y) * Mathf.Rad2Deg; 32 33if (radian < 0) 34{ 35radian += 360; 36} 37Debug.Log(radian); 38 39if(photonView.IsMine) 40{ 41if (x == 0) 42{ 43if (y == 0) 44{ 45return; 46} 47} 48 49if (radian <= 15) 50{ 51 52photonView.RPC(nameof(Move5), RpcTarget.All); 53Invoke("SoundMove", delay); 54} 55 56else if (radian <= 75) 57{ 58 59photonView.RPC(nameof(Move3), RpcTarget.All); 60Invoke("SoundMove", delay); 61} 62 63else if (radian <= 105) 64{ 65 66photonView.RPC(nameof(Move1), RpcTarget.All); 67Invoke("SoundMove", delay); 68} 69 70else if (radian <= 165) 71{ 72 73photonView.RPC(nameof(Move6), RpcTarget.All); 74Invoke("SoundMove", delay); 75} 76 77else if (radian <= 195) 78{ 79 80photonView.RPC(nameof(Move8), RpcTarget.All); 81Invoke("SoundMove", delay); 82} 83 84else if (radian <= 255) 85{ 86 87photonView.RPC(nameof(Move7), RpcTarget.All); 88Invoke("SoundMove", delay); 89} 90 91else if (radian <= 285) 92{ 93 94photonView.RPC(nameof(Move2), RpcTarget.All); 95Invoke("SoundMove", delay); 96} 97 98else if (radian <= 345) 99{ 100 101photonView.RPC(nameof(Move4), RpcTarget.All); 102Invoke("SoundMove", delay); 103} 104 105else if (radian <= 360) 106{ 107 108photonView.RPC(nameof(Move5), RpcTarget.All); 109Invoke("SoundMove", delay); 110} 111} 112 113Ray ray = new Ray(transform.position, -transform.up); 114{ 115//接地判定 116RaycastHit hit; 117if (Physics.Raycast(ray, out hit, 0.25f)) 118{ 119if (Input.GetKeyDown(KeyCode.O)) 120{ 121rb.AddForce(transform.up * jumpPower); 122AudioSource.PlayClipAtPoint(JumpSound, transform.position); 123} 124 125} 126} 127 128} 129void SoundMove() 130{ 131if (photonView.IsMine) 132{ 133AudioSource.PlayClipAtPoint(MoveSound, transform.position); 134} 135} 136 137[PunRPC] 138private void Move1() 139{ 140transform.rotation = Quaternion.AngleAxis(90, new Vector3(0, 1, 0)); 141transform.position += transform.forward * speed * Time.deltaTime; 142} 143[PunRPC] 144private void Move2() 145{ 146transform.rotation = Quaternion.AngleAxis(-90, new Vector3(0, 1, 0)); 147transform.position += transform.forward * speed * Time.deltaTime; 148} 149[PunRPC] 150private void Move3() 151{ 152transform.rotation = Quaternion.AngleAxis(45, new Vector3(0, 1, 0)); 153transform.position += transform.forward * speed * Time.deltaTime; 154} 155[PunRPC] 156private void Move4() 157{ 158transform.rotation = Quaternion.AngleAxis(-45, new Vector3(0, 1, 0)); 159transform.position += transform.forward * speed * Time.deltaTime; 160} 161[PunRPC] 162private void Move5() 163{ 164transform.rotation = Quaternion.AngleAxis(0, new Vector3(0, 1, 0)); 165transform.position += transform.forward * speed * Time.deltaTime; 166} 167[PunRPC] 168private void Move6() 169{ 170transform.rotation = Quaternion.AngleAxis(135, new Vector3(0, 1, 0)); 171transform.position += transform.forward * speed * Time.deltaTime; 172} 173[PunRPC] 174private void Move7() 175{ 176transform.rotation = Quaternion.AngleAxis(-135, new Vector3(0, 1, 0)); 177transform.position += transform.forward * speed * Time.deltaTime; 178} 179[PunRPC] 180private void Move8() 181{ 182transform.rotation = Quaternion.AngleAxis(180, new Vector3(0, 1, 0)); 183transform.position += transform.forward * speed * Time.deltaTime; 184} 185 186}

試したこと

もともとHierarchyに置いてあったジョイスティックをプレハブにアタッチしようとしてもできなかった

補足情報(FW/ツールのバージョンなど)

Unity 2019.4.11f1

ジョイスティックはAsset StoreのJoystick Pack(無料)を使用させていただいております

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

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

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

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

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

ayousanz

2020/11/25 09:28

JoyStickから取得した方向を移動させたいObjectのpositinか速度に反映させればいいのではないでしょうか? もしくはそれらがまだわからない場合はUnityでobjectを移動させるところをやってみてからのほうがいいかもしれません
Jejeje

2020/11/25 09:31

もちろん移動自体は自分でスクリプトを書いて無事に動かすことができましたよ ただキャラクターのprefabにはもともとHierarchy上に置いてたジョイスティックがアタッチできないためどのようにすればいいかという質問です。 キャラクターの移動方法の質問ではなく,prefabにアタッチしたジョイスティックprefabの生成方法という方が正しいですかね
Jejeje

2020/11/25 09:33

移動が成功したというのは prefabではないもともと置いてたキャラクターの移動スクリプトにジョイスティックをアタッチして動かすことが成功したという意味です Hierarchy上に最初からあったキャラクターにはジョイスティックを元からアタッチ出来るので楽でしたがprefabだとそれができないのが面倒です
ayousanz

2020/11/25 09:50 編集

理解ができず申し訳ないです 質問内容は Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか. もしくは生成したPrefab(player)の子供の位置にJoyStickPrefabを生成したいということでしょうか.
Jejeje

2020/11/25 09:53

“ Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか” そういうことです。こちらこそ分かりにくい質問で申し訳ないです。
Jejeje

2020/11/25 09:55

ちなみに理想としてはFloating Joystickをアタッチさせたいと考えています
ayousanz

2020/11/25 10:27

初めからPlayerにアタッチしておくのではだめなのでしょうか. 仮に何かしらの制限でアタッチできないのであれば,生成した後にそのオブジェクト(Player)にAddComponent<Floating Joystick.cs?>をすればいいと思いますよ
Jejeje

2020/11/25 10:38

すみません。説明不足でした。 移動用スクリプトはprayerにアタッチできるのですが、そのスクリプト内で宣言したpublic joystick にジョイスティックprefabがアタッチできないのです
ayousanz

2020/11/25 11:46

あまり内容が理解できないため,一度そのscript上の載せていただいてもよろしいでしょうか.
Jejeje

2020/11/25 12:59

using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; public class move_joystick : MonoBehaviourPun { public FixedJoystick joystick;//FixedJoystickを取得 private float speed = 5.0f; private float jumpPower = 275; private float delay = 0f; public AudioClip MoveSound; public AudioClip JumpSound; private Rigidbody rb; // Start is called before the first frame update void Start() { if (photonView.IsMine) { rb = GetComponent<Rigidbody>(); } } // Update is called once per frame void Update() { var x = joystick.Horizontal; var y = joystick.Vertical; float radian = Mathf.Atan2(x, y) * Mathf.Rad2Deg; if (radian < 0) { radian += 360; } Debug.Log(radian); if(photonView.IsMine) { if (x == 0) { if (y == 0) { return; } } if (radian <= 15) { photonView.RPC(nameof(Move5), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 75) { photonView.RPC(nameof(Move3), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 105) { photonView.RPC(nameof(Move1), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 165) { photonView.RPC(nameof(Move6), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 195) { photonView.RPC(nameof(Move8), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 255) { photonView.RPC(nameof(Move7), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 285) { photonView.RPC(nameof(Move2), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 345) { photonView.RPC(nameof(Move4), RpcTarget.All); Invoke("SoundMove", delay); } else if (radian <= 360) { photonView.RPC(nameof(Move5), RpcTarget.All); Invoke("SoundMove", delay); } } Ray ray = new Ray(transform.position, -transform.up); { //接地判定 RaycastHit hit; if (Physics.Raycast(ray, out hit, 0.25f)) { if (Input.GetKeyDown(KeyCode.O)) { rb.AddForce(transform.up * jumpPower); AudioSource.PlayClipAtPoint(JumpSound, transform.position); } } } } void SoundMove() { if (photonView.IsMine) { AudioSource.PlayClipAtPoint(MoveSound, transform.position); } } [PunRPC] private void Move1() { transform.rotation = Quaternion.AngleAxis(90, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move2() { transform.rotation = Quaternion.AngleAxis(-90, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move3() { transform.rotation = Quaternion.AngleAxis(45, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move4() { transform.rotation = Quaternion.AngleAxis(-45, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move5() { transform.rotation = Quaternion.AngleAxis(0, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move6() { transform.rotation = Quaternion.AngleAxis(135, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move7() { transform.rotation = Quaternion.AngleAxis(-135, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } [PunRPC] private void Move8() { transform.rotation = Quaternion.AngleAxis(180, new Vector3(0, 1, 0)); transform.position += transform.forward * speed * Time.deltaTime; } }
Jejeje

2020/11/25 13:00

これをプレイヤーにアタッチしています
ayousanz

2020/11/25 13:01

該当のソースコードのところに記述をお願いします ここだとかなり見にくいので...
Jejeje

2020/11/25 17:55

更新しておきました。 Joystickのprefabも一緒に生成すればいいのでしょうか?
ayousanz

2020/11/25 19:03

一緒に生成したらだめなのでしょうか?
Jejeje

2020/11/26 13:07

どのように生成すればよいのでしょうか? Instantiateなどで生成するとして その後ジョイスティックの対応のさせ方が分からないのです
ayousanz

2020/11/26 14:03 編集

コードを確認したのですが,上記ではプレハブの生成は行っていないようです. プレハブの生成を行っているコードも記載してもらっていいですか>
Jejeje

2020/11/26 16:40

いえ,生成の方法が分からないので質問させていただいているのです。。。 Instantiateを使用してジョイスティックプレハブの生成を行ってみたのですが、 ジョイスティックプレハブは生成されてもキャラクターをそれで動かすことが出来ないのです
ayousanz

2020/11/26 16:56

ご自身が何ができて何ができていないかをもう少し明確にしたほうがいいと思います Instantiateを使ってそれぞれを生成できるところまでできているのであれば,Playerを生成した後にPlayerの子供にJoyStickを適当する. 生成できていないのあれば,生成のところを調べる. 上記の二つができていて適当できているが動いていない場合はPhotonのことで詰まっている可能性があるためその部分を調べてみる Prefabからの生成は調べたらいろいろ出てくると思います.また子供にする方法やscriptだけを特定のobjectにアタッチする方法(生成後に)も出てくると思います
Jejeje

2020/11/27 13:35

方法が分からないこともあり焦っていたかもしれません。すみませんでした。 質問なのですが public変数の特性をよく分かっていないのですが、publicで定義すれば別のスクリプトでもそこで定義した変数を使用することはできるのでしょうか?
Jejeje

2020/11/27 13:40

つまり ジョイスティックを生成するオブジェクトでpublic FloatingJoystick joystick; と定義しておけば キャラクターを移動させるmove.cs内で定義せずに float x = joystick.Horizontal; とできるのでしょうか
ayousanz

2020/11/27 14:05 編集

移動できるかどうかはscriptの書き方にもよるで,わかりません.動くと思ったのならば一度やってみればいいと思います. 分からない場合は,その部分のみまたこのサイトで質問してください 本来の質問内容から逸脱している気がするので,一度Unityの基本からご自身でお調べになって勉強してください(Unityというかプログラムの書き方の基本になると思います) 簡単に説明するとprivateはそのscript内でしか使えない変数,publicはどこからでも呼べる変数です(本来の役割からだいぶ意訳しているので,このまま受け取らないでください)
Jejeje

2020/11/27 16:16

色々調べた結果,prefab生成後に参照を渡すのがよさそうだったのですがどうすればできますでしょうか (ゲームプレイヤーprefab生成後に、public FixedJoystick joystick; の部分にヒエラルキー上にあるジョイスティックを入れる方法
ayousanz

2020/11/27 17:30

色々調べた結果prefab生成後に参照を渡すのがよさそうだったのであれば,それをやってみればいいのではないでしょうか? やってみて何ができて何ができないのかを記述し質問してください
Jejeje

2020/11/27 17:50

調べてもスクリプトを渡す方法しか書いていなかったためジョイスティックのオブジェクトを渡す方法が分かりませんでした。教えていただきたいです
Jejeje

2020/11/28 16:29

色々調べて自分の力で解決できました。
ayousanz

2020/11/29 06:48

解決できましたら自己解決済みしておいてください
guest

回答2

0

自己解決

JoystickのコンポーネントがついているGameObjectをGameObject.Findで取得します。(私はtag検索を使っています)
取得したGameObjectをGetComponentしてJoystick変数にぶちこみます。

投稿2020/11/29 13:09

編集2021/09/30 15:19
Jejeje

総合スコア38

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

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

0

同じ問題で悩んでおります。どのように解決されましたか?

投稿2021/09/30 14:56

araragi_dev

総合スコア60

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

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

Jejeje

2021/09/30 15:19

解決した方法を自己解決方法に追記しておきましたのでそちらをご確認ください!
araragi_dev

2021/10/01 00:39

ありがとうございます!とても助かります! 試してみます!
araragi_dev

2021/10/01 13:57

大変恐縮なのですが、以下のやり方が分からず、補足いただけませんでしょうか? 「取得したGameObjectをGetComponentしてJoystick変数にぶちこみます。」 上記箇所だけで構いませんので、ソースいただけると大変助かります…
araragi_dev

2021/10/02 03:20

すみません、上記解決いたしました! Dynamic JoystickオブジェクトをFindし、そのオブジェクトのDynamicJoystickスクリプトをGetComponentし、joystick変数に打ち込めばよかったのですね。 joystick = GameObject.Find("Dynamic Joystick").GetComponent< DynamicJoystick >();
Jejeje

2021/10/07 15:05

返信今気付きました! 解決されたようでよかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問