実現したいこと
ゲーム開始時に生成されるキャラクターをジョイスティックで操作したい
発生している問題
キャラクターのprefabにジョイスティックをアタッチできない
(ジョイスティックのprefabならアタッチできるが,そこからどのようにすればよいか分からない)
該当のソースコード
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;
}
}
試したこと
もともとHierarchyに置いてあったジョイスティックをプレハブにアタッチしようとしてもできなかった
補足情報(FW/ツールのバージョンなど)
Unity 2019.4.11f1
ジョイスティックはAsset StoreのJoystick Pack(無料)を使用させていただいております
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
ayousanz
2020/11/25 18:28
JoyStickから取得した方向を移動させたいObjectのpositinか速度に反映させればいいのではないでしょうか?
もしくはそれらがまだわからない場合はUnityでobjectを移動させるところをやってみてからのほうがいいかもしれません
Jejeje
2020/11/25 18:31
もちろん移動自体は自分でスクリプトを書いて無事に動かすことができましたよ
ただキャラクターのprefabにはもともとHierarchy上に置いてたジョイスティックがアタッチできないためどのようにすればいいかという質問です。
キャラクターの移動方法の質問ではなく,prefabにアタッチしたジョイスティックprefabの生成方法という方が正しいですかね
Jejeje
2020/11/25 18:33
移動が成功したというのは
prefabではないもともと置いてたキャラクターの移動スクリプトにジョイスティックをアタッチして動かすことが成功したという意味です
Hierarchy上に最初からあったキャラクターにはジョイスティックを元からアタッチ出来るので楽でしたがprefabだとそれができないのが面倒です
ayousanz
2020/11/25 18:50 編集
理解ができず申し訳ないです
質問内容は Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか.
もしくは生成したPrefab(player)の子供の位置にJoyStickPrefabを生成したいということでしょうか.
Jejeje
2020/11/25 18:53
“ Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか”
そういうことです。こちらこそ分かりにくい質問で申し訳ないです。
Jejeje
2020/11/25 18:55
ちなみに理想としてはFloating Joystickをアタッチさせたいと考えています
ayousanz
2020/11/25 19:27
初めからPlayerにアタッチしておくのではだめなのでしょうか.
仮に何かしらの制限でアタッチできないのであれば,生成した後にそのオブジェクト(Player)にAddComponent<Floating Joystick.cs?>をすればいいと思いますよ
Jejeje
2020/11/25 19:38
すみません。説明不足でした。
移動用スクリプトはprayerにアタッチできるのですが、そのスクリプト内で宣言したpublic joystick にジョイスティックprefabがアタッチできないのです
ayousanz
2020/11/25 20:46
あまり内容が理解できないため,一度そのscript上の載せていただいてもよろしいでしょうか.
Jejeje
2020/11/25 21: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 22:00
これをプレイヤーにアタッチしています
ayousanz
2020/11/25 22:01
該当のソースコードのところに記述をお願いします
ここだとかなり見にくいので...
Jejeje
2020/11/26 02:55
更新しておきました。
Joystickのprefabも一緒に生成すればいいのでしょうか?
ayousanz
2020/11/26 04:03
一緒に生成したらだめなのでしょうか?
Jejeje
2020/11/26 22:07
どのように生成すればよいのでしょうか?
Instantiateなどで生成するとして
その後ジョイスティックの対応のさせ方が分からないのです
ayousanz
2020/11/26 23:02 編集
コードを確認したのですが,上記ではプレハブの生成は行っていないようです.
プレハブの生成を行っているコードも記載してもらっていいですか>
Jejeje
2020/11/27 01:40
いえ,生成の方法が分からないので質問させていただいているのです。。。
Instantiateを使用してジョイスティックプレハブの生成を行ってみたのですが、
ジョイスティックプレハブは生成されてもキャラクターをそれで動かすことが出来ないのです
ayousanz
2020/11/27 01:56
ご自身が何ができて何ができていないかをもう少し明確にしたほうがいいと思います
Instantiateを使ってそれぞれを生成できるところまでできているのであれば,Playerを生成した後にPlayerの子供にJoyStickを適当する.
生成できていないのあれば,生成のところを調べる.
上記の二つができていて適当できているが動いていない場合はPhotonのことで詰まっている可能性があるためその部分を調べてみる
Prefabからの生成は調べたらいろいろ出てくると思います.また子供にする方法やscriptだけを特定のobjectにアタッチする方法(生成後に)も出てくると思います
Jejeje
2020/11/27 22:35
方法が分からないこともあり焦っていたかもしれません。すみませんでした。
質問なのですが
public変数の特性をよく分かっていないのですが、publicで定義すれば別のスクリプトでもそこで定義した変数を使用することはできるのでしょうか?
Jejeje
2020/11/27 22:40
つまり
ジョイスティックを生成するオブジェクトでpublic FloatingJoystick joystick;
と定義しておけば
キャラクターを移動させるmove.cs内で定義せずに
float x = joystick.Horizontal;
とできるのでしょうか
ayousanz
2020/11/27 23:03 編集
移動できるかどうかはscriptの書き方にもよるで,わかりません.動くと思ったのならば一度やってみればいいと思います.
分からない場合は,その部分のみまたこのサイトで質問してください
本来の質問内容から逸脱している気がするので,一度Unityの基本からご自身でお調べになって勉強してください(Unityというかプログラムの書き方の基本になると思います)
簡単に説明するとprivateはそのscript内でしか使えない変数,publicはどこからでも呼べる変数です(本来の役割からだいぶ意訳しているので,このまま受け取らないでください)
Jejeje
2020/11/28 01:16
色々調べた結果,prefab生成後に参照を渡すのがよさそうだったのですがどうすればできますでしょうか
(ゲームプレイヤーprefab生成後に、public FixedJoystick joystick; の部分にヒエラルキー上にあるジョイスティックを入れる方法
ayousanz
2020/11/28 02:30
色々調べた結果prefab生成後に参照を渡すのがよさそうだったのであれば,それをやってみればいいのではないでしょうか?
やってみて何ができて何ができないのかを記述し質問してください
Jejeje
2020/11/28 02:50
調べてもスクリプトを渡す方法しか書いていなかったためジョイスティックのオブジェクトを渡す方法が分かりませんでした。教えていただきたいです
Jejeje
2020/11/29 01:29
色々調べて自分の力で解決できました。
ayousanz
2020/11/29 15:48
解決できましたら自己解決済みしておいてください