注意:C#超初心者です。何もわかりません。
仕様
・好きなVRMモデルとタイピングする文章をインポートできる。・WPM,rkpm,瞬間wpmがわかる
・タイピングに成功すると自動で前に進む
・ゲームとは言いにくい
自分の制作手順
【VRM】VRM for UnityでVRMインポート
・UniVRMをダウンロード。
・VRMのダウンロード先がわからなかったが、Vroid Hubはわかりやすくてよかったのでおすすめ。
・VRMモデルの生成はどっかのサイトを参考にして改造。
public void LoadModel(string path, ref GameObject model, Transform parent = null) { if (!File.Exists(path)) { Debug.LogError("file not found path = " + path); return; } Debug.LogFormat("{0}", path); var context = new VRMImporterContext(); var file = File.ReadAllBytes(path); context.ParseGlb(file); context.Load(); context.ShowMeshes(); context.EnableUpdateWhenOffscreen(); context.ShowMeshes(); model = context.Root; model.AddComponent<Blinker>(); model.transform.parent = parent; model.transform.localPosition = Vector3.zero; model.transform.localRotation = Quaternion.identity; }
【ユーザー側のファイル指定】OpenFileDialog
OpenFileDialogが必要→System.Windows.Forms.dll(?)の追加が必要。
・mcs.rsp csc.rspを使う or Unity Editor内のdllを追加
謎のエラーが出る上になにか古臭い
・前は他の方法(systemにあるdllをぶちこむ?)でうまく行った気がする。
【タイピング】TypingGameSystemForUnity
GitHubのページが消滅していた。というかGitHubってなに?
ライセンスが不明。追記:この時点では理解していなかったが、ライセンスがないということは、つまりそういうこと。使いたいならすっかり忘れて自分で作り直さないといけないと思われる。
このスクリプトはひらがなのみに対応しているので、句読点の入力が可能なように改造した。具体的には、TypingObject.cs, Update()内のstring[] keysに必要なキーを増やし、
string[] keys = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "-",".",","};
TypingSystem.csの280行目に
case "、": tips.Add(new PatternTip(",")); break; case "。": tips.Add(new PatternTip(".")); break;
を追加した。
さらにwpm/rkpm/瞬間wpmカウント機能を追加した。この瞬間wpmというのは、余り類を見ないが、長年実装したかったものであったため、うまく行ってよかった。上記画像では左側のバーが瞬間wpmを表している。(小並感)
List<float> starttime = new List<float> { 0 }; List<float> endtime = new List<float> { 0 }; List<int> length = new List<int> { 0 }; List<float> recentkeytime = new List<float> { };
で時間計測用、及び最近の打鍵の時刻用の配列を作り、
void TypedCorrectly() { recentkeytime.Add(Time.time); } void Started() { starttime.Add(Time.time); } void Ended() { endtime.Add(Time.time); length.Add(ts.GetInputedKey().Length); int count = endtime.Count - 1; int startcount = starttime.Count - 1; float wpm = length[count] * 60 / (endtime[count] - endtime[count - 1]); float kwpm = length[count] * 60 / (endtime[count] - starttime[count]); wpmText.text = $"wpm:{wpm}\r\nkwpm:{kwpm}\r\ncount:{startcount},{count}"; }
Update()内に追加。
nowwpm = Mathf.Floor(60 * recentkeytime.Count / movingAverageSec); nowWpmText.text = $"WPM(BURST)\r\n{nowwpm}"; slider.value = nowwpm; sliderimage.color = Color.HSVToRGB(nowwpm / slider.maxValue, 1, 1);
Ended(),Started(),TypedCorrectly()を適当なタイミングで呼び出すようにする。計算して表示。
打つ文章を自由に変えられるようにする
StreamingAssetsを使う。Classってよくわかんないけどかっこいいね。(は?
public class TextReader { public string[] TextToArray(string Path, bool islocalPathInStreamingAssets = true) { if (islocalPathInStreamingAssets) { Path = UnityEngine.Application.dataPath + "/StreamingAssets/" + Path; } string text = File.ReadAllText(Path); string trimedData = text.Replace("\r", ""); char[] dem = { '\n' }; Debug.Log($"loaded successfully:{text}"); return trimedData.Split(dem); } }
ファイルにひらがな以外があっても大丈夫なように(ひらがな以外を入れると続行不可になる仕様なので)
string CleanInput(string strIn) { try { return Regex.Replace(strIn, @"[^ぁ-んァ-ヶ\-、。]", "", RegexOptions.None); } catch (RegexMatchTimeoutException) { return ""; } }