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

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

詳細はこちら
C#

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

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

Q&A

解決済

1回答

1433閲覧

Unityを使用したゲーム(Cities:Skylines)において、コルーチンが読み込めない。

Kamine

総合スコア8

C#

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

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

0グッド

0クリップ

投稿2021/03/13 13:29

概要

現在、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 }

最後に

色々と試してみましたが、行き詰まってしまったので、どうかご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

コルーチン自体は読み込めていました。

投稿2021/03/14 09:32

Kamine

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問