まずはじめに、Update()が呼ばれた時には2種類の状態があることを認識しないといけません。
1つ目は、ブレードが表示されていない場合で、
2つ目は、ブレードが表示されている場合です。
当たり前のことを言っていますが、このことをきちんと理解しておかなければいけません。
Update()では、2つの状態をわけてコードを書かなければいけません。
となると、Update()は以下のような形になるはずですよね。
C#
1void Update(){
2 if(ブレードが表示されている){
3 // ブレードが表示されている時の処理
4 }else{
5 // ブレードが表示されていない時の処理
6 }
7}
次に、質問者さんが書いたコードを見て、上記2つのどちらの状態の場合の処理か考えていきます。
C#:一部抜粋
1 // Vが押されたら
2 if (Input.GetKeyDown(KeyCode.V))
3 {
4 //ブレードをオンにする
5 bbm.GetComponent<BladeOnOff>().BladeOn();
6
7 //時間カウント開始
8 seconds += Time.deltaTime;
9 }
「Vキーが押されたらブレードをオンにする」という処理ですが、これは当然、「ブレードが表示されていない場合」の処理になります。
ところが、「時間カウント開始」のところの seconds += Time.deltaTime;
はカウント開始を表していません。経過時間を計算しています。
経過時間の計算とカウント開始をごっちゃに考えてしまっているのが、混乱の元になっていると思われます。
ここでは一旦、カウント開始に焦点を絞って(vann_2921さんの考えと同様に)、secondsを0にするのが良いでしょう。また、それとは別に「ブレードが表示されている」ことを表すフラグも導入したほうが良いです。
以上をふまえて、「ブレードが表示されていない」ときの処理を書くと、
// Vが押されたら
if (Input.GetKeyDown(KeyCode.V))
{
//ブレードをオンにする
bbm.GetComponent<BladeOnOff>().BladeOn();
//時間カウント開始
isBladeOn = true;
seconds = 0;
}
のような感じになるでしょう。
続いて、
C#:一部抜粋
1 //1秒経ったら
2 if (seconds >= 1.0f)
3 {
4 //時間計測を0に戻す
5 seconds = 0f;
6
7 //ブレードをオフにする
8 bbm.GetComponent<BladeOnOff>().BladeOff();
9 }
のコードを考えていきます。
こちらは「1秒経ったら、ブレードをオフにする」処理ですので、「ブレードが表示されている」時の処理になります。
「 時間計測を0に戻す」処理は、ブレードが表示されていない時の処理に移動したので、ここでは記述する必要がなくなっていますので、それを省くと、「ブレードが表示されている」時の処理は、
C#
1 if (seconds >= 1.0f) //1秒経ったら
2 {
3 //ブレードをオフにする
4 bbm.GetComponent<BladeOnOff>().BladeOff();
5 isBladeOn = false;
6 }else{ // 1秒経っていない時
7 // 経過時間の計算
8 seconds += Time.deltaTime;
9 }
となります。
以上をまとめると、Update()のコードは次のようになるでしょう。
C#
1bool isBladeOn = false;
2
3void Update(){
4 if(isBladeOn){ // ブレードが表示されている時の処理
5 if (seconds >= 1.0f) //1秒経ったら
6 {
7 //ブレードをオフにする
8 bbm.GetComponent<BladeOnOff>().BladeOff();
9 isBladeOn = false;
10 }else{ // 1秒経っていない時は
11 // 経過時間を計算する。
12 seconds += Time.deltaTime;
13 }
14 }else{ // ブレードが表示されていない時の処理
15 // Vキーが押されたら
16 if (Input.GetKeyDown(KeyCode.V))
17 {
18 //ブレードをオンにする
19 bbm.GetComponent<BladeOnOff>().BladeOn();
20
21 //時間カウント開始
22 isBladeOn = true;
23 seconds = 0;
24 }
25 }
26}
27
このように、Unityでは、Update()関数内の処理は状態ごとに場合分けして考える必要があります。