同じ処理を何回も書くのはダメだと聞いたので、同じことを書いてる処理を関数化しました。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6 7public class MeasurementOfTime : MonoBehaviour 8{ 9 [SerializeField] private Text finishText; // 三周したらFINISHI と表示 10 [SerializeField] private Text timeText; // 時間表示のText 11 [SerializeField] private Text showLap; // ラップ表示のText 12 [SerializeField] private PlayerRanking player; // Playerのラップを取得 13 [SerializeField] private ResultScreen result; // リザルトする 14 [SerializeField] private float finishidisplayTime; // Finishiの表示時間を計測 15 [SerializeField] private float finishidisplayTimeEnd = 5; // Finishiの表示時間 16 17 // 時間計測 18 private float wholeTime; // 全体の 19 private float oneLapTime; // 1ラップ目 20 private float twoLapTime; // 2ラップ目 21 private float threeLapTime; // 3ラップ目 22 23 // 分を数える 24 private int wholeMinute; // 全体の 25 private int oneLapMinute; // 1ラップ目 26 private int twoLapMinute; // 2ラップ目 27 private int threeLapMinute; // 3ラップ目 28 29 // Time を格納 30 private string wholeTimeStoring; // 全体の 31 private string oneLapTimeStoring; // 1ラップ目 32 private string twoLapTimeStoring; // 2ラップ目 33 private string threeLapTimeStoring; // 3ラップ目 34 35 private int oldLap; // 前フレームのラップを格納 36 37 void Start() 38 { 39 finishText.enabled = false; 40 } 41 42 void Update() 43 { 44 45 46 MeasureTime(); 47 } 48 /// <summary> 49 /// 時間を計測 50 /// </summary> 51 private void MeasureTime() 52 { 53 var minute = 60; // 一分 54 55 // 全体の時間 56 wholeTime += Time.deltaTime; 57 if (wholeTime >= minute) { 58 59 wholeMinute++; 60 wholeTime = wholeTime - minute; 61 } 62 wholeTimeStoring = "TIME " + wholeMinute.ToString("00") + ":" + string.Format("{0:0#.000}", wholeTime); 63 timeText.text = wholeTimeStoring; 64 //= "TIME " + wholeMinute.ToString("00") + ":" + string.Format("{0:0#.000}", wholeTime); 65 //wholeTimeStoring = "TIME " + wholeMinute.ToString("00") + ":" + string.Format("{0:0#.000}", wholeTime); 66 MeasuredForEachLap(); 67 68 // 負荷軽減 69 if (player.lapCount != oldLap) { 70 71 showLap.text = "LAP " + player.lapCount.ToString() + "/3"; 72 oldLap = player.lapCount; 73 } 74 } 75 /// <summary> 76 /// ラップごとに時間を計測 77 /// </summary> 78 private void MeasuredForEachLap() 79 { 80 81 var minute = 60; 82 83 if (player.lapCount == 1) { // 1ラップ目 84 85 oneLapTime += Time.deltaTime; 86 87 if (oneLapTime >= minute) {// 60秒経ったら分をプラス 88 89 oneLapMinute++; 90 oneLapTime = oneLapTime - minute; 91 } 92 // ラップのタイムを保存 93 oneLapTimeStoring 94 = "LAP1 " + oneLapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", oneLapTime); 95 //LapTimeCount(oneLapTime, oneLapMinute, oneLapTimeStoring,1); 96 } 97 else if (player.lapCount == 2) { // 2ラップ目 98 99 twoLapTime += Time.deltaTime; 100 if (twoLapTime >= minute) { 101 102 twoLapMinute++; 103 twoLapTime = twoLapTime - minute; 104 } 105 // ラップのタイムを保存 106 twoLapTimeStoring 107 = "LAP2 " + twoLapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", twoLapTime); 108 //LapTimeCount(twoLapTime, twoLapMinute, twoLapTimeStoring,2); 109 } 110 else if (player.lapCount == 3) {// 3ラップ目 111 112 threeLapTime += Time.deltaTime; 113 if (threeLapTime >= minute) { 114 115 threeLapMinute++; 116 threeLapTime = threeLapTime - minute; 117 } 118 // ラップのタイムを保存 119 threeLapTimeStoring 120 = "LAP3 " + threeLapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", threeLapTime); 121 //LapTimeCount(threeLapTime, threeLapMinute, threeLapTimeStoring,3); 122 } 123 } 124 /// <summary> 125 /// そのラップの時間を計測 126 /// </summary> 127 private void LapTimeCount(float lapTime,int lapMinute,string timeStoring,string rap) 128 { 129 var minute = 60; // 分 130 131 lapTime += Time.deltaTime; 132 if (lapTime >= minute) 133 { 134 lapMinute++; 135 lapTime = lapTime - minute; 136 }// ラップのタイムを保存 137 timeStoring 138 = string.Format($"LAP{rap} ") + lapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", lapTime); 139 } 140}
やったこと
このラップに応じて、時間を格納するコードですが、上記で言った通りなのですが、同じ処理を繰り返しているので、関数化して、見やすくしたいとおもって、関数を作ってみたのですが、、、
C#
1 /// <summary> 2 /// そのラップの時間を計測 3 /// </summary> 4 private void LapTimeCount(float lapTime,int lapMinute,string timeStoring,string rap) 5 { 6 var minute = 60; // 分 7 8 lapTime += Time.deltaTime; 9 if (lapTime >= minute) 10 { 11 lapMinute++; 12 lapTime = lapTime - minute; 13 }// ラップのタイムを保存 14 timeStoring 15 = string.Format($"LAP{rap} ") + lapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", lapTime); 16 }
ゲームが終わったらリザルトとして、全体の時間(wholeTimeStoring)とラップごとの時間(oneLapTimeStoring,twoLapTimeStoring,threeLapTimeStoring)をだすのですが、
oneLapTimeStoring,twoLapTimeStoring,threeLapTimeStoringがnull と出ます。
何故でしょうか?回答お願いします
out を付けたのですが、、一瞬のtimeStoringしか格納されません。
C#
1 private void LapTimeCount( float lapTime, int lapMinute,out string timeStoring,string rap) 2 { 3 var minute = 60; // 分 4 5 lapTime += Time.deltaTime; 6 if (lapTime >= minute) 7 { 8 lapMinute++; 9 lapTime = lapTime - minute; 10 }// ラップのタイムを保存 11 timeStoring 12 = string.Format($"LAP{rap} ") + lapMinute.ToString("00") + ":" + string.Format("{0:0#.000}", lapTime); 13 }
なんとなく原因はわかるのですが、LapTimeCount() の引数を rap 以外参照渡しにすれば時間を計測できると思うのですが、引数のfloat lapTime なんかに out を付けてやると、未割り当てのout パラメーター、lapTime が使用されました。,と出てしまいます。書き方なんかが間違っているのでしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/15 06:35
2021/01/15 07:54
2021/01/15 17:39 編集
2021/01/15 09:39 編集
2021/01/15 10:50