概要
現在、Cities:Skylinesというゲームで、車両を時刻表で制御するmodを制作しています。
動かす処理自体はできたのですが、その処理を呼び出すためのコルーチンが読み込めず、悩んでいます。
目標
コルーチンを読み込み、modを機能させることです。
試したこと
string変数を作り、StartCoroutine(string変数)などとしましたが、読み込めませんでした。
利用環境
Unity5.6
Visual Studio 2017
ソースコードについて
ソースコードは以下の通りです。
かなり長文で申し訳ございません。
(ゲーム独自のクラスなどが含まれていますので、コメントで可能な限り説明します)
C#
1 2 3 public class TimetableModUpdate : MonoBehaviour //車両を時刻表で制御する(問題の部分) 4 { 5 int listnum = 0; //時刻表の順番 6 7 int i = 0; //車両の順番 8 9 List<int> hour = new List<int>(); //時刻表の時を格納 10 List<int> minute = new List<int>(); //時刻表の分を格納 11 12 List<ushort> vehicleID = new List<ushort>(); //ゲーム内の車両番号を格納 13 14 ushort curlinenum = 225; //ゲーム内の路線番号 15 16 public void Start() 17 { 18 } 19 20 public void Update() //おそらく、ここの記述に問題があると思います 21 { 22 IEnumerator timetable0 = Timetable0(); 23 IEnumerator timetable1 = Timetable1(); 24 IEnumerator timetable2 = Timetable2(); 25 IEnumerator timetable3 = Timetable3(); 26 27 StartCoroutine(timetable0); 28 i++; 29 30 StartCoroutine(timetable1); 31 i++; 32 33 StartCoroutine(timetable2); 34 i++; 35 36 StartCoroutine(timetable3); 37 i++; 38 39 //車両の順番が路線の車両数を超えたら、コルーチンを読み込まない 40 if (i >= TransportManager.instance.m_lines.m_buffer[curlinenum].CountVehicles(curlinenum)) 41 { 42 43 } 44 } 45 46 IEnumerator Timetable0() //Timetable1~3は全く同じ処理なので省略しています 47 { 48 //車両番号を代入 49 vehicleID[i] = TransportManager.instance.m_lines.m_buffer[curlinenum].GetVehicle(i); 50 51 //時刻を追加(hourとminuteは同じリスト番号で管理しています) 52 hour.Add(0); minute.Add(30); 53 hour.Add(1); minute.Add(30); 54 hour.Add(2); minute.Add(30); 55 56 57 //時刻表の順番が、指定時刻の数-1に収まる間 58 while (listnum < hour.Count) 59 { 60 //ゲーム内時刻より、指定時刻が早かったら 61 if (SimulationManager.instance.m_currentGameTime.Hour > hour[listnum] | SimulationManager.instance.m_currentGameTime.Minute > minute[listnum]) 62 { 63 //ゲーム内時刻より、指定時刻が遅くなるまで 64 while (SimulationManager.instance.m_currentGameTime.Hour < hour[listnum] | SimulationManager.instance.m_currentGameTime.Minute < minute[listnum]) 65 { 66 listnum++; //時刻表の順番を1繰り下げ 67 } 68 } 69 70 //ゲーム内時刻と、指定時刻が同じだったら 71 if (SimulationManager.instance.m_currentGameTime.Hour == hour[listnum] & SimulationManager.instance.m_currentGameTime.Minute == minute[listnum]) 72 { 73 listnum++; //時刻表の順番を1繰り下げ 74 75 SameTime(); //ゲーム内時刻と、指定時刻が同じだった場合に呼び出すメソッド 76 77 yield return null; 78 79 void SameTime() 80 { 81 //指定した車両の出発フラグが立っていたら 82 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags == (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Leaving)) 83 { 84 return; 85 } 86 87 //指定した車両の出発フラグが立っていなかったら 88 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags != (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Leaving)) 89 { 90 //指定した車両の停車フラグが立っていたら 91 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags == (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 92 { 93 //指定した車両の停車フラグをオフにする 94 VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags = VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags.SetFlags(Vehicle.Flags.Stopped, false); 95 96 return; 97 } 98 99 //指定した車両の停車フラグが立っていなかったら 100 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags != (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 101 { 102 return; 103 } 104 } 105 } 106 } 107 108 //ゲーム内時刻と、指定時刻が異なったら 109 if (SimulationManager.instance.m_currentGameTime.Hour != hour[listnum] | SimulationManager.instance.m_currentGameTime.Minute != minute[listnum]) 110 { 111 NotSameTime(); //ゲーム内時刻と、指定時刻が異なった場合に呼び出すメソッド 112 113 yield return null; 114 115 void NotSameTime() 116 { 117 //指定した車両の出発フラグが立っていたら 118 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags == (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Leaving)) 119 { 120 //指定した車両の停車フラグが立っていたら 121 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags == (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 122 { 123 return; 124 } 125 126 //指定した車両の停車フラグが立っていなかったら 127 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags != (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 128 { 129 //指定した車両の出発フラグをオフにする 130 VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags = VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags.SetFlags(Vehicle.Flags.Leaving, false); 131 //指定した車両の停車フラグをオンにする 132 VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags = VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags.SetFlags(Vehicle.Flags.Stopped, true); 133 134 return; 135 } 136 } 137 138 //指定した車両の出発フラグが立っていなかったら 139 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags != (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Leaving)) 140 { 141 //指定した車両の停車フラグが立っていたら 142 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags == (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 143 { 144 //指定した車両が動いていない時 145 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].GetSmoothVelocity(vehicleID[i]).magnitude == 0) 146 { 147 //指定した車両の停車フラグをオンにする 148 VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags = VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags.SetFlags(Vehicle.Flags.Stopped, true); 149 150 return; 151 } 152 153 //指定した車両が動いている時 154 else 155 { 156 //ゲーム内時刻よりも、指定時刻が遅かったら 157 if (SimulationManager.instance.m_currentGameTime.Hour < hour[listnum] | SimulationManager.instance.m_currentGameTime.Minute < minute[listnum]) 158 { 159 return; 160 } 161 162 //ゲーム内時刻よりも、指定時刻が遅くなかったら 163 else 164 { //指定した車両の停車フラグをオフにする 165 VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags = VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags.SetFlags(Vehicle.Flags.Stopped, false); 166 167 return; 168 } 169 } 170 171 } 172 //指定した車両の停車フラグが立っていなかったら 173 if (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags != (VehicleManager.instance.m_vehicles.m_buffer[vehicleID[i]].m_flags | Vehicle.Flags.Stopped)) 174 { 175 return; 176 } 177 } 178 } 179 } 180 //時刻表の番号が、指定時刻の数に達したら 181 if (listnum >= hour.Count) 182 { 183 listnum = 0; //時刻表の順番をリセット 184 185 break; 186 } 187 } 188 yield return null; 189 } 190 191 }
最後に
色々と試してみましたが、行き詰まってしまったので、どうかご回答よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。