質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

3272閲覧

【Unity】変数が瞬間的に大きな負の値になってしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2017/05/05 12:26

Substring関数を使ったところ、Cannot be negativeというエラーが出てしまい、Substring関数に用いている引数を調べたところ、瞬間的に非常に大きな負の値になってそのあとは普通の挙動をしているのがわかりました。
ですが、なぜ、どこの問題でこの値になっているかが分かりません。
問題の変数は int displayCharacterCountです。イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class UIControl : MonoBehaviour { 7 public Text uiText; //Textへの参照. 8 private GameObject panel; //Panaelを格納. 9 public Button speakbutton; //話すボタンを参照. 10 private bool friend_finEvent,x_finEvent,player1_finEvent; //初回のイベントが終わったか. 11 public string[] strArray_ff; //セリフを格納. 12 public string[] strArray_fs; 13 public string[] strArray_xf; 14 public string[] strArray_xs; 15 public string[] strArray_pf; 16 public string[] strArray_ps; 17 private PlayerControl pc; 18 [SerializeField][Range(0.001f,0.3f)] 19 float intervalForCharacterDisplay = 0.05f; //1文字の表示にかかる時間. 20 21 private enum STEP //会話時のステータス. 22 { 23 NONE = -1, 24 FriendFirst = 0, 25 FriendSecond, 26 XFirst, 27 XSecond, 28 Player1First, 29 Player1Second, 30 NUM, 31 }; 32 STEP now_step; 33 34 private int currentLine = 0; //現在の行数. 35 private string currentText = string.Empty; //現在の文字列. 36 private float timeUntilDisplay = 0; //表示にかかる時間. 37 private float timeElapsed = 1; //文字列の表示を開始した時間. 38 private int lastUpdateCharacter = -1; //表示中の文字数. 39 40 // Use this for initialization 41 void Start () { 42 panel = GameObject.FindGameObjectWithTag ("Panel"); //panelを取得. 43 close_display(); 44 pc = GameObject.FindGameObjectWithTag ("Player").GetComponent<PlayerControl> (); 45 } 46 47 // Update is called once per frame 48 void Update () { 49 if (IsCompleteDisplayText) { 50 switch (now_step) { //ボタンが押されたら次のセリフ。最後のセリフがおわったらパネルを閉じる. 51 case STEP.NONE: 52 break; 53 case STEP.FriendFirst: 54 if (currentLine < strArray_ff.Length && Input.GetMouseButtonDown (0)) { 55 setString (strArray_ff [currentLine]); 56 } else if (currentLine == strArray_ff.Length && Input.GetMouseButtonDown (0)) { 57 close_display (); 58 } 59 break; 60 case STEP.FriendSecond: 61 if (currentLine < strArray_fs.Length && Input.GetMouseButtonDown (0)) { 62 setString (strArray_fs [currentLine]); 63 } else if (currentLine == strArray_fs.Length && Input.GetMouseButtonDown (0)) { 64 close_display (); 65 } 66 break; 67 case STEP.XFirst: 68 if (currentLine < strArray_xf.Length && Input.GetMouseButtonDown (0)) { 69 setString (strArray_xf [currentLine]); 70 } else if (currentLine == strArray_xf.Length && Input.GetMouseButtonDown (0)) { 71 close_display (); 72 } 73 break; 74 case STEP.XSecond: 75 if (currentLine < strArray_xs.Length && Input.GetMouseButtonDown (0)) { 76 setString (strArray_xs [currentLine]); 77 } else if (currentLine == strArray_xs.Length && Input.GetMouseButtonDown (0)) { 78 close_display (); 79 } 80 break; 81 case STEP.Player1First: 82 if (currentLine < strArray_pf.Length && Input.GetMouseButtonDown (0)) { 83 setString (strArray_pf [currentLine]); 84 } else if (currentLine == strArray_pf.Length && Input.GetMouseButtonDown (0)) { 85 close_display (); 86 } 87 break; 88 case STEP.Player1Second: 89 if (currentLine < strArray_ps.Length && Input.GetMouseButtonDown (0)) { 90 setString (strArray_ps [currentLine]); 91 } else if (currentLine == strArray_ps.Length && Input.GetMouseButtonDown (0)) { 92 close_display (); 93 } 94 break; 95 } 96 } else { 97 if (Input.GetMouseButtonDown (0)) 98 timeUntilDisplay = 0; 99 } 100 101 int displayCharacterCount = 102 (int)(Mathf.Clamp01 ((Time.time - timeElapsed) / timeUntilDisplay) * 103 currentText.Length); //経過時間の%分の文字数. 104 Debug.Log(displayCharacterCount); 105 106 if (displayCharacterCount != lastUpdateCharacter) { //文字数が更新されてたら. 107 uiText.text = currentText.Substring (0, displayCharacterCount);//表示文字数を更新. 108 lastUpdateCharacter = displayCharacterCount; //現在の文字数を保管. 109 } 110 } 111 112 void set_display(){ //パネルを表示. 113 panel.gameObject.SetActive (true); 114 speakbutton.interactable = false; 115 } 116 117 void setString(string str){ //セリフを次に変更. 118 currentText = str; 119 currentLine++; 120 121 timeUntilDisplay = currentText.Length * intervalForCharacterDisplay;//文字列の表示にかかる時間を保管. 122 timeElapsed = Time.time; //現在の時間を保管. 123 124 lastUpdateCharacter = -1; 125 } 126 127 void close_display(){ //パネルを非表示. 128 panel.gameObject.SetActive (false); 129 speakbutton.interactable = true; 130 } 131 132 public void On_Speak_Button(){ //話すボタンが押されたら、 133 Debug.Log("正常動作1"); 134 switch (pc.closest) { //近くの人が誰か,初回かどうかによってイベントを発生させる. 135 case PlayerControl.CLOSEST.NONE: 136 break; 137 case PlayerControl.CLOSEST.FRIEND: 138 Debug.Log ("正常動作2"); 139 if (!friend_finEvent) { 140 friendFirstEvent (); 141 friend_finEvent = true; 142 } else { 143 friendSecondEvent (); 144 } 145 break; 146 case PlayerControl.CLOSEST.X: 147 if (!x_finEvent) { 148 xFirstEvent (); 149 x_finEvent = true; 150 } else { 151 xSecondEvent (); 152 } 153 break; 154 case PlayerControl.CLOSEST.PLAYER1: 155 if (!player1_finEvent) { 156 player1FirstEvent (); 157 player1_finEvent = true; 158 } else { 159 player1SecondEvent (); 160 } 161 break; 162 } 163 } 164 165 void friendFirstEvent(){ //友達の初回イベント発生. 166 set_display (); //パネル表示. 167 now_step = STEP.FriendFirst; //現在の状態を保管. 168 currentLine = 0; 169 setString (strArray_ff [currentLine]); //文字列を表示. 170 } 171 172 void friendSecondEvent(){ 173 set_display (); 174 now_step = STEP.FriendSecond; 175 currentLine = 0; 176 setString (strArray_fs [currentLine]); 177 } 178 179 void xFirstEvent(){ 180 set_display (); 181 now_step = STEP.XFirst; 182 currentLine = 0; 183 setString (strArray_xf [currentLine]); 184 } 185 186 void xSecondEvent(){ 187 set_display (); 188 now_step = STEP.XFirst; 189 currentLine = 0; 190 setString (strArray_xs [currentLine]); 191 } 192 193 void player1FirstEvent(){ 194 set_display (); 195 now_step = STEP.Player1First; 196 currentLine = 0; 197 setString (strArray_pf [currentLine]); 198 } 199 200 void player1SecondEvent(){ 201 set_display (); 202 now_step = STEP.Player1Second; 203 currentLine = 0; 204 setString (strArray_ps [currentLine]); 205 } 206 207 bool IsCompleteDisplayText{ //全ての文字を表示したかどうか. 208 get{ return Time.time > timeElapsed + timeUntilDisplay; } 209 } 210} 211

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

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

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

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

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

guest

回答1

0

ベストアンサー

int displayCharacterCount

を計算している所でマイナスの値が入っているだけだと思いますが、
そもそも計算に使っている値で計算した場合にマイナスにならない保証があるのでしょうか?

単純に if(displayCharacterCount > 0) という条件式を加えてもいい気がしますが。

投稿2017/05/05 15:04

mugicya

総合スコア1046

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

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

退会済みユーザー

退会済みユーザー

2017/05/05 16:06

おそらくcurrentTextの初期値のstringEmptyにより極小の値を取っていると思われると結論づけました。おっしゃる通り、if文で分岐させてしまおうと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問