前提・実現したいこと
学校の課題で音ゲーを作成しているunity初心者です
スタジオしまづ様の動画を見ながら自分で改良を重ねています
音ゲーのシステムとしては、右手側で言うと、右手でのノーツを生成するために、note_RightプレハブにMoveRightスクリプトをアタッチして、そこで、参照したい、曲がり方のための変数divrを受け取り、divrigに代入してレーンごとのノーツの曲がり方を変更しています。
参照される側の、public変数であるdivr自体はInstantRightスクリプトで定義しています
MoveRightスクリプトでは、落ちると同時に拡大もしているので、ノーツの左部分がズレるのを右に徐々に進ませることでまっすぐ進んでいるように見せています
GameobjectとしてSignalReceiverを用意し、そこには、MIDIデータで用意した音源の音に反応してnote_Rightプレハブが、例えばラが一回鳴ると第一レーンに一つのーつが、生成されるようになっています
GeneRightスクリプトでは動かすためのMoveRightスクリプトを受け取り、SpawnNoteでレーンごとにノーツを準備しています
InstantRightスクリプトは、レーンごとに生成したいノーツの位置と曲がり方を変更して最終的に生成しています
簡潔な順序としては
Signalreceiverによって、midiデータからNoteEvent1~4が起動し、GeneRightが、MoveRightがアタッチされたnote-Rightプレハブを保持している状態を、InstantRightで実行していると解釈しています。
一番にやりたいこととしては、NoteEvent1~4でpublic変数をイベントごとに定義し直して、ノーツが右に進む割合を徐々に増やしたいので、MoveRight.csでは分母にあたるdivrの値が変更することになるので、定義し直した変数が反映され、MoveRight.csによるノーツの動き方をそれぞれ実現することです。
(*1レーン目のノーツと2レーン目のノーツが落ち方が一緒なので重なってしまっているゲーム画面)
発生している問題・エラーメッセージ
InstantRight.csでのpublic変数がうまく機能していません
参照するオブジェクトAにAスクリプト、参照されるオブジェクトBにBスクリプトがアタッチされているとしたら、今回ではオブジェクトAはnoteプレハブでAスクリプトはMoveRight.cs,オブジェクトBはSignalReceiverでBスクリプトはInstantRight.csだと認識しております
Event1~4で、public変数を変更するやり方はまずあっているのか自信がありません。
やりたいことを現在コードで定義しているやり方の延長線上で実現できたり、何か他の方法で同様の結果が得られたら嬉しいです
大変長くなりましたが、アドバイスをいただければと思います
該当のソースコード
unity
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class InstantRight : MonoBehaviour 6{ 7 [SerializeField] GeneRight geneRight = default; 8 9 public static int divr=9; 10 // Start is called before the first frame update 11 public void NoteEvent1() 12 { 13 geneRight.SpawnNote(new Vector3(2,40,0)); 14 divr=9; 15 } 16 public void NoteEvent2() 17 { 18 geneRight.SpawnNote(new Vector3(5,40,0)); 19 divr=7; 20 } 21 public void NoteEvent3() 22 { 23 divr=5; 24 geneRight.SpawnNote(new Vector3(8,40,0)); 25 } 26 public void NoteEvent4() 27 { 28 divr=3; 29 geneRight.SpawnNote(new Vector3(10,40,0)); 30 } 31 32} 33
unity
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MoveRight : MonoBehaviour 6{ 7 8 float speed; 9 int divrig; 10 11 12 void Start() 13 { 14 divrig = InstantRight.divr; 15 16 speed =47; 17 StartCoroutine ("ScaleUp"); 18 } 19 20 void Update() 21 { 22 transform.Translate((speed * Time.deltaTime)/divrig,-speed * Time.deltaTime,0); 23 } 24 25 IEnumerator ScaleUp() 26 { 27 for ( float i = 0 ; i < 40 ; i+=1f ){ 28 transform.localScale += new Vector3(i/44,i/44,0); 29 yield return new WaitForSeconds(0.05f); 30 } 31 } 32}
unity
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GeneRight : MonoBehaviour 6{ 7 [SerializeField] MoveRight notePrefab; 8 9 // Start is called before the first frame update 10//[SerializeField] GameManager gameManager = default; 11 public void SpawnNote(Vector3 pos) 12 { 13 Instantiate(notePrefab,pos, Quaternion.identity); 14 //gameManager.AddNotes(1); 15 } 16}
試したこと
public変数での定義を数パターンやってみて、エラーが出ないのが現在のコードです
補足情報(FW/ツールのバージョンなど)
unityのバージョンは2021.2.4f1です
ノーツに対するMidiのイベントはこのツールで実行しています
https://github.com/keijiro/MidiAnimationTrack
スクリプト間での変数の共有はここらへんを参考にしました
https://ymgsapo.com/2020/10/22/unity-refer-script/
https://teratail.com/questions/212545
あなたの回答
tips
プレビュー