実現したいこと
ゲーム開始時に生成されるキャラクターをジョイスティックで操作したい
発生している問題
キャラクターの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(無料)を使用させていただいております
JoyStickから取得した方向を移動させたいObjectのpositinか速度に反映させればいいのではないでしょうか?
もしくはそれらがまだわからない場合はUnityでobjectを移動させるところをやってみてからのほうがいいかもしれません
もちろん移動自体は自分でスクリプトを書いて無事に動かすことができましたよ
ただキャラクターのprefabにはもともとHierarchy上に置いてたジョイスティックがアタッチできないためどのようにすればいいかという質問です。
キャラクターの移動方法の質問ではなく,prefabにアタッチしたジョイスティックprefabの生成方法という方が正しいですかね
移動が成功したというのは
prefabではないもともと置いてたキャラクターの移動スクリプトにジョイスティックをアタッチして動かすことが成功したという意味です
Hierarchy上に最初からあったキャラクターにはジョイスティックを元からアタッチ出来るので楽でしたがprefabだとそれができないのが面倒です
理解ができず申し訳ないです
質問内容は Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか.
もしくは生成したPrefab(player)の子供の位置にJoyStickPrefabを生成したいということでしょうか.
“ Instantiate か何かで生成したPrefab(player)にJoyStickの DynamicJoystick.cs等のどれかをアタッチしたいということでしょうか”
そういうことです。こちらこそ分かりにくい質問で申し訳ないです。
ちなみに理想としてはFloating Joystickをアタッチさせたいと考えています
初めからPlayerにアタッチしておくのではだめなのでしょうか.
仮に何かしらの制限でアタッチできないのであれば,生成した後にそのオブジェクト(Player)にAddComponent<Floating Joystick.cs?>をすればいいと思いますよ
すみません。説明不足でした。
移動用スクリプトはprayerにアタッチできるのですが、そのスクリプト内で宣言したpublic joystick にジョイスティックprefabがアタッチできないのです
あまり内容が理解できないため,一度そのscript上の載せていただいてもよろしいでしょうか.
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;
}
}
これをプレイヤーにアタッチしています
該当のソースコードのところに記述をお願いします
ここだとかなり見にくいので...
更新しておきました。
Joystickのprefabも一緒に生成すればいいのでしょうか?
一緒に生成したらだめなのでしょうか?
どのように生成すればよいのでしょうか?
Instantiateなどで生成するとして
その後ジョイスティックの対応のさせ方が分からないのです
コードを確認したのですが,上記ではプレハブの生成は行っていないようです.
プレハブの生成を行っているコードも記載してもらっていいですか>
いえ,生成の方法が分からないので質問させていただいているのです。。。
Instantiateを使用してジョイスティックプレハブの生成を行ってみたのですが、
ジョイスティックプレハブは生成されてもキャラクターをそれで動かすことが出来ないのです
ご自身が何ができて何ができていないかをもう少し明確にしたほうがいいと思います
Instantiateを使ってそれぞれを生成できるところまでできているのであれば,Playerを生成した後にPlayerの子供にJoyStickを適当する.
生成できていないのあれば,生成のところを調べる.
上記の二つができていて適当できているが動いていない場合はPhotonのことで詰まっている可能性があるためその部分を調べてみる
Prefabからの生成は調べたらいろいろ出てくると思います.また子供にする方法やscriptだけを特定のobjectにアタッチする方法(生成後に)も出てくると思います
方法が分からないこともあり焦っていたかもしれません。すみませんでした。
質問なのですが
public変数の特性をよく分かっていないのですが、publicで定義すれば別のスクリプトでもそこで定義した変数を使用することはできるのでしょうか?
つまり
ジョイスティックを生成するオブジェクトでpublic FloatingJoystick joystick;
と定義しておけば
キャラクターを移動させるmove.cs内で定義せずに
float x = joystick.Horizontal;
とできるのでしょうか
移動できるかどうかはscriptの書き方にもよるで,わかりません.動くと思ったのならば一度やってみればいいと思います.
分からない場合は,その部分のみまたこのサイトで質問してください
本来の質問内容から逸脱している気がするので,一度Unityの基本からご自身でお調べになって勉強してください(Unityというかプログラムの書き方の基本になると思います)
簡単に説明するとprivateはそのscript内でしか使えない変数,publicはどこからでも呼べる変数です(本来の役割からだいぶ意訳しているので,このまま受け取らないでください)
色々調べた結果,prefab生成後に参照を渡すのがよさそうだったのですがどうすればできますでしょうか
(ゲームプレイヤーprefab生成後に、public FixedJoystick joystick; の部分にヒエラルキー上にあるジョイスティックを入れる方法
色々調べた結果prefab生成後に参照を渡すのがよさそうだったのであれば,それをやってみればいいのではないでしょうか?
やってみて何ができて何ができないのかを記述し質問してください
調べてもスクリプトを渡す方法しか書いていなかったためジョイスティックのオブジェクトを渡す方法が分かりませんでした。教えていただきたいです
色々調べて自分の力で解決できました。
解決できましたら自己解決済みしておいてください
回答2件
あなたの回答
tips
プレビュー